xuiltul

cron-management

cron.mdの読み書き・更新を正しいフォーマットで行うためのスキル。 cronタスクの追加・変更・削除時に必ずこのスキルの手順に従うこと。 「cron設定」「cronタスク」「スケジュール設定」「定時タスク」「cron.md」 「cron追加」「cron更新」「cron削除」「定期実行」「定時」等の場面で使用。

xuiltul 236 37 Updated 2mo ago
GitHub

Install

npx skillscat add xuiltul/animaworks/cron-management

Install via the SkillsCat registry.

SKILL.md

cron.mdの構造

全体構成

# Cron: {自分の名前}

## タスク名1
schedule: 0 9 * * *
type: llm
タスクの説明文...

## タスク名2
schedule: */5 * * * *
type: command
command: /path/to/script.sh

絶対に守るべきルール

  1. 各タスクは ## タスク名 で始める(H2見出し。H3やH1は使わない)
  2. schedule: 行は必須schedule: というキーワードで始める。### 見出しにしない)
  3. スケジュールは標準5フィールドcron式のみ09:00毎週金曜 17:00 は不可)
  4. type: 行は必須llm または command
  5. タスク間に空行を入れる(可読性のため)

やってはいけない書き方

❌ ### */5 * * * *           ← H3見出しにcron式を書いてはいけない
❌ ### 09:00                 ← 自然言語の時刻表記は不可
❌ ### 毎週金曜 17:00         ← 日本語のスケジュール表記は不可
❌ cron: 0 9 * * *           ← キー名は "schedule:" であること("cron:" ではない)
❌ interval: 5m              ← interval形式は不可
❌ schedule: 0 9 * * * *     ← 6フィールドは不可(5フィールドのみ)

正しい書き方

✅ schedule: 0 9 * * *       ← "schedule:" + 半角スペース + 5フィールドcron式
✅ schedule: */5 * * * *
✅ schedule: 30 21 * * *
✅ schedule: 0 17 * * 5

5フィールドcron式リファレンス

フィールド構成

schedule: 分 時 日 月 曜日
フィールド 位置 範囲 説明
1 0-59 何分に実行するか
2 0-23 何時に実行するか(24時間制)
3 1-31 何日に実行するか
4 1-12 何月に実行するか
曜日 5 0-6 何曜日に実行するか(0=月, 6=日)

注意: 曜日は 0=月曜日, 6=日曜日(APSchedulerの仕様。一般的なcronの0=日曜日とは異なる)

特殊文字

文字 意味
* すべての値 * * * * * = 毎分
*/n n間隔 */5 * * * * = 5分ごと
n-m 範囲 0 9-17 * * * = 9時〜17時の毎正時
n,m リスト 0 9,12,18 * * * = 9時・12時・18時
n-m/s 範囲+間隔 0 9-17/2 * * * = 9時〜17時の2時間ごと

よく使うスケジュール例

毎日系

やりたいこと cron式 解説
毎朝9:00 0 9 * * * 分=0, 時=9
毎朝9:30 30 9 * * * 分=30, 時=9
毎日12:00(正午) 0 12 * * * 分=0, 時=12
毎日18:00 0 18 * * * 分=0, 時=18
毎晩21:30 30 21 * * * 分=30, 時=21
毎日深夜2:00 0 2 * * * 分=0, 時=2

間隔系

やりたいこと cron式 解説
5分ごと */5 * * * * 分=*/5(0,5,10,...,55)
10分ごと */10 * * * * 分=*/10(0,10,20,...,50)
15分ごと */15 * * * * 分=*/15(0,15,30,45)
30分ごと */30 * * * * 分=*/30(0,30)
1時間ごと 0 * * * * 毎時0分
2時間ごと 0 */2 * * * 0時,2時,4時,...,22時の0分
業務時間中のみ5分ごと */5 9-17 * * * 9:00〜17:55の5分間隔
業務時間中のみ1時間ごと 0 9-17 * * * 9:00〜17:00の毎正時

曜日系

やりたいこと cron式 解説
平日の毎朝9:00 0 9 * * 0-4 曜日=0-4(月〜金)
毎週月曜9:00 0 9 * * 0 曜日=0(月)
毎週金曜17:00 0 17 * * 4 曜日=4(金)
毎週金曜18:00 0 18 * * 4 曜日=4(金)
平日の業務時間中30分ごと */30 9-17 * * 0-4 平日9:00〜17:30
週末の毎朝10:00 0 10 * * 5,6 曜日=5,6(土日)

月次系

やりたいこと cron式 解説
毎月1日の9:00 0 9 1 * * 日=1
毎月15日の12:00 0 12 15 * * 日=15
毎月最終営業日近く(28日) 0 17 28 * * 日=28(近似)
四半期初日9:00(1,4,7,10月) 0 9 1 1,4,7,10 * 月=1,4,7,10

タスクタイプ詳細

type: llm — LLM判断タスク

思考・判断が必要なタスク。schedule:type: llm の後に、自由記述でタスク内容を書く。

## 毎朝の業務計画
schedule: 0 9 * * *
type: llm
長期記憶から昨日の進捗を確認し、今日のタスクを計画する。
理念と目標に照らして優先順位を判断する。
結果は state/current_task.md に書き出す。
  • 説明文はそのままLLMへのプロンプトとして渡される
  • 具体的なアウトプット(何を書き出すか)を明記すると効果的
  • 複数行OK

type: command — コマンド実行タスク

決定論的に実行するbashコマンドやツール呼び出し。

パターンA: bashコマンド

## バックアップ実行
schedule: 0 2 * * *
type: command
command: /usr/local/bin/backup.sh
  • command: に実行するコマンドを1行で書く
  • シェルリダイレクト(>, >>, |)は使用可能
  • 複数行のコマンドは非推奨(1行にまとめるか、スクリプトファイルにする)

パターンB: ツール呼び出し

## Slack朝の通知
schedule: 0 9 * * 0-4
type: command
tool: slack_send
args:
  channel: "#general"
  message: "おはようございます!"
  • tool: にツール名(get_tool_schemas() で定義されたスキーマ名)
  • args: 以降はYAMLブロック形式でインデント2スペース
  • dispatch(tool_name, args) 経由で実行される

オプション: skip_pattern

コマンドの標準出力が特定パターンにマッチした場合、cron LLMセッション(フォローアップ分析)をスキップする。

## Chatwork未返信チェック
schedule: */5 * * * *
type: command
command: chatwork_cli.py unreplied --json
skip_pattern: "^\[\]$"
  • skip_pattern: には正規表現を書く
  • 正規表現に [] 等のYAML特殊文字を含む場合は引用符("..." または '...')で囲む。パーサーは外側の引用符を自動除去する
  • 無効な正規表現の場合は警告ログが出て、skip_patternは無視され(cron LLMが実行される)
  • 上の例では、未返信が0件([])の場合にスキップする

オプション: trigger_heartbeat

コマンド出力時にLLM分析セッションをトリガーするかをタスク単位で制御する。

## Chatwork未返信チェック
schedule: */15 * * * *
type: command
command: animaworks-tool chatwork unreplied
skip_pattern: "^\[\]$"
trigger_heartbeat: false
  • trigger_heartbeat: false — コマンド出力があってもcron LLMセッション(フォローアップ分析)をスキップ
  • trigger_heartbeat: true(デフォルト)— コマンド出力があればcron LLMセッションで分析・対応
  • false, no, 0 を指定するとLLM分析抑制。それ以外はtrue扱い
  • skip_pattern と併用可能。trigger_heartbeat: falseskip_pattern より先に評価される
  • LLM分析セッションはheartbeat同等のコンテキスト(記憶・知識・組織情報)を持つ

型の使い分け判断基準

type: command を使うべきケース

  • 実行するコマンドが完全に確定している
  • パラメータが固定(リージョン、クラスタ名、プロファイル等)
  • 結果の判断はcron LLMセッションに任せる

type: llm を使うべきケース

  • 状況に応じて実行内容を変える必要がある
  • 複数のツールを組み合わせた調査が必要
  • 人間的な判断・分析が実行段階で必要

禁止パターン

  • type: llm にコードブロック(確定コマンド)を含める
    → そのコマンドは type: command にすべき
  • 「この通りに実行すること」と書いているのに type: llm
    → LLMはコマンドを正確に再現できない。type: command を使え

Animaは「コマンドを暗記する人」ではない

type: command は人間がスクリプトを保存するのと同じ。
Animaの価値は結果を見て判断する力にある。
確定的な実行はフレームワークに任せ、
Animaには判断・分析・報告に集中させること。


cron.md操作手順

新規タスク追加

  1. 自分の cron.md を読み込む
  2. ファイル末尾に新しいセクションを追加する
  3. 書き込み前にフォーマットを確認する(下記チェックリスト参照)
  4. ファイルを書き込む
## 新しいタスク名
schedule: <5フィールドcron式>
type: llm|command
<説明またはcommand/tool行>

既存タスク変更

  1. cron.md を読み込む
  2. 該当セクション(## タスク名 から次の ## の直前まで)を特定
  3. 変更する行(schedule:, type:, 説明文等)を編集
  4. ファイルを書き込む

タスク削除

  1. cron.md を読み込む
  2. 該当セクション全体(## タスク名 から次の ## の直前まで)を削除
  3. ファイルを書き込む

タスクの一時無効化

HTMLコメントで囲むとパーサーがスキップする:

<!--
## 一時停止中のタスク
schedule: 0 9 * * *
type: llm
このタスクは一時的に停止中。
-->

書き込み前チェックリスト

cron.mdを更新する前に、以下を必ず確認すること:

  • 各タスクが ## タスク名 で始まっているか(#### ではない)
  • schedule: 行があるか(### 見出しや自然言語ではない)
  • スケジュールが5フィールドcron式か(分 時 日 月 曜日
  • 各フィールドの値が有効範囲内か(分: 0-59, 時: 0-23, 日: 1-31, 月: 1-12, 曜日: 0-6)
  • type: 行があるか(llm または command
  • command型の場合、command: または tool: があるか
  • tool型の場合、args: のインデントが正しいか(2スペース)
  • タスク間に空行があるか

バリデーション方法

書き込み後、以下のコマンドで正しくパースされるか確認できる:

# プロジェクトルートで実行。ANIMAWORKS_ANIMA_DIR 未設定時は ~/.animaworks/animas/default を使用
python -c "
from core.schedule_parser import parse_cron_md, parse_schedule
import os
from pathlib import Path

cron_path = Path(os.environ.get('ANIMAWORKS_ANIMA_DIR', '~/.animaworks/animas/default')) / 'cron.md'
content = cron_path.expanduser().read_text()
tasks = parse_cron_md(content)
for t in tasks:
    trigger = parse_schedule(t.schedule)
    status = '✅' if trigger else '❌ パース失敗'
    print(f'{status} {t.name}: schedule=\"{t.schedule}\" type={t.type}')
"

すべてのタスクに ✅ が表示されれば正常。❌ が出た場合はスケジュール式を修正すること。


完全な記述例

# Cron: example_anima

## 毎朝の業務計画
schedule: 0 9 * * *
type: llm
長期記憶から昨日の進捗を確認し、今日のタスクを計画する。
理念と目標に照らして優先順位を判断する。
結果は state/current_task.md に書き出す。

## Chatwork未返信チェック
schedule: */5 9-18 * * 0-4
type: command
command: chatwork-cli unreplied --json > $ANIMAWORKS_ANIMA_DIR/state/chatwork_unreplied.json
skip_pattern: "^\[\]$"
trigger_heartbeat: false

## Slack朝の挨拶
schedule: 0 9 * * 0-4
type: command
tool: slack_send
args:
  channel: "#general"
  message: "おはようございます!今日もよろしくお願いします。"

## 週次振り返り
schedule: 0 17 * * 4
type: llm
今週のepisodes/を読み返し、パターンを抽出してknowledge/に統合する。
改善点があれば procedures/ に手順を追記する。

## 月次レポート
schedule: 0 10 1 * *
type: llm
先月のepisodes/とknowledge/を分析し、月次サマリーレポートを作成する。
レポートは knowledge/monthly_report_YYYY-MM.md として保存する。

よくある間違いと修正

間違い 正しい書き方 原因
### */5 * * * * schedule: */5 * * * * H3見出しはタスク区切りに使えない
### 09:00 schedule: 0 9 * * * 自然言語時刻はパース不能
### 毎週金曜 17:00 schedule: 0 17 * * 4 日本語表記はパース不能
schedule: 9:00 schedule: 0 9 * * * HH:MM形式は5フィールドcron式ではない
schedule: every 5 minutes schedule: */5 * * * * 英語表記はパース不能
schedule: 0 9 * * 7 schedule: 0 9 * * 6 曜日7は範囲外(0-6)
schedule: 0 9 * * SUN schedule: 0 9 * * 6 曜日名は使えない(数字のみ)
schedule: 0 25 * * * schedule: 0 23 * * * 時は0-23の範囲
schedule: 60 * * * * schedule: 0 * * * * 分は0-59の範囲
skip_pattern: ^\[\]$(引用符なし) skip_pattern: "^\[\]$" [] はYAMLで空リストと解釈される。引用符で囲む

注意事項

  • cron.mdの変更は、Animaが write_memory_file で保存した場合は即時反映される。外部編集(直接ファイル編集)の場合は、次回heartbeatまたはcron実行時にmtimeを検出して自動リロードされる
  • タイムゾーンは Asia/Tokyo(JST)固定
  • 同時刻に複数タスクが重なった場合は並列実行される
  • command型のタスクが失敗してもサーバーは停止しない(ログに記録される)
  • LLM型タスクの実行には現在のモデル設定(status.json)が使われる
  • 他のAnimaのtools/ディレクトリにアクセスする場合は、権限を事前に確認すること