日本語 · English(未訳)

Kairos リファレンス実装(プロトタイプ)

English readers: this is the reference implementation of Kairos, a schedule definition language. The language docs are canonical in Japanese with a full English mirror — English spec · recipes · playground. CLI: npx kairos-lang next -n 3 payday.kairos (evaluator messages are Japanese; --json output is language-neutral). Apache-2.0.

スケジュール定義言語 Kairos(../spec/)のリファレンス実装の試作。 目的は仕様の実行可能性の検証——EBNF §5.6 がそのままパーサに、代表例 §7 と 40-examples の実データが そのままテストになるかを確かめ、仕様の穴を実行で炙り出すこと(結果=綻び F43〜F50。 ../design/40-examples/90-findings.md)。

使い方

npm install          # devDependencies(typescript / vitest)のみ
npm test             # spec §7 全代表例・NAOJ 暦要項実データ・静的エラー・reference/ と stdlib/ の doctest
npm run typecheck

# CLI(Node 24+。TS をネイティブ実行。サブコマンド省略時は list・`--help` で使い方)
node src/cli.ts list examples/payday.kairos      --from 2026-01-01 --to 2027-01-01
node src/cli.ts list examples/jp-holidays.kairos --from 2026-01-01 --to 2027-01-01
node src/cli.ts list examples/rokuyo.kairos      --from 2026-01-01 --to 2027-01-01   # 旧暦・六曜(大安など)
node src/cli.ts next -n 3 examples/payday.kairos             # 今日から次の 3 発火
node src/cli.ts next --json examples/payday.kairos           # 機械可読(下記 CliReport)
node src/cli.ts list --ics examples/payday.kairos > payday.ics   # カレンダーアプリに取り込む(1.0 追補 24)
node src/cli.ts list --tsv examples/payday.kairos > payday.tsv   # Excel・PowerShell に渡す表(1.0 追補 27)

CLI サブコマンド

--json(機械可読の報告)

--ics(iCalendar の書き出し)

--json と排他(1.0 追補 24)。結果を iCalendar(RFC 5545)で stdout に書き出す。

--ics-series(1 式=1 つの繰り返し予定)

--tsv(Excel・PowerShell 向けの表)

--json・--ics・--ics-series と排他(1.0 追補 27)。結果を 1 点 1 行のタブ区切りで stdout に書き出す。Excel の利用者・Windows 管理者(PowerShell・VBA)向けの出力の橋。言語は不変。

実走例(examples/payday.kairos・2026 年 1〜3 月):

$ node src/cli.ts list --tsv --from 2026-01-01 --to 2026-04-01 examples/payday.kairos 2>/dev/null
expr	source	uid	date	time	epoch_ms	note
1	everyDay |> within(month) |> nth(25) |> roll(Preceding, on: bizDay)	kairos-4f63ae78d212-series@kairos-lang.org	2026-01-23		1769094000000	
1	everyDay |> within(month) |> nth(25) |> roll(Preceding, on: bizDay)	kairos-4f63ae78d212-series@kairos-lang.org	2026-02-25		1771945200000	
1	everyDay |> within(month) |> nth(25) |> roll(Preceding, on: bizDay)	kairos-4f63ae78d212-series@kairos-lang.org	2026-03-25		1774364400000	

表の外に出た点は note に註釈が付く(祝日表の covering を 2026-07-15 で切った everyDay \ national を --from 2026-07-14 --to 2026-07-18 で list した 7/15 と 7/16 の行):

1	everyDay \ national	kairos-aa6bf733e48d-series@kairos-lang.org	2026-07-15		1784041200000	
1	everyDay \ national	kairos-aa6bf733e48d-series@kairos-lang.org	2026-07-16		1784127600000	範囲外 2026-07-16..2026-07-18(JP.national covering 2026-01-01..2026-07-15)

読み方:

--explain(軽量 explain)

--supply <file.json>(external の解決値)

--lang en

ライブラリとして:

import { run } from './src/index.ts';
const r = run(source, { from: '2026-01-01', to: '2027-01-01' });
r.results[0].dates;   // ['2026-01-23', …]

パッケージとしては kairos-lang(run ほか)に加えて kairos-lang/cli(1.0.7)が CLI のコマンド関数(cmdList/cmdNext/ supplyResolver/errorReport/todayIn)と CliReport の型を公開する——埋め込み用(別パッケージ kairos-lang-mcp が使う)。

設計(仕様との対応)

層 ファイル 対応する仕様
字句 src/lexer.ts §5.5・ADR-28(日付・幅リテラル、市民時/経過時間の混合エラー、Unicode 識別子)
構文 src/parser.ts §5.6 EBNF(前文・束縛・gen-expr・値式の優先順位・テーブルリテラル)
評価 src/eval.ts §3(窓生成語・機構 A・遅延解決)・§4(core 段・射影)・I1〜I8 の一部を実行時検査
標準 premise stdlib/*.kairos(gregorian・fiscal・isoweek を依存順にロード) 各 stdlib ページ §1 の完全定義を Kairos ソースのまま評価器に食わせる(Kyureki はデータ入り premise のため同梱しない=../stdlib/kyureki.md)

方針: 評価器は core 演算子だけを実装し、Gregorian・糖衣・祝日カスケードはすべて Kairos ソースとして 評価する(言語組み込みの魔法にしない=「透明な標準ライブラリ」ADR-25 の検証)。

検証済みの言語機構(ADR 順。各項の詳細は ADR と対応するテストファイル):

プロトタイプの制約(仕様との既知の乖離)

テスト

(38 ファイル・827 本〔doctest 込み〕。下記の個別解説に加え、後発の test/empty-table.test.ts〔ADR-45〕・test/external.test.ts〔ADR-46・35 本〕・ test/cycle-labels.test.ts〔ADR-47〕・test/split-parent.test.ts〔ADR-48〕・ test/take.test.ts/test/takelast.test.ts〔ADR-49/52〕・test/hour-window.test.ts〔ADR-50〕・ test/at-time-of-day.test.ts〔ADR-51〕・test/memoization.test.ts〔ADR-53=遮断・順序独立・ 間接参照 witness 3 経路・診断全文固定〕・test/table-postfix.test.ts〔束縛後置 covering〕・ test/memo-key-order-independence.test.ts〔メモ化の文脈キーと評価順の独立・F114〕・test/member-self-reference.test.ts〔前文メンバーの自己参照・F115〕・ test/premise-member-inheritance.test.ts〔前文メンバーの派生継承・ADR-35 改訂 3〕・test/window-clip.test.ts〔window-clip 警告・追補 22〕・ test/final-window-open-end.test.ts〔覆域端で閉じた最終窓の終端・ADR-37 改訂 6〕・test/next-window-and-playground.test.ts〔next の探索窓と Playground の表示〕・ test/schema-and-explain.test.ts〔JSON Schema 2 本と --explain・追補 23〕・test/boundary-checklist.test.ts〔境界チェックリスト 10 件の witness〕がある。)