cron.mdの読み書き・更新を正しいフォーマットで行うためのスキル。 cronタスクの追加・変更・削除時に必ずこのスキルの手順に従うこと。 「cron設定」「cronタスク」「スケジュール設定」「定時タスク」「cron.md」 「cron追加」「cron更新」「cron削除」「定期実行」「定時」等の場面で使用。
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絶対に守るべきルール
- 各タスクは
## タスク名で始める(H2見出し。H3やH1は使わない) schedule:行は必須(schedule:というキーワードで始める。###見出しにしない)- スケジュールは標準5フィールドcron式のみ(
09:00や毎週金曜 17:00は不可) type:行は必須(llmまたはcommand)- タスク間に空行を入れる(可読性のため)
やってはいけない書き方
❌ ### */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 * * 55フィールド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.shcommand:に実行するコマンドを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: falsetrigger_heartbeat: false— コマンド出力があってもcron LLMセッション(フォローアップ分析)をスキップtrigger_heartbeat: true(デフォルト)— コマンド出力があればcron LLMセッションで分析・対応false,no,0を指定するとLLM分析抑制。それ以外はtrue扱いskip_patternと併用可能。trigger_heartbeat: falseはskip_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操作手順
新規タスク追加
- 自分の
cron.mdを読み込む - ファイル末尾に新しいセクションを追加する
- 書き込み前にフォーマットを確認する(下記チェックリスト参照)
- ファイルを書き込む
## 新しいタスク名
schedule: <5フィールドcron式>
type: llm|command
<説明またはcommand/tool行>既存タスク変更
cron.mdを読み込む- 該当セクション(
## タスク名から次の##の直前まで)を特定 - 変更する行(
schedule:,type:, 説明文等)を編集 - ファイルを書き込む
タスク削除
cron.mdを読み込む- 該当セクション全体(
## タスク名から次の##の直前まで)を削除 - ファイルを書き込む
タスクの一時無効化
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/ディレクトリにアクセスする場合は、権限を事前に確認すること