dsh-metaphysics 0.64.0 → 0.65.0

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/engine/diff.js CHANGED
@@ -355,6 +355,12 @@ export const CALIBER_SWITCHES = {
355
355
  阳武府相: '庚干 阳武府相', 阳武同相: '庚干 阳武同相', 巨阳武昌: '辛干 巨阳武昌',
356
356
  梁紫府武: '壬干 梁紫府武', 梁紫相武: '壬干 梁紫相武', 破巨阳贪: '癸干 破巨阳贪',
357
357
  }),
358
+ ziweiSchoolSwitch('jieluSchool', '截路空亡:照常 / 不排(中州派)', '截路空亡', 'off', 'zhongzhou', {
359
+ off: '照常(截空/副截/旬空/副旬)', zhongzhou: '不排(中州派)',
360
+ }),
361
+ ziweiSchoolSwitch('suipoSchool', '岁前十二神:照常 / 大耗改岁破(中州派)', '岁前十二神', 'off', 'zhongzhou', {
362
+ off: '照常(大耗)', zhongzhou: '大耗改岁破',
363
+ }),
358
364
  ],
359
365
  qimen: [
360
366
  {
package/engine/index.js CHANGED
@@ -79,6 +79,7 @@ const ZIWEI_SCHOOL_KEYS = [
79
79
  'brightnessSchool', 'gengYearSihua', 'tianmaSchool', 'tiankongSchool', 'jiekongSchool',
80
80
  'kuiyueSchool', 'tianshiTianshang', 'changshengSchool', 'lateZishi', 'shenzhuSchool',
81
81
  'mingzhuSchool', 'zuoyaoSchool', 'liunianSihua', 'sihuaVariant',
82
+ 'jieluSchool', 'suipoSchool',
82
83
  ];
83
84
 
84
85
  /** 紫微流派参数原样透传;非法值交给引擎按默认口径回退 */
@@ -213,6 +214,7 @@ function ziweiText(r) {
213
214
  jiekongSchool: '截空', kuiyueSchool: '魁钺', tianshiTianshang: '天伤天使',
214
215
  changshengSchool: '长生', lateZishi: '晚子时', shenzhuSchool: '身主', mingzhuSchool: '命主取法',
215
216
  zuoyaoSchool: '杂曜全表', liunianSihua: '流年四化取干', sihuaVariant: '十干四化变体',
217
+ jieluSchool: '截路空亡', suipoSchool: '岁前十二神',
216
218
  };
217
219
  const diff = Object.entries(labels)
218
220
  .filter(([key]) => r.schools[key] && r.schools[key] !== ZIWEI_SCHOOL_DEFAULTS[key])
package/engine/ziwei.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // 紫微斗数安星:命身宫 → 五行局 → 紫微/天府 → 十四主星 → 诸辅煞杂曜 → 十二宫 → 四化 → 大限小限流年 → 格局
2
- import { STEMS, BRANCHES, ganzhiName, sexagenaryIndex, jdToParts, partsToJd, formatJd } from './calendar.js';
2
+ import { STEMS, BRANCHES, ganzhiName, sexagenaryIndex, jdToParts, partsToJd, formatJd, dayGanzhiIndex } from './calendar.js';
3
3
  import { solarToLunar } from './lunar.js';
4
4
  import { applyTrueSolar } from './bazi.js';
5
5
  import { applyDst } from './dst.js';
@@ -99,6 +99,13 @@ export const ZIWEI_SCHOOL_DEFAULTS = Object.freeze({
99
99
  zuoyaoSchool: 'minimal',
100
100
  liunianSihua: 'year-stem',
101
101
  sihuaVariant: 'default',
102
+ // 中州派成组差异:off 全部用通行本(默认,默认盘逐字节不变);zhongzhou 表示
103
+ // 「跟随 tianshiTianshang 的 zhongzhou 档」—— 那把开关切到中州派时,这一组跟着生效;
104
+ // 单独选 off/zhongzhou 而不动 tianshiTianshang 也可。
105
+ // jieluSchool 截路空亡:zhongzhou 不排(截空、副截、旬空、副旬整组不出)
106
+ // suipoSchool 岁前十二神:zhongzhou 把「大耗」改记作「岁破」(宫位不变,只换名字)
107
+ jieluSchool: 'off',
108
+ suipoSchool: 'off',
102
109
  });
103
110
 
104
111
  export const ZIWEI_SCHOOL_OPTIONS = Object.freeze({
@@ -124,6 +131,11 @@ export const ZIWEI_SCHOOL_OPTIONS = Object.freeze({
124
131
  // 只列与 default 不同的那一档(default 之外全是「换掉某一干」的显式选择)。
125
132
  sihuaVariant: ['default', '廉破曲阳', '贪阴阳机', '阳武同阴', '阳武府同', '阳武府相',
126
133
  '阳武同相', '巨阳武昌', '梁紫府武', '梁紫相武', '破巨阳贪'],
134
+ // 中州派成组差异(两档各自独立,可单独开):
135
+ // jieluSchool off 截路空亡照常 / zhongzhou 整组不排(截空、副截、旬空、副旬都不出)
136
+ // suipoSchool off 岁前十二神照常 / zhongzhou 把「大耗」改记作「岁破」
137
+ jieluSchool: ['off', 'zhongzhou'],
138
+ suipoSchool: ['off', 'zhongzhou'],
127
139
  });
128
140
 
129
141
  export function ziweiSchoolsOf(input = {}) {
@@ -586,7 +598,11 @@ export function buildZiwei(input) {
586
598
  if (schools.tiankongSchool !== 'off') {
587
599
  put(schools.tiankongSchool === 'shun-jia-shi' ? yb + hb : yb + 1, '天空', '杂曜');
588
600
  }
589
- if (schools.jiekongSchool !== 'off') {
601
+ // 截路空亡:zhongzhou(中州派)整组不排——截空、副截、旬空、副旬都不出。
602
+ // 依据《中州派紫微斗数》:截路空亡不入中州派体系;通行本才排。
603
+ // 这一组只影响杂曜清单,不动宫盘、主星、十二宫位置。
604
+ const skipJielu = schools.jieluSchool === 'zhongzhou';
605
+ if (schools.jiekongSchool !== 'off' && !skipJielu) {
590
606
  const jk = JIEKONG[schools.jiekongSchool][yearStem];
591
607
  if (Array.isArray(jk)) {
592
608
  put(jk[0], '截空', '杂曜');
@@ -653,13 +669,17 @@ export function buildZiwei(input) {
653
669
  const csStart = schools.changshengSchool === 'huo-tu' && bureau.number === 5
654
670
  ? 2
655
671
  : CHANGSHENG_START[bureau.number];
672
+ // 岁前十二神:中州派把「大耗」改记作「岁破」(宫位不变,只换名字)。
673
+ const renameDahao = schools.suipoSchool === 'zhongzhou';
656
674
  const shenshaAt = (branch) => {
657
675
  const d = forward ? 1 : -1;
676
+ let suiqi = SUIQI_NAMES[fix(branch - yb)];
677
+ if (renameDahao && suiqi === '大耗') suiqi = '岁破';
658
678
  return {
659
679
  changsheng: CHANGSHENG_NAMES[fix(d * (branch - csStart))],
660
680
  boshi: BOSHI_NAMES[fix(d * (branch - lucun))],
661
681
  jiangqian: JIANGQIAN_NAMES[fix(branch - JIANGXING[triad])],
662
- suiqi: SUIQI_NAMES[fix(branch - yb)],
682
+ suiqi,
663
683
  };
664
684
  };
665
685
 
@@ -696,6 +716,10 @@ export function buildZiwei(input) {
696
716
  });
697
717
  }
698
718
 
719
+ // 来因宫(iztro 口径):生年天干与宫干相同的宫,子丑两宫除外(这两支五虎遁永不排甲己…的生年干)。
720
+ // 之所以叫「来因」:此宫是今生命局展开的起点,主「因何而来」,看一个人的先天因缘与执念方向。
721
+ const laiyin = palaces.find((p) => p.stem === yearStem && p.branch !== '子' && p.branch !== '丑') || null;
722
+
699
723
  // 昌曲专论:与丑未的关系、是否入命三方、吸收面的清杂
700
724
  const changqu = (() => {
701
725
  const set = new Set([wenchang, wenqu]);
@@ -775,7 +799,20 @@ export function buildZiwei(input) {
775
799
  liutuo: BRANCHES[fix(lu - 1)],
776
800
  liukui: BRANCHES[kuiyueTable[gz.stem][0]],
777
801
  liuyue: BRANCHES[kuiyueTable[gz.stem][1]],
802
+ // 流曜补全(流昌曲按流年干、流马按流年支三合、流鸾流喜按流年支、年解按流年支)
803
+ ...(() => {
804
+ const s = horoscopeStarsByBranch(gz, true);
805
+ const out = {};
806
+ for (const [name, br] of Object.entries(s)) {
807
+ if (name === '流禄' || name === '流羊' || name === '流陀' || name === '流魁' || name === '流钺') continue;
808
+ out[name] = br;
809
+ }
810
+ return out;
811
+ })(),
778
812
  mutagen: Object.entries(sihuaTableOf(lnStemOf, schools)).map(([s, k]) => `${s}化${k}`),
813
+ // 流年十二神:岁前/将前随流年支重安(iztro getYearly12 口径)
814
+ lnSuiqi: suiqiByBranch(gz.branch, schools.suipoSchool),
815
+ lnJiangqian: jiangqianByBranch(gz.branch),
779
816
  daxian: dxPalace
780
817
  ? { palace: dxPalace.palace, start: dxPalace.daxian.start, end: dxPalace.daxian.end }
781
818
  : null,
@@ -820,6 +857,30 @@ export function buildZiwei(input) {
820
857
  },
821
858
  hourBranch,
822
859
  yearGanzhi: yearGanzhi.name,
860
+ ...((() => {
861
+ // 非节气四柱(紫微斗数口径,文墨「显示非节气四柱」开关的数据源):
862
+ // 紫微按农历排盘,年柱以正月初一换岁(lunarYear 已是此口径)、月柱按农历月配五虎遁;
863
+ // 日柱、时柱与节气版完全一致(日时不受节气影响)。与八字(节气)四柱只在立春前后的
864
+ // 出生者上年/月两柱有差异,正好给用户对照。
865
+ const yIdx = (((lunarRaw.lunarYear - 4) % 60) + 60) % 60;
866
+ const nYinStem = ((STEMS.indexOf(yearGanzhi.stem) % 5) * 2 + 2) % 10;
867
+ const mBranchIdx = 2 + (lunarMonth - 1) >= 12 ? 2 + (lunarMonth - 1) - 12 : 2 + (lunarMonth - 1); // 正月建寅
868
+ const mStemIdx = (nYinStem + lunarMonth - 1) % 10;
869
+ const nJd = partsToJd({ year, month, day, hour: 12 });
870
+ const dIdx = dayGanzhiIndex(Math.floor(nJd + 0.5));
871
+ const dStemIdx = dIdx % 10;
872
+ const ziStem = ((dStemIdx % 5) * 2) % 10;
873
+ const hIdx = sexagenaryIndex((ziStem + hb) % 10, hb);
874
+ return {
875
+ nonJieqi: {
876
+ year: ganzhiName(yIdx).name,
877
+ month: ganzhiName(sexagenaryIndex(mStemIdx, mBranchIdx)).name,
878
+ day: ganzhiName(dIdx).name,
879
+ hour: ganzhiName(hIdx).name,
880
+ note: '非节气(农历)口径:年以正月初一、月以朔为界;与八字节气四柱仅立春前后出生者有差',
881
+ },
882
+ };
883
+ })()),
823
884
  soul: {
824
885
  palace: '命宫',
825
886
  branch: BRANCHES[soulIndex],
@@ -857,6 +918,8 @@ export function buildZiwei(input) {
857
918
  ziwei: BRANCHES[ziwei],
858
919
  tianfu: BRANCHES[tianfu],
859
920
  changqu,
921
+ // 来因宫:{branch, palace, ganzhi} 或 null(理论上不 null,防御性保留)
922
+ laiyin: laiyin ? { branch: laiyin.branch, palace: laiyin.palace, ganzhi: laiyin.ganzhi } : null,
860
923
  // 杂曜全表的这一层只写「这一盘怎么定宫」:面板、独立页与「复制提问」共用。
861
924
  // 默认(minimal)时 placed 为空,但 skipped 照旧给出,说明为什么少了两颗。
862
925
  zuoyao: {
@@ -888,7 +951,7 @@ export function buildZiwei(input) {
888
951
  rules: {
889
952
  ziweiPlacement: '借数法:局数除日数取商,商数自寅宫顺行,借数奇逆偶顺',
890
953
  mutagen: '生年四化用中州派常用表;庚干可按流派切换(默认阳武阴同,另有同科阴忌、府科、府科相忌、同科相忌)',
891
- schools: `流派开关:亮度 ${schools.brightnessSchool}、庚干四化 ${schools.gengYearSihua}、天马 ${schools.tianmaSchool}、天空 ${schools.tiankongSchool}、截空 ${schools.jiekongSchool}、魁钺 ${schools.kuiyueSchool}、天伤天使 ${schools.tianshiTianshang}、长生 ${schools.changshengSchool}、晚子时 ${schools.lateZishi}、身主 ${schools.shenzhuSchool}(common 子午皆火星 / verse 子铃午火)、命主 ${schools.mingzhuSchool}(soul-branch 按命宫地支 / year-branch 按生年年支)、杂曜 ${schools.zuoyaoSchool}(minimal 49 颗 / full 61 颗)、流年四化取干 ${schools.liunianSihua}(year-stem 按流年天干 / life-palace-stem 按流年命宫宫干)、十干四化 ${schools.sihuaVariant}(default 各干通行表,其余为文墨变体整表替换);庚干四化只作用于生年四化,sihuaVariant 换的是宫干自化、大限宫干、飞星与流年共用的那张表`,
954
+ schools: `流派开关:亮度 ${schools.brightnessSchool}、庚干四化 ${schools.gengYearSihua}、天马 ${schools.tianmaSchool}、天空 ${schools.tiankongSchool}、截空 ${schools.jiekongSchool}、魁钺 ${schools.kuiyueSchool}、天伤天使 ${schools.tianshiTianshang}、长生 ${schools.changshengSchool}、晚子时 ${schools.lateZishi}、身主 ${schools.shenzhuSchool}(common 子午皆火星 / verse 子铃午火)、命主 ${schools.mingzhuSchool}(soul-branch 按命宫地支 / year-branch 按生年年支)、杂曜 ${schools.zuoyaoSchool}(minimal 49 颗 / full 61 颗)、流年四化取干 ${schools.liunianSihua}(year-stem 按流年天干 / life-palace-stem 按流年命宫宫干)、十干四化 ${schools.sihuaVariant}(default 各干通行表,其余为文墨变体整表替换)、截路空亡 ${schools.jieluSchool}(off 照常排 / zhongzhou 整组不排)、岁前十二神 ${schools.suipoSchool}(off 照常 / zhongzhou 大耗改岁破);庚干四化只作用于生年四化,sihuaVariant 换的是宫干自化、大限宫干、飞星与流年共用的那张表`,
892
955
  zuoyao: schools.zuoyaoSchool === 'full'
893
956
  ? `全表十二颗已安:生月 解神、天巫、天月、阴煞;生年干 天官、天福、天厨;生年支 蜚廉、天德、年解;命宫+生年支 天才、身宫+生年支 天寿。蜚廉与博士十二神的飞廉同名异星,年解与月解(解神)分列,天德与岁前十二神的天德同名异宫。`
894
957
  : `本盘按 49 颗的通行简盘安星,未排全表杂曜。开 zuoyaoSchool: "full" 追加十二颗:解神、天巫、天月、阴煞(生月)、天官、天福、天厨(生年干)、蜚廉、天德、年解(生年支)、天才(命宫+生年支)、天寿(身宫+生年支),每颗都带安星诀。`,
@@ -1173,6 +1236,34 @@ export const PATTERN_TONE = {
1173
1236
  刑囚夹印: 'bad', 泛水桃花: 'bad',
1174
1237
  };
1175
1238
 
1239
+ // ── 限流十二神(iztro 口径):随流年干支重安的只有岁前/将前两组 ──
1240
+ // 长生十二神、博士十二神只在本命排盘算一次,horoscope scope 不重算(iztro
1241
+ // FunctionalAstrolabe._getHoroscopeBySolarDate 里 yearlyDecStar=getYearly12(solarDate)
1242
+ // 只重出 suiqian12/jiangqian12,长生与博士留在本命宫位上)。
1243
+ // 岁前:流年支起岁建,顺数 SUIQI_NAMES;将前:寅午戌起午、申子辰起子、巳酉丑起酉、亥卯未起卯。
1244
+ export function suiqiByBranch(branch, suipoSchool) {
1245
+ const b = BRANCHES.indexOf(branch);
1246
+ if (b < 0) return {};
1247
+ const out = {};
1248
+ for (let i = 0; i < 12; i++) {
1249
+ let name = SUIQI_NAMES[i];
1250
+ if (suipoSchool === 'zhongzhou' && name === '大耗') name = '岁破';
1251
+ out[name] = BRANCHES[fix(b + i)];
1252
+ }
1253
+ return out;
1254
+ }
1255
+
1256
+ export function jiangqianByBranch(branch) {
1257
+ const b = BRANCHES.indexOf(branch);
1258
+ if (b < 0) return {};
1259
+ const triad = ['寅午戌', '申子辰', '巳酉丑', '亥卯未'].find((t) => t.includes(branch));
1260
+ if (!triad) return {};
1261
+ const start = JIANGXING[triad];
1262
+ const out = {};
1263
+ for (let i = 0; i < 12; i++) out[JIANGQIAN_NAMES[i]] = BRANCHES[fix(start + i)];
1264
+ return out;
1265
+ }
1266
+
1176
1267
  // ── 大限一览:宫干四化落宫、三方主星 ──────────────────────────
1177
1268
 
1178
1269
  export function daxianList(chart) {
@@ -1195,6 +1286,11 @@ export function daxianList(chart) {
1195
1286
  selfHua: p.selfHua,
1196
1287
  sanfang: p.sanfang,
1197
1288
  mainStars: mainOf(p.sanfang),
1289
+ // 运曜:按大限宫干支安 10 颗(魁钺昌曲禄羊陀马鸾喜),映射 星名→地支
1290
+ yunStars: horoscopeStarsByBranch(p.ganzhi, false),
1291
+ // 限流十二神:随大限宫支重安的岁前/将前两组(长生、博士不随限流变)
1292
+ yunSuiqi: suiqiByBranch(p.branch, chart.schools.suipoSchool),
1293
+ yunJiangqian: jiangqianByBranch(p.branch),
1198
1294
  mutagenHits: Object.entries(sihuaTableOf(p.stem, chart.schools)).map(([star, type]) => {
1199
1295
  const b = starBranchOf(chart, star);
1200
1296
  return { star, type, branch: b >= 0 ? BRANCHES[b] : null, palace: b >= 0 ? chart.palaces.find((x) => x.branch === BRANCHES[b])?.palace ?? null : null };
@@ -1377,7 +1473,61 @@ export function flyComposite(chart, { from = '命宫' } = {}) {
1377
1473
  };
1378
1474
  }
1379
1475
 
1380
- // ── 流年四化落宫 ────────────────────────────────────────────
1476
+ // ── 限流星曜(运曜/流曜)────────────────────────────────────
1477
+ // 口径依据 iztro star/horoscopeStar.ts + star/location.ts(本命同表换干支重算):
1478
+ // · 魁钺、昌曲、禄羊陀 按运限天干;天马按运限地支三合;红鸾天喜按运限地支(卯起逆数)。
1479
+ // · 流年另加「年解」:戌上起子,逆数至流年地支。
1480
+ // 与本命安星的差异只有两点:昌曲在本命按时支(戌起逆数/辰起顺数),限流按天干
1481
+ //(甲昌巳曲酉、乙昌午曲申、丙戊昌申曲午、丁己昌酉曲巳、庚昌亥曲卯、辛昌子曲寅、壬昌寅曲辰、癸昌卯曲巳);
1482
+ // 火铃不随限流重安(iztro 同样只安这 10+1 颗)。
1483
+ const LIU_CHANGQU = {
1484
+ 甲: [5, 9], 乙: [6, 8], 丙: [8, 6], 戊: [8, 6], 丁: [9, 5], 己: [9, 5],
1485
+ 庚: [11, 3], 辛: [0, 2], 壬: [2, 4], 癸: [3, 5],
1486
+ };
1487
+
1488
+ const NIANJIE_OF = { 子: 10, 丑: 9, 寅: 8, 卯: 7, 辰: 6, 巳: 5, 午: 4, 未: 3, 申: 2, 酉: 1, 戌: 0, 亥: 11 };
1489
+
1490
+ /** 前缀:大限叫运X、流年叫流X(iztro 同款命名) */
1491
+ const HS_PREFIX = (yearly) => (yearly ? '流' : '运');
1492
+
1493
+ /** 按一组干支安限流星曜,返回 12 宫(按地支序)各宫的星名数组。yearly=true 时前缀用「流」并加年解。 */
1494
+ export function horoscopeStarsOf(gz, yearly = false) {
1495
+ const stem = gz.stem ?? String(gz).replace(/[子丑寅卯辰巳午未申酉戌亥]$/, '');
1496
+ const branch = gz.branch ?? String(gz).slice(-1);
1497
+ const sb = BRANCHES.indexOf(branch);
1498
+ const pre = HS_PREFIX(yearly);
1499
+ const lu = LUCUN[stem];
1500
+ const [kui, yue] = KUI_YUE[stem];
1501
+ const [chang, qu] = LIU_CHANGQU[stem];
1502
+ const ma = TIANMA[triadOf(sb)];
1503
+ const luang = fix(3 - sb);
1504
+ const byBranch = Array.from({ length: 12 }, () => []);
1505
+ const add = (idx, name) => byBranch[fix(idx)].push(name);
1506
+ add(kui, `${pre}魁`);
1507
+ add(yue, `${pre}钺`);
1508
+ add(chang, `${pre}昌`);
1509
+ add(qu, `${pre}曲`);
1510
+ add(lu, `${pre}禄`);
1511
+ add(lu + 1, `${pre}羊`);
1512
+ add(lu - 1, `${pre}陀`);
1513
+ add(ma, `${pre}马`);
1514
+ add(luang, `${pre}鸾`);
1515
+ add(luang + 6, `${pre}喜`);
1516
+ if (yearly) add(NIANJIE_OF[branch], '年解');
1517
+ return byBranch;
1518
+ }
1519
+
1520
+ /** 把 12 宫的星名数组转成 {星名: 地支}(供 daxianList/liunian 挂字段) */
1521
+ export function horoscopeStarsByBranch(gz, yearly = false) {
1522
+ const byBranch = horoscopeStarsOf(gz, yearly);
1523
+ const out = {};
1524
+ byBranch.forEach((stars, i) => {
1525
+ for (const name of stars) out[name] = BRANCHES[i];
1526
+ });
1527
+ return out;
1528
+ }
1529
+
1530
+
1381
1531
 
1382
1532
  export function enrichLiunian(chart) {
1383
1533
  for (const ln of chart.liunian) {
package/index.js CHANGED
@@ -66,7 +66,7 @@ const OPTION_KEYS = [
66
66
  'leapMonth', 'leapAsNext', 'brightnessSchool', 'gengYearSihua', 'tianmaSchool',
67
67
  'tiankongSchool', 'jiekongSchool', 'kuiyueSchool', 'tianshiTianshang',
68
68
  'changshengSchool', 'lateZishi', 'shenzhuSchool', 'mingzhuSchool', 'zuoyaoSchool', 'liunianSihua',
69
- 'sihuaVariant',
69
+ 'sihuaVariant', 'jieluSchool', 'suipoSchool',
70
70
  'action', 'toAge', 'sitting', 'facing', 'fortuneYear', 'period',
71
71
  'sittingOffset', 'sittingDegree', 'facingOffset', 'facingDegree',
72
72
  'fortuneDate', 'fortuneTime', 'surname', 'givenName', 'limit',
@@ -114,6 +114,8 @@ const OPTION_HINTS = {
114
114
  zuoyaoSchool: '仅 ziwei:杂曜取盘 minimal / full',
115
115
  liunianSihua: '仅 ziwei:流年四化取干 year-stem 按流年天干(默认)/ life-palace-stem 按流年命宫宫干',
116
116
  sihuaVariant: '仅 ziwei:十干四化变体 default 或 廉破曲阳/贪阴阳机/阳武同阴…(整表替换)',
117
+ jieluSchool: '仅 ziwei:截路空亡 off 照常排(默认)/ zhongzhou 整组不排(截空、副截、旬空、副旬都不出)',
118
+ suipoSchool: '仅 ziwei:岁前十二神 off 照常(默认)/ zhongzhou 大耗改岁破(宫位不变只换名字)',
117
119
  action: 'fengshui:natal(默认)/ advise / xuankong 玄空;name:assess / generate',
118
120
  toAge: '仅 trend:算到几岁 10–100,默认 100',
119
121
  sitting: '仅 fengshui advise/xuankong 玄空:坐山(24 山之一)',
@@ -144,7 +146,7 @@ const READ_KEYS = ['withInterpret', 'detail', 'ask', 'question', 'direction', 's
144
146
  /** 每个体系实际会读的参数:help 按这张表展开,避免「有这个键但该体系不看」 */
145
147
  const SYSTEM_PARAMS = {
146
148
  bazi: [...BIRTH_KEYS, 'hourUnknown', 'verifyPast', 'rectify', 'events', 'rectifyHours', 'cross', 'diff', 'trace', ...READ_KEYS],
147
- ziwei: [...BIRTH_KEYS, 'leapMonth', 'leapAsNext', 'brightnessSchool', 'gengYearSihua', 'tianmaSchool', 'tiankongSchool', 'jiekongSchool', 'kuiyueSchool', 'tianshiTianshang', 'changshengSchool', 'lateZishi', 'shenzhuSchool', 'mingzhuSchool', 'zuoyaoSchool', 'liunianSihua', 'sihuaVariant', 'cross', 'diff', 'trace', ...READ_KEYS],
149
+ ziwei: [...BIRTH_KEYS, 'leapMonth', 'leapAsNext', 'brightnessSchool', 'gengYearSihua', 'tianmaSchool', 'tiankongSchool', 'jiekongSchool', 'kuiyueSchool', 'tianshiTianshang', 'changshengSchool', 'lateZishi', 'shenzhuSchool', 'mingzhuSchool', 'zuoyaoSchool', 'liunianSihua', 'sihuaVariant', 'jieluSchool', 'suipoSchool', 'cross', 'diff', 'trace', ...READ_KEYS],
148
150
  liuyao: ['datetime', 'lines', 'seed', 'trace', ...READ_KEYS],
149
151
  tarot: ['count', 'seed', ...READ_KEYS],
150
152
  meihua: ['datetime', 'mode', 'upper', 'lower', 'changing', ...READ_KEYS],
@@ -851,6 +853,16 @@ export function apply(ctx) {
851
853
  '阳武同相', '巨阳武昌', '梁紫府武', '梁紫相武', '破巨阳贪'],
852
854
  description: '紫微斗数:十干四化变体,整表替换生年、宫干自化、大限宫干、飞星与流年所查的那张表。default(默认)各干取通行表;其余取值按文墨天机「十干四化」原文四字命名,依禄权科忌顺序念,如 廉破曲阳 = 廉贞禄破军权文曲科太阳忌。可选:廉破曲阳(甲)、贪阴阳机(戊)、阳武同阴/阳武府同/阳武府相/阳武同相(庚)、巨阳武昌(辛)、梁紫府武/梁紫相武(壬)、破巨阳贪(癸);乙丙丁己四干无变体。变体天干与所查该干不符时不生效,不会串表。与庚干那一项重叠时以本参数为准。',
853
855
  },
856
+ jieluSchool: {
857
+ type: 'string',
858
+ enum: ['off', 'zhongzhou'],
859
+ description: '紫微斗数:截路空亡(截空、副截、旬空、副旬这一组杂曜)取舍。off(默认,通行本)照常排;zhongzhou(中州派)整组不排——《中州派紫微斗数》体系不收截路空亡。只影响杂曜清单,不动宫盘与主星。需 jiekongSchool 非 off 才能看到差别。',
860
+ },
861
+ suipoSchool: {
862
+ type: 'string',
863
+ enum: ['off', 'zhongzhou'],
864
+ description: '紫微斗数:岁前十二神的记名口径。off(默认,通行本)照常;zhongzhou(中州派)把「大耗」改记作「岁破」,宫位不变、只换名字。依据《中州派紫微斗数》岁前十二神以岁破代大耗。',
865
+ },
854
866
  action: {
855
867
  type: 'string',
856
868
  enum: ['natal', 'advise', 'xuankong', 'assess', 'generate'],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-metaphysics",
3
- "version": "0.64.0",
3
+ "version": "0.65.0",
4
4
  "type": "module",
5
5
  "description": "命理排盘(玄学 xuanxue)for DeepSeek Harness: nineteen systems and eleven quick references (almanac, solar–lunar conversion, …), with climate adjustment (tiaohou), the 120 Qiongtong Baojian entries, 1,062-char name library with per-character pinyin, Kangxi stroke counts, five-grid (五格/三才) analysis and mechanical phonetics checks, a 78-card tarot library on the Rider-Waite-Smith base (per-card English name, image description, core meaning and astrological correspondence, cross-checked against three published sources; court cards carry no zodiac by design and the chart says so), classical quotes (Ziping Zhenquan / Di Tian Sui / San Ming Tong Hui), hexagram body relations (六冲/六合/伏吟/反吟/化进神/化退神) plus yongshen placement (用神落位) with month/day strength (月建日辰旺衰) and whole-hexagram per-line strength (全卦逐爻旺衰) and response-time clues (应期线索:逢值/逢冲/逢合 + 月建五态快慢) for liuyao, plus an MBTI-style 16-type questionnaire and exact dayun handover dates (交运日) with annual suiyun hints (岁运并临/伏吟反吟), palace conditions (击刑/入墓), month states (旺相休囚死) and stem–palace relations (天盘干与宫生克) for qimen, flying four-transformations with chained flights (四化飞星串连), three-way-four-corner composite flights (三方四正复合飞化), switchable leap-month policy (闰月按日切分/整月归次月/整月归本月) eleven school switches (亮度/庚干四化/天马/天空/截空旬空/魁钺/天伤天使/长生/晚子时/身主/杂曜全表) for ziwei, the last one opting in to a 61-star minor-star (杂曜) table where each of the twelve extra stars carries its placement verse and the palace it landed in (verses accepted only when at least two independent published editions give the same table, homonymous stars never merged), caliber diffs for bazi/ziwei/qimen (same inputs, one switch, root-field changes), shadow-chart IDs (same normalized params → same ID; version bumps auto-diff chart fields), step-by-step deduction traces (liuyao najia→liuqin→shiying→fushen→strength; bazi strength score and pattern/yongshen; ziwei pattern conditions), and a bundled offline single-file page (命理排盘.html), a panel-to-chat handoff that asks the Harness about a finished chart, per-tab lazy engine chunks so the first-screen client bundle stays under 100KB gzip, and a public verification report (128 classical hexagram cases, 312 Zi Wei charts × 34 patterns, 12 dayun handover cases) generated from the same source that gates CI.",
6
6
  "keywords": [