dsh-metaphysics 0.61.1 → 0.61.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-metaphysics",
3
- "version": "0.61.1",
3
+ "version": "0.61.2",
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": [
@@ -362,7 +362,7 @@ h3::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--li
362
362
  <div class="wrap">
363
363
  <header>
364
364
  <div class="brand-row">
365
- <div class="brand"><span class="seal" aria-hidden="true">命</span><span class="brand-txt">命理排盘<span class="ver">v0.61.1</span><small>八字 · 紫微 · 六爻 · 梅花 · 六壬 · 奇门 · 合盘 · 塔罗 全部在本机计算</small></span></div>
365
+ <div class="brand"><span class="seal" aria-hidden="true">命</span><span class="brand-txt">命理排盘<span class="ver">v0.61.2</span><small>八字 · 紫微 · 六爻 · 梅花 · 六壬 · 奇门 · 合盘 · 塔罗 全部在本机计算</small></span></div>
366
366
  <div class="view-switch">
367
367
  <span class="hint">熟练了可以换回平铺</span>
368
368
  <span class="seg" role="group" aria-label="首屏样式">
@@ -653,7 +653,7 @@ h3::after{content:"";flex:1;height:1px;background:linear-gradient(90deg,var(--li
653
653
  <h3>对拍:把典籍当期望值</h3>
654
654
  <ul><li>六爻:京房八宫卦序与世应,64 卦全表;旬空六旬表</li><li>六壬:日干寄宫、中气换将;紫微:纳音定五行局、紫微天府相照</li><li>卦例:《增删卜易》9 条 +《卜筮正宗》128 条(93 成对 + 35 静卦),核本变卦 / 动爻数 / 卦宫 / 缺爻 / 旬空</li><li>奇门:20 个时辰 × 9 宫,核四柱 / 局数 / 值符 / 值使 / 星门神 / 天盘干</li></ul>
655
655
  <h3>工程验证</h3>
656
- <ul><li>测试:154 个测试文件 / 7598 条断言;七道闸(回归 · 断言基线 · 测试可失败自检 · HTML 注入面 · 工程约定 · 产物宿主形态 · 随机扫射)</li><li>可复现:seed / asOf 显式;同一输入同一输出</li><li>口径:晚子时、真太阳时、奇门三流派、闰月归月都可切换,并有字段级差异对照</li></ul>
656
+ <ul><li>测试:154 个测试文件 / 7637 条断言;七道闸(回归 · 断言基线 · 测试可失败自检 · HTML 注入面 · 工程约定 · 产物宿主形态 · 随机扫射)</li><li>可复现:seed / asOf 显式;同一输入同一输出</li><li>口径:晚子时、真太阳时、奇门三流派、闰月归月都可切换,并有字段级差异对照</li></ul>
657
657
 
658
658
  <h3>已知边界(不猜)</h3>
659
659
  <ul><li>六爻应期(具体哪天应验)不做;卦例只录动爻个数,不录爻位</li><li>财富/健康只给结构判断与档位,不给金额区间、不作诊断</li><li>紫微飞星已做「单一支化逐宫追到成环」与「三方四正 16 条按落宫归堆」,但都未叠大限流年四化、不折吉凶;八字交运日已能算到日/时,但未与第三方排盘案例批量对拍</li></ul>
@@ -26320,7 +26320,7 @@ return { interpret, DIRECTIONS, DIRECTION_DEFAULT, BRIGHTNESS, flowOf, geocodeAd
26320
26320
  })();
26321
26321
 
26322
26322
  window.Engine = __mods.index;
26323
- window.__MP_VER = "0.61.1";
26323
+ window.__MP_VER = "0.61.2";
26324
26324
  </script>
26325
26325
  <script>
26326
26326
  // 两个 UI 共用的表单规则:宿主面板(src/app.js)与独立页(src/web-ui.js)。
@@ -29805,6 +29805,9 @@ window.__MP_VER = "0.61.1";
29805
29805
  hourUnknown: hu,
29806
29806
  gender: String(src.gender || ''),
29807
29807
  address: String(src.address || ''),
29808
+ // 两个开关也换一张盘:不随档案存,载入时就会跟着表单此刻的勾选排
29809
+ trueSolar: src.trueSolar !== false,
29810
+ lateZi: src.lateZi !== false,
29808
29811
  pinned: false,
29809
29812
  createdAt: Date.now(),
29810
29813
  lastUsedAt: 0,
@@ -30464,10 +30467,16 @@ document.head.appendChild(Object.assign(document.createElement('style'), { textC
30464
30467
  const puts = [['date', p.date], ['time', p.hourUnknown ? '' : p.time], ['gender', p.gender], ['addr', p.address]];
30465
30468
  for (const pair of puts) {
30466
30469
  const node = el(pair[0]);
30467
- if (node && pair[1]) node.value = pair[1];
30470
+ // 空出生地也要写回去:留着上一个地址,这张盘的真太阳时就会按别人的地方算
30471
+ if (node) node.value = pair[1] || '';
30468
30472
  }
30469
30473
  const hu = el('hourunknown');
30470
30474
  if (hu) hu.checked = !!p.hourUnknown;
30475
+ // 旧档案没存开关:按默认(都开)处理,别沿用表单此刻的勾选
30476
+ const tsBox = el('ts');
30477
+ if (tsBox) tsBox.checked = p.trueSolar !== false;
30478
+ const lzBox = el('latezi');
30479
+ if (lzBox) lzBox.checked = p.lateZi !== false;
30471
30480
  // 把这次回填当成「用户填的」:否则切走再切回出生类体系时会被上一次的自动值顶掉
30472
30481
  onManualEdit();
30473
30482
  run();
@@ -30480,9 +30489,14 @@ document.head.appendChild(Object.assign(document.createElement('style'), { textC
30480
30489
  const hu = el('hourunknown');
30481
30490
  const box = el('profwrap');
30482
30491
  const nameEl = box ? box.querySelector('.mp-prof-name') : null;
30492
+ const tsBox = el('ts');
30493
+ const lzBox = el('latezi');
30483
30494
  return PP.profFromForm({
30484
30495
  kind: tab, date: v('date'), time: v('time'), gender: v('gender'), address: v('addr'),
30485
30496
  hourUnknown: !!(hu && hu.checked),
30497
+ // 两个开关决定时柱:随档案存下来,载入才能回到当初那张盘
30498
+ trueSolar: !(tsBox && !tsBox.checked),
30499
+ lateZi: !(lzBox && !lzBox.checked),
30486
30500
  }, nameEl ? nameEl.value : '', profEditing || undefined);
30487
30501
  }
30488
30502
 
@@ -30513,7 +30527,8 @@ document.head.appendChild(Object.assign(document.createElement('style'), { textC
30513
30527
  const puts = [['date', p.date], ['time', p.hourUnknown ? '' : p.time], ['gender', p.gender], ['addr', p.address]];
30514
30528
  for (const pair of puts) {
30515
30529
  const node = el(pair[0]);
30516
- if (node && pair[1]) node.value = pair[1];
30530
+ // 同上:这张档案没存地址就把框清空,别让「更新」把别人的地址存进来
30531
+ if (node) node.value = pair[1] || '';
30517
30532
  }
30518
30533
  const hu = el('hourunknown');
30519
30534
  if (hu) hu.checked = !!p.hourUnknown;
@@ -30665,9 +30680,10 @@ document.head.appendChild(Object.assign(document.createElement('style'), { textC
30665
30680
  fillDateTime(manual[k] || defaultFor(k));
30666
30681
  }
30667
30682
 
30668
- /** 当前 tab 是否真的用到日期/时刻(梅花「数字起卦」不用) */
30683
+ /** 当前 tab 是否真的用到日期/时刻(塔罗、人格不看时间;梅花「数字起卦」也不用)
30684
+ * 与 syncMhMode 里的显隐共用这一处判断:字段既然藏起来了,run() 就不能拿它拦人。 */
30669
30685
  function usesTimeInput() {
30670
- return !(tab === 'meihua' && mhMode === 'number');
30686
+ return tab !== 'tarot' && tab !== 'mbti' && !(tab === 'meihua' && mhMode === 'number');
30671
30687
  }
30672
30688
 
30673
30689
  /** 用户手动改了日期或时刻 */
@@ -30954,11 +30970,11 @@ document.head.appendChild(Object.assign(document.createElement('style'), { textC
30954
30970
  day: Number(last.date.slice(8, 10)),
30955
30971
  minute: Number(last.time.slice(3, 5)) || 0,
30956
30972
  },
30957
- gender: el('gender').value,
30973
+ gender: last.gender,
30958
30974
  events,
30959
- lateZi: el('latezi') ? el('latezi').checked : true,
30960
- trueSolar: el('ts') ? el('ts').checked : true,
30961
- address: el('addr') && el('addr').value.trim() ? el('addr').value.trim() : undefined,
30975
+ lateZi: last.lateZi !== false,
30976
+ trueSolar: last.trueSolar !== false,
30977
+ address: last.address || undefined,
30962
30978
  }) : { error: '当前页面未加载生时校正模块' };
30963
30979
  } catch (e) { rectOut = { error: e && e.message ? e.message : String(e) }; }
30964
30980
  const out = el('rectout');
@@ -31062,7 +31078,8 @@ document.head.appendChild(Object.assign(document.createElement('style'), { textC
31062
31078
  // 推导链只覆盖六爻 / 八字 / 紫微
31063
31079
  args.trace = tab === 'liuyao' || tab === 'bazi' || tab === 'ziwei' || tab === 'qimen' || tab === 'daliuren';
31064
31080
  if (tab !== 'tarot') args.datetime = `${date}T${time}`;
31065
- if (tab === 'bazi' || tab === 'ziwei' || tab === 'hepan') {
31081
+ // 人生K线也是出生盘:出生地决定真太阳时,落进时柱后会改变整条运程
31082
+ if (tab === 'bazi' || tab === 'ziwei' || tab === 'hepan' || tab === 'trend') {
31066
31083
  // 合盘主方同样要性别与出生地:引擎里合盘的性别是必填,地址决定真太阳时
31067
31084
  args.gender = el('gender').value;
31068
31085
  if (hourUnknown) args.hourUnknown = true;
@@ -31144,8 +31161,9 @@ document.head.appendChild(Object.assign(document.createElement('style'), { textC
31144
31161
  args.num3 = Number(el('num3').value) || undefined;
31145
31162
  } else {
31146
31163
  args.date = date;
31147
- const hh = Number(String(time).split(':')[0]);
31148
- args.hour = Number.isFinite(hh) ? hh : 12;
31164
+ // Number('') 是 0:时刻框被清空时不能悄悄按子时起课,退回正午
31165
+ const hm = /^(\d{1,2}):/.exec(String(time));
31166
+ args.hour = hm ? Number(hm[1]) : 12;
31149
31167
  }
31150
31168
  }
31151
31169
  if (tab === 'convert') {
@@ -31164,7 +31182,8 @@ document.head.appendChild(Object.assign(document.createElement('style'), { textC
31164
31182
  if (nums.length) args.answers = nums;
31165
31183
  }
31166
31184
  if (tab === 'trend' && hourUnknown) args.hourUnknown = true;
31167
- if (tab === 'trend') { args.gender = el('gender').value; args.toAge = Number(el('toage').value) || 60; args.trueSolar = el('ts').checked; args.lateZi = el('latezi') ? el('latezi').checked : true; }
31185
+ // 性别 / 出生地 / 两个开关已在上面的出生盘分支里给齐,这里只补 K 线自己的参数
31186
+ if (tab === 'trend') args.toAge = Number(el('toage').value) || 60;
31168
31187
  if (tab === 'fengshui') {
31169
31188
  args.action = fsMode;
31170
31189
  if (fsMode === 'natal') { args.gender = el('gender').value; }
@@ -31250,7 +31269,16 @@ document.head.appendChild(Object.assign(document.createElement('style'), { textC
31250
31269
  : tab === 'mbti' ? window.__PP.mbtiHTML(r)
31251
31270
  : tab === 'fengshui' ? window.__PP.fengshuiHTML(r)
31252
31271
  : window.__PP.quickHTML(r));
31253
- last = { r, html, tab, date, time, timed, trend, caliber, shadowDiff };
31272
+ // 新盘就是新的一轮:上一次的自评、贴合度、候选时辰不能跟着贴到这张盘上
31273
+ // (它们只在模块里存着,重绘不会自己清)。
31274
+ pastMarks = {}; pastFit = null; rectOut = null;
31275
+ // 生时校正要按「这张盘自己的输入」反推:档案/表单在排完之后还能改,
31276
+ // 只读 last.date 而性别、出生地读表单,候选时辰就会贴到另一张盘上
31277
+ last = { r, html, tab, date, time, timed, trend, caliber, shadowDiff,
31278
+ gender: args.gender || el('gender').value,
31279
+ address: typeof args.address === 'string' ? args.address : '',
31280
+ trueSolar: typeof args.trueSolar === 'boolean' ? args.trueSolar : true,
31281
+ lateZi: typeof args.lateZi === 'boolean' ? args.lateZi : true };
31254
31282
  const paintStart = mpNow();
31255
31283
  paint();
31256
31284
  // 渲染=组 HTML + 写入 DOM 的同步时间;浏览器真正绘制在下一帧,这里不假装量到
@@ -31373,7 +31401,7 @@ document.head.appendChild(Object.assign(document.createElement('style'), { textC
31373
31401
  const mhNum = tab === 'meihua' && mhMode === 'number';
31374
31402
  el('mh-num').style.display = mhNum ? '' : 'none';
31375
31403
  // 梅花「数字起卦」不参与时间计算,日期/时刻在此模式下隐藏,避免误导;人格问卷同样与日期无关
31376
- const showDT = tab !== 'tarot' && tab !== 'mbti' && !mhNum;
31404
+ const showDT = usesTimeInput();
31377
31405
  el('for-date').style.display = showDT ? '' : 'none';
31378
31406
  // 「时辰未知」只对八字与人生K线开放:紫微/合盘没有时支就没有盘,不提供这个勾选
31379
31407
  const canUnknown = tab === 'bazi' || tab === 'trend';