kairos-lang 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +15 -7
- package/dist/eval.d.ts +2 -0
- package/dist/eval.js +14 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -29,7 +29,8 @@ node src/cli.ts next --json examples/payday.kairos # 機械可読(
|
|
|
29
29
|
### CLI サブコマンド
|
|
30
30
|
|
|
31
31
|
- **`list [--from] [--to] [--tz] [--json] <file>`** — 範囲 `[from, to)` の全発火・区間註釈・
|
|
32
|
-
|
|
32
|
+
被覆サマリ。既定は**機械の tz**(`Intl` の解決値・`--tz` で上書き)の今日から 1 年。ラベルと `[from, to)` の
|
|
33
|
+
端点はこの tz で読む——定義の premise tz と違うと日粒度の点は時刻付き(例 NY の 0 時=JST 13:00)で印字される(1.0.1)。
|
|
33
34
|
- **`next [-n 件数] [--from] [--horizon 年数] [--tz] [--json] <file>`** — `from`(既定=今日)以降の
|
|
34
35
|
次の N 発火(既定 1)。探索窓を 1 年から倍々に広げ(上限 `--horizon` 年・既定 10)、見つかったら
|
|
35
36
|
**[from, 最終発火日の翌日) で確定再評価**——区間註釈・残走路が答えの範囲と整合する。
|
|
@@ -187,7 +188,7 @@ baseAlign・再実行の外側フレーム再記録〕)。
|
|
|
187
188
|
|
|
188
189
|
## テスト
|
|
189
190
|
|
|
190
|
-
(
|
|
191
|
+
(29 ファイル・657 本〔doctest 込み〕。下記の個別解説に加え、後発の
|
|
191
192
|
`test/empty-table.test.ts`〔ADR-45〕・`test/external.test.ts`〔ADR-46・35 本〕・
|
|
192
193
|
`test/cycle-labels.test.ts`〔ADR-47〕・`test/split-parent.test.ts`〔ADR-48〕・
|
|
193
194
|
`test/take.test.ts`/`test/takelast.test.ts`〔ADR-49/52〕・`test/hour-window.test.ts`〔ADR-50〕・
|
package/dist/cli.d.ts
CHANGED
|
@@ -20,6 +20,10 @@ export interface CliReport {
|
|
|
20
20
|
coverage: CoverageEntry[];
|
|
21
21
|
warnings: string[];
|
|
22
22
|
}
|
|
23
|
+
/** 機械(実行環境)の tz=Intl の解決値。CLI の既定 tz はこれ(1.0.1——1.0.0 は Asia/Tokyo 固定で、非 JST の環境では
|
|
24
|
+
* 日粒度の点が時刻付きで印字され [from, to) の窓が日をまたいだ)。時計読みと同じく CLI 境界だけで読む——
|
|
25
|
+
* ライブラリ側(run / cmdList / cmdNext の既定)は Asia/Tokyo のままで、評価は不変に決定的 */
|
|
26
|
+
export declare function hostTz(): string;
|
|
23
27
|
/** 実行 tz の今日(市民日付)。時計読みは CLI 境界のみ——言語・評価は不変に決定的 */
|
|
24
28
|
export declare function todayIn(tz: string): string;
|
|
25
29
|
interface CmdOpts {
|
package/dist/cli.js
CHANGED
|
@@ -13,6 +13,12 @@ import { fileURLToPath } from 'node:url';
|
|
|
13
13
|
import { run, formatAnnotation, KairosError, SupplyError } from "./index.js";
|
|
14
14
|
// 実装版(JSON 出力の版規律)。SEA 束ね時は build 側でリテラルへ差し替え(index.ts の stdlib と同型)
|
|
15
15
|
const VERSION = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
|
|
16
|
+
/** 機械(実行環境)の tz=Intl の解決値。CLI の既定 tz はこれ(1.0.1——1.0.0 は Asia/Tokyo 固定で、非 JST の環境では
|
|
17
|
+
* 日粒度の点が時刻付きで印字され [from, to) の窓が日をまたいだ)。時計読みと同じく CLI 境界だけで読む——
|
|
18
|
+
* ライブラリ側(run / cmdList / cmdNext の既定)は Asia/Tokyo のままで、評価は不変に決定的 */
|
|
19
|
+
export function hostTz() {
|
|
20
|
+
return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';
|
|
21
|
+
}
|
|
16
22
|
/** 実行 tz の今日(市民日付)。時計読みは CLI 境界のみ——言語・評価は不変に決定的 */
|
|
17
23
|
export function todayIn(tz) {
|
|
18
24
|
return new Intl.DateTimeFormat('en-CA', { timeZone: tz, year: 'numeric', month: '2-digit', day: '2-digit' }).format(new Date());
|
|
@@ -176,19 +182,22 @@ export function renderHuman(rep, lang = 'ja') {
|
|
|
176
182
|
}
|
|
177
183
|
const USAGE_JA = `使い方(kairos = node src/cli.ts):
|
|
178
184
|
kairos list [--from YYYY-MM-DD] [--to YYYY-MM-DD] [--tz Zone] [--supply data.json] [--json] [--lang en] <file.kairos>
|
|
179
|
-
範囲 [from, to) の全発火・区間註釈・被覆サマリ(既定:
|
|
185
|
+
範囲 [from, to) の全発火・区間註釈・被覆サマリ(既定: 機械の tz の今日から 1 年)
|
|
180
186
|
kairos next [-n 件数] [--from YYYY-MM-DD] [--horizon 年数] [--tz Zone] [--supply data.json] [--json] [--lang en] <file.kairos>
|
|
181
187
|
from 以降の次の N 発火(既定: n=1・from=今日・地平線 10 年。本体式 1 つのファイル向け)
|
|
188
|
+
--tz: ラベルと [from, to) の端点の tz(既定=機械の tz。定義の premise tz と違うと日粒度の点は時刻付きで印字される)
|
|
182
189
|
--supply: external の解決値を静的束で渡す——{束縛名: {dates|instants, covering, asof [, labels]}}
|
|
183
190
|
--lang en: 定型出力の枠組みを英語表示(エラー・註釈文は日本語が正のまま・--json は言語中立)
|
|
184
191
|
サブコマンド省略時は list・--version で実装版。終了コード: 0=成功・1=エラー・2=next が地平線内に要求件数未達`;
|
|
185
192
|
const USAGE_EN = `Usage (kairos = node src/cli.ts):
|
|
186
193
|
kairos list [--from YYYY-MM-DD] [--to YYYY-MM-DD] [--tz Zone] [--supply data.json] [--json] [--lang en] <file.kairos>
|
|
187
194
|
All firings in [from, to) plus interval annotations and the coverage summary
|
|
188
|
-
(default: one year from today in the
|
|
195
|
+
(default: one year from today in the machine's time zone)
|
|
189
196
|
kairos next [-n count] [--from YYYY-MM-DD] [--horizon years] [--tz Zone] [--supply data.json] [--json] [--lang en] <file.kairos>
|
|
190
197
|
The next N firings at or after from (default: n=1, from=today, horizon 10 years;
|
|
191
198
|
intended for files with a single body expression)
|
|
199
|
+
--tz: zone for labels and the [from, to) endpoints (default: the machine's time zone; if it differs from
|
|
200
|
+
the definition's premise tz, day-granular points are printed with a time of day)
|
|
192
201
|
--supply: static bundle resolving external() — {binding: {dates|instants, covering, asof [, labels]}}
|
|
193
202
|
--lang en: English framing for the human-readable output. Evaluator messages (errors and
|
|
194
203
|
annotation texts) stay in Japanese — the implementation's canonical output language;
|
|
@@ -244,8 +253,8 @@ export function main(argv) {
|
|
|
244
253
|
if (positionals.length !== 1)
|
|
245
254
|
throw new KairosError('ファイルを 1 つ指定する');
|
|
246
255
|
const source = readFileSync(positionals[0], 'utf8');
|
|
247
|
-
const tz = values.tz;
|
|
248
|
-
const from = values.from ?? todayIn(tz
|
|
256
|
+
const tz = values.tz ?? hostTz(); // 既定=機械の tz(--tz で上書き)
|
|
257
|
+
const from = values.from ?? todayIn(tz);
|
|
249
258
|
const supplyPath = values.supply;
|
|
250
259
|
let resolve;
|
|
251
260
|
if (supplyPath) {
|
|
@@ -262,13 +271,12 @@ export function main(argv) {
|
|
|
262
271
|
let rep;
|
|
263
272
|
if (cmd === 'list') {
|
|
264
273
|
const to = values.to ?? addYears(from, 1);
|
|
265
|
-
rep = cmdList(source, { from, to,
|
|
274
|
+
rep = cmdList(source, { from, to, tz, ...(resolve ? { resolve } : {}) });
|
|
266
275
|
}
|
|
267
276
|
else {
|
|
268
277
|
const n = posInt(values.n ?? '1', '-n');
|
|
269
278
|
const horizonYears = posInt(values.horizon ?? '10', '--horizon');
|
|
270
|
-
rep = cmdNext(source, { from, n, horizonYears, ...(
|
|
271
|
-
...(resolve ? { resolve } : {}) });
|
|
279
|
+
rep = cmdNext(source, { from, n, horizonYears, tz, ...(resolve ? { resolve } : {}) });
|
|
272
280
|
}
|
|
273
281
|
if (values.json)
|
|
274
282
|
console.log(JSON.stringify(rep, null, 2));
|
package/dist/eval.d.ts
CHANGED
|
@@ -410,6 +410,8 @@ export declare class Evaluator {
|
|
|
410
410
|
applyStage(stream: StreamV, stage: Stage, env: Env): StreamV;
|
|
411
411
|
/** 糖衣右辺の変換適用: 基底 B(s => s |> …)とポイントフリー略記 A の両方(§4.8) */
|
|
412
412
|
private applyTransform;
|
|
413
|
+
/** 前文メンバー roll:(spec §3.3=ロール規約の畳み込み・1.0.2 で実装): 規約の位置引数が無いときの既定 */
|
|
414
|
+
private rollMember;
|
|
413
415
|
private axisMember;
|
|
414
416
|
toStream(v: V, name?: string): StreamV;
|
|
415
417
|
/** snapTo/within の対象窓の要素グリッド(ADR-36 判断 2 の「要素グリッド」)。
|
package/dist/eval.js
CHANGED
|
@@ -524,6 +524,12 @@ export class Evaluator {
|
|
|
524
524
|
absorb(st.block);
|
|
525
525
|
if (st.expr) {
|
|
526
526
|
base = this.rt.premises.get(st.expr.base) ?? this.err(`未定義の premise: ${st.expr.base}`);
|
|
527
|
+
// 1.0.2: 前文メンバー(calendar:/tz:/axis:/wkst:/roll:/source:/epoch:)は基底連鎖から継承し、ブロックの宣言が
|
|
528
|
+
// 上書きする(ADR-35 改訂 3=還流 2026-09-23 定期便 §3)。公開語の内側(evalDef の overlayMembers=判断 8)と
|
|
529
|
+
// 同じ集合を入口の本体層にも見せる——source: も同様(判断 5「nonWorking を上書きする派生は source: も上書き」は
|
|
530
|
+
// 宣言必須「寄り」で未執行=従来どおり)。
|
|
531
|
+
for (const [k, v] of this.overlayMembers(new Map(), base))
|
|
532
|
+
members.set(k, v);
|
|
527
533
|
if (st.expr.withBlock)
|
|
528
534
|
absorb(st.expr.withBlock);
|
|
529
535
|
for (const stage of st.expr.stages) {
|
|
@@ -2667,7 +2673,7 @@ export class Evaluator {
|
|
|
2667
2673
|
return this.filterByPredicate(stream, p => this.bool(this.applyValue(pred, [{ k: 'point', ms: p }], env)));
|
|
2668
2674
|
}
|
|
2669
2675
|
case 'roll': {
|
|
2670
|
-
const conv = this.sym(this.evalExpr(positional[0] ?? this.
|
|
2676
|
+
const conv = this.sym(this.evalExpr(positional[0] ?? this.rollMember(env), env));
|
|
2671
2677
|
const axisS = this.toStream(this.evalAxis(named('on') ?? this.axisMember(env, 'roll'), env));
|
|
2672
2678
|
this.checkAlign(stream.align, axisS.align, 'roll(on:)');
|
|
2673
2679
|
const axis = axisS.pts;
|
|
@@ -3067,6 +3073,13 @@ export class Evaluator {
|
|
|
3067
3073
|
}
|
|
3068
3074
|
this.err('糖衣の右辺を変換として適用できない(生成子を含む糖衣は生成子位置で使う)');
|
|
3069
3075
|
}
|
|
3076
|
+
/** 前文メンバー roll:(spec §3.3=ロール規約の畳み込み・1.0.2 で実装): 規約の位置引数が無いときの既定 */
|
|
3077
|
+
rollMember(env) {
|
|
3078
|
+
const m = env.members.get('roll');
|
|
3079
|
+
if (!m)
|
|
3080
|
+
this.err('roll は規約が必要(I3)——位置引数で Following/Preceding を書くか前文で roll: を宣言');
|
|
3081
|
+
return typeof m === 'string' ? { t: 'name', name: m } : m;
|
|
3082
|
+
}
|
|
3070
3083
|
axisMember(env, op) {
|
|
3071
3084
|
const m = env.members.get('axis');
|
|
3072
3085
|
if (!m)
|