From 76db14cf1013f5fd0569fd791979ab4526841e28 Mon Sep 17 00:00:00 2001 From: Akira Date: Sat, 21 Feb 2026 16:14:07 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20Windmill=E9=80=9A=E7=9F=A5=E3=83=AF?= =?UTF-8?q?=E3=83=BC=E3=82=AF=E3=83=95=E3=83=AD=E3=83=BC=20=E3=83=9E?= =?UTF-8?q?=E3=82=B9=E3=82=BF=E3=83=BC=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1?= =?UTF-8?q?=E3=83=B3=E3=83=88=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- ...¿ãƒ¼ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ_Windmill通知ワークフロー編.md | 458 ++++++++++++++++++ 1 file changed, 458 insertions(+) create mode 100644 docs/shiraou/20_マスタードキュメント_Windmill通知ワークフロー編.md diff --git a/docs/shiraou/20_マスタードキュメント_Windmill通知ワークフロー編.md b/docs/shiraou/20_マスタードキュメント_Windmill通知ワークフロー編.md new file mode 100644 index 0000000..5ece1e3 --- /dev/null +++ b/docs/shiraou/20_マスタードキュメント_Windmill通知ワークフロー編.md @@ -0,0 +1,458 @@ +# マスタードキュメント - Windmill通知ワークフロー編 + +> **最終更新**: 2026-02-21 +> **対象システム**: windmill.keinafarm.net(ワークスペース: admins) +> **目的**: ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã ã‘ã§Windmill通知ワークフローã®å…¨å®¹ã‚’把æ¡ã§ãã‚‹ã“㨠+ +--- + +## 目次 + +1. [機能概è¦](#1-機能概è¦) +2. [フロー設計](#2-フロー設計) +3. [変更履歴å–å¾—API仕様](#3-変更履歴å–å¾—api仕様) +4. [LINE通知仕様](#4-line通知仕様) +5. [Windmill設定仕様](#5-windmill設定仕様) +6. [状態管ç†ä»•様](#6-状態管ç†ä»•様) +7. [設計判断ã¨åˆ¶ç´„](#7-設計判断ã¨åˆ¶ç´„) +8. [é‹ç”¨æ‰‹é †](#8-é‹ç”¨æ‰‹é †) +9. [ソースファイル索引](#9-ソースファイル索引) +10. [更新履歴](#更新履歴) + +--- + +## 1. æ©Ÿèƒ½æ¦‚è¦ + +### 目的 + +`shiraou.keinafarm.net`(白皇集è½å–¶è¾²çµ„åˆ çµ±åˆã‚·ã‚¹ãƒ†ãƒ ï¼‰ã§ç™ºç”Ÿã—ãŸäºˆç´„・実績ã®å¤‰æ›´ã‚’ã€LINE Messaging API 経由ã§ç®¡ç†è€…ã«é€šçŸ¥ã™ã‚‹ã€‚ + +### ユーザーフロー + +``` +çµ±åˆã‚·ã‚¹ãƒ†ãƒ ä¸Šã§äºˆç´„・実績ã®å¤‰æ›´ãŒç™ºç”Ÿ + └→ Windmill ãŒ5分毎ã«ãƒãƒ¼ãƒªãƒ³ã‚° + └→ 変更ãŒã‚れã°LINEã«ãƒ—ッシュ通知 + └→ 管ç†è€…ãŒLINEã§å¤‰æ›´å†…å®¹ã‚’ç¢ºèª +``` + +### 通知ã•れるæ“作一覧 + +| 区分 | æ“作 | 説明 | +|------|------|------| +| 予約 | `create` | 予約ãŒä½œæˆã•れ㟠| +| 予約 | `update` | äºˆç´„ã®æ—¥æ™‚・機械ãŒå¤‰æ›´ã•れ㟠| +| 予約 | `cancel` | 予約ãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れ㟠| +| 実績 | `create` | 実績ãŒç™»éŒ²ã•れ㟠| +| 実績 | `update` | 実績ãŒä¿®æ­£ã•れ㟠| +| 実績 | `delete` | 実績ãŒå‰Šé™¤ã•れ㟠| + +--- + +## 2. フロー設計 + +### Windmillフロー情報 + +| é …ç›® | 値 | +|------|-----| +| パス | `f/shiraou/shiraou_notification` | +| æ¦‚è¦ | 白皇集è½å–¶è¾² 変更通知 | +| ステップ数 | 1(å˜ä¸€Pythonスクリプト) | +| スケジュール | `0 */5 * * * *`(5分毎ã€JST) | +| スケジュールパス | `f/shiraou/shiraou_notification_every_5min` | + +### 実行フロー(擬似コード) + +```python +# Step 1: シークレット・å‰å›žå®Ÿè¡Œæ™‚刻をå–å¾— +api_key = get_variable("u/admin/NOTIFICATION_API_KEY") +line_token = get_variable("u/admin/LINE_CHANNEL_ACCESS_TOKEN") +line_to = get_variable("u/admin/LINE_TO") +last_checked = get_variable("u/admin/SHIRAOU_LAST_CHECKED_AT") # 空ãªã‚‰åˆå›ž + +since = last_checked or (now() - 10分) + +# Step 2: 変更履歴をå–å¾— +response = GET "https://shiraou.keinafarm.net/reservations/api/changes/?since={since}" + headers: { "X-API-Key": api_key } + +# Step 3: 変更ãŒã‚れã°LINE通知 +if response.reservations or response.usages: + message = format_message(response) + POST "https://api.line.me/v2/bot/message/push" + body: { "to": line_to, "messages": [{"type": "text", "text": message}] } + +# Step 4: å‰å›žå®Ÿè¡Œæ™‚刻を更新(正常完了時ã®ã¿ï¼‰ +set_variable("u/admin/SHIRAOU_LAST_CHECKED_AT", response.checked_at) +``` + +### ã‚¨ãƒ©ãƒ¼æ™‚ã®æŒ™å‹• + +- API呼ã³å‡ºã—失敗ã€LINEé€ä¿¡å¤±æ•—ã®ã„ãšã‚Œã§ã‚‚例外ãŒç™ºç”Ÿ +- 例外ãŒç™ºç”Ÿã—ãŸå ´åˆã€`SHIRAOU_LAST_CHECKED_AT` ã¯æ›´æ–°ã•れãªã„ +- 次回実行時ã«åŒã˜ `since` ã§å†è©¦è¡Œã•れる(変更ã®å–りæ¼ã‚Œé˜²æ­¢ï¼‰ + +--- + +## 3. 変更履歴å–å¾—API仕様 + +### エンドãƒã‚¤ãƒ³ãƒˆ + +``` +GET https://shiraou.keinafarm.net/reservations/api/changes/ +``` + +### èªè¨¼ + +``` +X-API-Key: +``` + +APIキーãŒä¸æ­£ãªå ´åˆã¯ `401 Unauthorized` ãŒè¿”る。 + +### クエリパラメータ + +| パラメータ | åž‹ | å¿…é ˆ | 説明 | +|-----------|-----|------|------| +| `since` | ISO8601文字列 | å¿…é ˆ | ã“ã®æ—¥æ™‚以é™ã®å¤‰æ›´ã‚’å–å¾—ã™ã‚‹ | + +**`since` ã®å½¢å¼ä¾‹**: +- `2026-02-21T10:00:00+09:00`(タイムゾーン付ãã€æŽ¨å¥¨ï¼‰ +- `2026-02-21T10:00:00`(ナイーブã€JSTã¨ã—ã¦æ‰±ã‚れる) + +### レスãƒãƒ³ã‚¹ï¼ˆ200 OK) + +```json +{ + "checked_at": "2026-02-21T12:00:00+09:00", + "since": "2026-02-21T10:00:00+09:00", + "reservations": [ + { + "operation": "create", + "reservation_id": 123, + "user_name": "田中太郎", + "machine_name": "トラクター", + "start_at": "2026-02-25T09:00:00+09:00", + "end_at": "2026-02-25T12:00:00+09:00", + "operated_at": "2026-02-21T11:30:00+09:00", + "operator_name": "田中太郎", + "reason": "" + } + ], + "usages": [ + { + "operation": "update", + "usage_id": 456, + "user_name": "山田次郎", + "machine_name": "コンãƒã‚¤ãƒ³", + "amount": 4.0, + "unit": "時間", + "start_at": "2026-02-20T08:00:00+09:00", + "end_at": "2026-02-20T12:00:00+09:00", + "operated_at": "2026-02-21T11:55:00+09:00", + "operator_name": "管ç†è€…A", + "reason": "記録ミスã®ãŸã‚修正" + } + ] +} +``` + +### 変更ãªã—時ã®ãƒ¬ã‚¹ãƒãƒ³ã‚¹ + +```json +{ + "checked_at": "2026-02-21T12:05:00+09:00", + "since": "2026-02-21T12:00:00+09:00", + "reservations": [], + "usages": [] +} +``` + +### エラーレスãƒãƒ³ã‚¹ + +| ステータス | 原因 | +|-----------|------| +| `401 Unauthorized` | APIキーãŒä¸æ­£ã¾ãŸã¯æœªè¨­å®š | +| `400 Bad Request` | `since` ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ãŒæ¬ è½ã¾ãŸã¯ä¸æ­£ãªæ—¥æ™‚å½¢å¼ | + +--- + +## 4. LINE通知仕様 + +### 使用API + +LINE Messaging API - Push Message + +``` +POST https://api.line.me/v2/bot/message/push +Authorization: Bearer +Content-Type: application/json +``` + +### リクエストボディ + +```json +{ + "to": "", + "messages": [ + { + "type": "text", + "text": "<フォーマット済ã¿ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸>" + } + ] +} +``` + +### メッセージフォーマット + +``` +📋 営農システム 変更通知 + +🟢 äºˆç´„ä½œæˆ + 機械: トラクター + 利用者: 田中太郎 + 日時: 2026-02-25 09:00 〜 2026-02-25 12:00 + +🔴 予約キャンセル + 機械: ç”°æ¤æ©Ÿ + 利用者: ä½è—¤èŠ±å­ + 日時: 2026-02-22 08:00 〜 2026-02-22 17:00 + +🔵 実績修正 + 機械: コンãƒã‚¤ãƒ³ + 利用者: 山田次郎 + 利用é‡: 4.0時間 + æ—¥: 2026-02-20 + ç†ç”±: 記録ミスã®ãŸã‚修正 +``` + +### アイコンè¦å‰‡ + +| アイコン | æ„味 | +|---------|------| +| 🟢 | 作æˆï¼ˆcreate / äºˆç´„ä½œæˆ / 実績登録) | +| 🔵 | 変更(update / 予約変更 / 実績修正) | +| 🔴 | 削除・キャンセル(cancel / delete) | + +### 通知先ã®ç¨®åˆ¥ + +`LINE_TO` ã«ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼IDã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—IDを設定ã™ã‚‹ã€‚ + +| 種別 | IDå½¢å¼ | +|------|-------| +| ユーザー | `U` ã§å§‹ã¾ã‚‹æ–‡å­—列 | +| グループ | `C` ã§å§‹ã¾ã‚‹æ–‡å­—列 | + +--- + +## 5. Windmill設定仕様 + +### Windmill Variables(シークレット) + +以下ã®å¤‰æ•°ã‚’ Windmill UI(Variables ページ)ã§ä½œæˆãƒ»ç®¡ç†ã™ã‚‹ã€‚ + +| 変数パス | Secret | 説明 | å–å¾—å…ƒ | +|---------|--------|------|-------| +| `u/admin/NOTIFICATION_API_KEY` | ✅ | shiraou.keinafarm.net ã®APIキー | Djangoサーãƒãƒ¼å´ `NOTIFICATION_API_KEY` 環境変数ã¨åŒä¸€å€¤ | +| `u/admin/LINE_CHANNEL_ACCESS_TOKEN` | ✅ | LINE Messaging API ãƒãƒ£ãƒãƒ«ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³ | LINE Developers Console | +| `u/admin/LINE_TO` | ✅ | 通知先ã®LINEユーザーIDã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ID | LINE webhook / profile API | +| `u/admin/SHIRAOU_LAST_CHECKED_AT` | ⌠| å‰å›žç¢ºèªæ™‚刻(ワークフローãŒè‡ªå‹•更新) | ワークフローãŒè‡ªå‹•管ç†ï¼ˆåˆæœŸå€¤: 空文字) | + +### Djangoå´ã®è¨­å®šï¼ˆshiraou.keinafarm.net) + +`docker-compose.yml` ã«ä»¥ä¸‹ã®ç’°å¢ƒå¤‰æ•°ã‚’追加: + +```yaml +environment: + - NOTIFICATION_API_KEY= +``` + +APIキー生æˆã‚³ãƒžãƒ³ãƒ‰: +```bash +openssl rand -hex 32 +``` + +--- + +## 6. 状態管ç†ä»•様 + +### 状態変数: `SHIRAOU_LAST_CHECKED_AT` + +| é …ç›® | 内容 | +|------|------| +| æ ¼ç´å ´æ‰€ | Windmill Variable `u/admin/SHIRAOU_LAST_CHECKED_AT` | +| åž‹ | ISO8601文字列(例: `2026-02-21T15:30:00+09:00`) | +| åˆæœŸå€¤ | 空文字(åˆå›žå®Ÿè¡Œæ™‚㯠`ç¾åœ¨æ™‚刻 - 10分` を使用) | +| 更新タイミング | フロー正常完了時ã®ã¿ã€APIレスãƒãƒ³ã‚¹ã® `checked_at` ã‚’ä¿å­˜ | +| å‚照タイミング | フロー実行開始時ã€`since` パラメータã¨ã—ã¦ä½¿ç”¨ | + +### é‡è¤‡é€šçŸ¥é˜²æ­¢ã®ä»•組㿠+ +``` +実行1: since=T0, checked_at=T1 → LAST_CHECKED_AT = T1 +実行2: since=T1, checked_at=T2 → T1以é™ã®å¤‰æ›´ã®ã¿å–å¾— +``` + +- `since` ã« `checked_at`(APIãŒç¢ºèªã—ãŸæ™‚刻)を使ã†ã“ã¨ã§ã€å¤‰æ›´ã®å–りã“ã¼ã—ãŒç™ºç”Ÿã—ãªã„ +- `since`ï¼ˆãƒªã‚¯ã‚¨ã‚¹ãƒˆã«æ¸¡ã—ãŸæ™‚刻)ã§ã¯ãªã `checked_at`(サーãƒãƒ¼ãŒç¢ºèªã—ãŸæ™‚刻)をä¿å­˜ã™ã‚‹ã®ãŒãƒã‚¤ãƒ³ãƒˆ + +### 旧実装ã¨ã®é•ã„(トラブルシュート記録) + +| | 旧実装 | ç¾å®Ÿè£… | +|---|--------|--------| +| 状態ä¿å­˜æ–¹æ³• | `wmill.get_state()` / `set_state()` | `wmill.get_variable()` / `set_variable()` | +| å•題 | フローã®ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ã‚¯ãƒªãƒ—トã§ã¯å®Ÿè¡Œã‚’ã¾ãŸã„ã§ä¿å­˜ã•れãªã„ | - | +| 症状 | 毎回 `since = ç¾åœ¨ - 10分` ã«ãªã‚Šã€æ¯Žå›žé€šçŸ¥ãŒé£›ã¶ | 正常動作 | + +--- + +## 7. 設計判断ã¨åˆ¶ç´„ + +### 絶対ã«å¤‰ãˆã¦ã¯ã„ã‘ãªã„制約 + +1. **`SHIRAOU_LAST_CHECKED_AT` ã«ã¯ `checked_at` ã‚’ä¿å­˜ã™ã‚‹ã“ã¨**(`since` ã‚’ä¿å­˜ã—ãªã„) + - `checked_at`: APIサーãƒãƒ¼ãŒã€Œã“ã®æ™‚刻ã¾ã§ç¢ºèªã—ãŸã€ã¨ã„ã†ä¿è¨¼ä»˜ãã®æ™‚刻 + - åŒã˜å¤‰æ›´ãŒ2度通知ã•れるã“ã¨ã‚’防ã + +2. **çŠ¶æ…‹æ›´æ–°ã¯æ­£å¸¸å®Œäº†å¾Œã®ã¿è¡Œã†ã“ã¨** + - API呼ã³å‡ºã—失敗・LINEé€ä¿¡å¤±æ•—時㯠`SHIRAOU_LAST_CHECKED_AT` ã‚’æ›´æ–°ã—ãªã„ + - 次回実行ã§åŒã˜ç¯„囲をå†å–å¾—ã—ã€é€šçŸ¥ã®å–りæ¼ã‚Œã‚’防ã + +3. **`wmill.get_state()` ã¯ä½¿ç”¨ã—ãªã„ã“ã¨** + - Windmillã®ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³ãƒ•ロースクリプトã§ã¯å®Ÿè¡Œã‚’ã¾ãŸã„ã§ä¿å­˜ã•れãªã„ + - 状態管ç†ã¯å¿…ãš Windmill Variable を使ã†ã“㨠+ +### 設計判断 + +| 判断 | ç†ç”± | +|------|------| +| å˜ä¸€ã‚¹ãƒ†ãƒƒãƒ—フロー | 状態管ç†ã‚’1ã‹æ‰€ã«é›†ç´„ã™ã‚‹ãŸã‚。`get_state()`/`set_state()` ã®ã‚¹ã‚³ãƒ¼ãƒ—å•é¡Œã‚’å›žé¿ | +| SSL検証スキップ | shiraou.keinafarm.net ãŒè‡ªå·±ç½²å証明書ã®å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ | +| タイムアウト 30ç§’ | 農業用途ã§å¤šå°‘ã®å¿œç­”é…延を許容ã—ã¤ã¤ã€ç„¡é™å¾…機を防ã | +| 5分ãƒãƒ¼ãƒªãƒ³ã‚°é–“éš” | 農業機械ã®äºˆç´„用途ã§ã¯æ•°åˆ†ã®é…å»¶ã¯è¨±å®¹ç¯„囲。リアルタイムä¸è¦ | + +--- + +## 8. é‹ç”¨æ‰‹é † + +### フローを手動実行 + +```bash +curl -sk -X POST \ + -H "Authorization: Bearer qLJ3VPZ61kTDiIwaUPUu1dXszGrsN1Dh" \ + -H "Content-Type: application/json" \ + -d '{}' \ + "https://windmill.keinafarm.net/api/w/admins/jobs/run/f/f/shiraou/shiraou_notification" +``` + +### 動作確èªï¼ˆcurlã§ç›´æŽ¥API呼ã³å‡ºã—) + +```bash +# 変更ãªã—ç¢ºèª +curl -H "X-API-Key: <キー>" \ + "https://shiraou.keinafarm.net/reservations/api/changes/?since=2026-02-21T11:59:00%2B09:00" + +# 広ã„範囲ã§å¤‰æ›´å–å¾—ï¼ˆåˆæœŸç¢ºèªç”¨ï¼‰ +curl -H "X-API-Key: <キー>" \ + "https://shiraou.keinafarm.net/reservations/api/changes/?since=2026-01-01T00:00:00" +``` + +### ãƒ•ãƒ­ãƒ¼ã®æ›´æ–°ãƒ‡ãƒ—ロイ手順 + +```bash +cd /path/to/windmill_workflow + +# 1. flows/shiraou_notification.flow.json を編集 + +# 2. 既存フローを削除ã—ã¦å†ä½œæˆï¼ˆPUTã¯405ã®ãŸã‚) +curl -sk -X DELETE \ + -H "Authorization: Bearer qLJ3VPZ61kTDiIwaUPUu1dXszGrsN1Dh" \ + "https://windmill.keinafarm.net/api/w/admins/flows/delete/f/shiraou/shiraou_notification" + +curl -sk -X POST \ + -H "Authorization: Bearer qLJ3VPZ61kTDiIwaUPUu1dXszGrsN1Dh" \ + -H "Content-Type: application/json" \ + -d @flows/shiraou_notification.flow.json \ + "https://windmill.keinafarm.net/api/w/admins/flows/create" + +# 3. スケジュールã¯å†ä½œæˆä¸è¦ï¼ˆãƒ•ローã®å‰Šé™¤ãƒ»å†ä½œæˆã§ã‚‚ç¶­æŒã•れる) +``` + +### APIキーローテーション手順 + +1. Djangoサーãƒãƒ¼å´ã§æ–°ã—ã„キーを生æˆ: `openssl rand -hex 32` +2. `docker-compose.yml` ã® `NOTIFICATION_API_KEY` ã‚’æ›´æ–°ã—ã¦ãƒ‡ãƒ—ロイ +3. Windmill UI ã§ `u/admin/NOTIFICATION_API_KEY` ã®å€¤ã‚’åŒã˜æ–°ã—ã„ã‚­ãƒ¼ã«æ›´æ–° +4. フローを手動実行ã—ã¦å‹•ä½œç¢ºèª + +### éŽåŽ»ã®ã‚¸ãƒ§ãƒ–çµæžœç¢ºèª + +```bash +curl -sk -H "Authorization: Bearer qLJ3VPZ61kTDiIwaUPUu1dXszGrsN1Dh" \ + "https://windmill.keinafarm.net/api/w/admins/jobs/list?per_page=10&script_path_exact=f/shiraou/shiraou_notification&is_flow=true" +``` + +--- + +## 9. ソースファイル索引 + +### フロー定義 + +| ファイル | 説明 | +|---------|------| +| [flows/shiraou_notification.flow.json](../../flows/shiraou_notification.flow.json) | フロー本体。å˜ä¸€Pythonステップã§ãƒãƒ¼ãƒªãƒ³ã‚°ãƒ»é€šçŸ¥ãƒ»çŠ¶æ…‹æ›´æ–°ã‚’å®Ÿè¡Œ | + +**フロー構造**: +```json +{ + "path": "f/shiraou/shiraou_notification", + "value": { + "modules": [ + { + "id": "a", + "value": { + "type": "rawscript", + "language": "python3", + "content": "..." + } + } + ] + } +} +``` + +### ヘルパースクリプト + +| ファイル | 説明 | +|---------|------| +| [wm-api.sh](../../wm-api.sh) | Windmill REST APIæ“作ヘルパー。フロー作æˆãƒ»ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ç®¡ç†ã«ä½¿ç”¨ | + +**主è¦ã‚³ãƒžãƒ³ãƒ‰**: +``` +create-flow JSONファイルã‹ã‚‰ãƒ•ãƒ­ãƒ¼ã‚’ä½œæˆ +create-schedule JSONファイルã‹ã‚‰ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’ä½œæˆ +flows フロー一覧å–å¾— +schedules スケジュール一覧å–å¾— +``` + +### ドキュメント + +| ファイル | 説明 | +|---------|------| +| [docs/shiraou/19_windmill_通知ワークフロー連æºä»•様.md](19_windmill_通知ワークフロー連æºä»•様.md) | 仕様書。API仕様・メッセージフォーマットã®åŽŸå…¸ | +| [docs/shiraou/20_マスタードキュメント_Windmill通知ワークフロー編.md](20_マスタードキュメント_Windmill通知ワークフロー編.md) | 本ドキュメント | + +### エージェントワークフロー + +| ファイル | 説明 | +|---------|------| +| [.agent/workflows/windmill-push.md](../../.agent/workflows/windmill-push.md) | Windmillã¸ã®push手順。wmill CLIã®åˆ¶é™ã¨API代替ã®çµŒç·¯ã‚’記録 | +| [.agent/workflows/windmill-new-script.md](../../.agent/workflows/windmill-new-script.md) | æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ãƒˆä½œæˆæ‰‹é † | + +--- + +## 更新履歴 + +| 日付 | 変更内容 | +|------|---------| +| 2026-02-21 | åˆç‰ˆä½œæˆã€‚フロー登録・スケジュール設定・状態管ç†ãƒã‚°ä¿®æ­£ã‚’å«ã‚€ |