chore: harden release checks and sync capability docs
This commit is contained in:
+1
-1
@@ -8,7 +8,7 @@ Parashara传承中的Jaimini子系统
|
||||
- Chara Karaka: 7/8个功能指示星(按度数排序)
|
||||
- Arudha Pada: A1-A12 + Upapada(UL),复用 dashaflow/jaimini-tropical 的 MIT 算法
|
||||
- Karakamsha: AK在Navamsa中的上升(灵魂方向)
|
||||
- Chara Dasha: 当前为简化 timing 实现,v6.0.9 后标注为 partial,不得单独作为高置信度应期依据
|
||||
- Chara Dasha: KN Rao benchmark overall 95.83%,作为 covered timing 模块使用;事件应期仍需多系统确认
|
||||
- Special Lagnas: HL/GL/VL 简化计算(出生时间敏感,作为辅助)
|
||||
|
||||
MIT复用来源:
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
印度占星 API 服务器 v1.0
|
||||
为 jyotish-app 前端提供 v6.7.3 引擎的精算能力
|
||||
为 jyotish-app 前端提供 v6.9.14 引擎的精算能力
|
||||
|
||||
启动: python3 scripts/jyotish_api_server.py --port 5200
|
||||
"""
|
||||
@@ -52,7 +52,7 @@ class JyotishAPIHandler(BaseHTTPRequestHandler):
|
||||
def do_GET(self):
|
||||
path = urlparse(self.path).path
|
||||
if path == '/api/health':
|
||||
self._json({'status': 'ok', 'version': '6.7.3', 'modules': 'KP/Synastry/Prashna/Remedies/PMC/SadeSati'})
|
||||
self._json({'status': 'ok', 'version': '6.9.14', 'modules': 'KP/Synastry/Prashna/Remedies/PMC/SadeSati'})
|
||||
elif path == '/api/cities':
|
||||
self._json(list(CITY_DB.keys()))
|
||||
else:
|
||||
@@ -119,13 +119,13 @@ class JyotishAPIHandler(BaseHTTPRequestHandler):
|
||||
|
||||
for pid, pname in planet_names_rev.items():
|
||||
if pid == 20:
|
||||
lon_rahu, _ = swe.calc_ut(jd, 10)
|
||||
lon = (lon_rahu[0] + 180) % 360
|
||||
rahu_result, _ = swe.calc_ut(jd, 10)
|
||||
planet_lon = (rahu_result[0] + 180) % 360
|
||||
else:
|
||||
result, _ = swe.calc_ut(jd, pid)
|
||||
lon = result[0] % 360
|
||||
sign_idx = int(lon / 30) % 12
|
||||
planets_data[pname] = {'lon': lon, 'sign_idx': sign_idx, 'sign': SIGNS[sign_idx], 'degree': lon % 30}
|
||||
planet_lon = result[0] % 360
|
||||
sign_idx = int(planet_lon / 30) % 12
|
||||
planets_data[pname] = {'lon': planet_lon, 'sign_idx': sign_idx, 'sign': SIGNS[sign_idx], 'degree': planet_lon % 30}
|
||||
|
||||
# Ascendant
|
||||
asc_lon = swe.houses_ex(jd, lat, lon, b'E')[0][0] % 360
|
||||
@@ -174,7 +174,7 @@ class JyotishAPIHandler(BaseHTTPRequestHandler):
|
||||
dashas = get_available_dashas()
|
||||
dasha_list = [{'key': k, 'name': DASHA_REGISTRY[k]['name'], 'years': DASHA_REGISTRY[k]['years'], 'type': DASHA_REGISTRY[k]['type']} for k in dashas]
|
||||
|
||||
# Shadbala (v6.7.4: jyotishganit MIT算法)
|
||||
# Shadbala (v6.9.14: covered with external absolute-calibration cap)
|
||||
try:
|
||||
from shadbala import calc_shadbala
|
||||
sb = calc_shadbala(planets_data, asc_sign, hour+minute/60.0,
|
||||
@@ -195,7 +195,8 @@ class JyotishAPIHandler(BaseHTTPRequestHandler):
|
||||
except Exception as e:
|
||||
import logging
|
||||
logging.warning(f"[api_server] yoga expansion detection failed: {e}")
|
||||
'success': True, 'version': '6.7.4',
|
||||
return {
|
||||
'success': True, 'version': '6.9.14',
|
||||
'birth': {'date': f'{year}-{month:02d}-{day:02d}', 'time': f'{int(hour):02d}:{int(minute):02d}'},
|
||||
'ascendant': {'sign': asc_sign, 'sign_idx': asc_sign_idx, 'degree': round(asc_lon % 30, 2)},
|
||||
'planets': planets_data, 'houses': houses, 'shadbala': shadbala_summary,
|
||||
@@ -239,7 +240,7 @@ class JyotishAPIHandler(BaseHTTPRequestHandler):
|
||||
houses[h] = {'sign': SIGNS[s], 'sign_idx': s}
|
||||
|
||||
return {
|
||||
'success': True, 'version': '6.7.3-fallback',
|
||||
'success': True, 'version': '6.9.14-fallback',
|
||||
'warning': 'Swiss Ephemeris未安装,使用简化计算',
|
||||
'ascendant': {'sign': asc_sign, 'sign_idx': asc_sign_idx},
|
||||
'planets': planets, 'houses': houses,
|
||||
@@ -315,7 +316,7 @@ class JyotishAPIHandler(BaseHTTPRequestHandler):
|
||||
|
||||
def start_server(port=5200):
|
||||
server = HTTPServer(('0.0.0.0', port), JyotishAPIHandler)
|
||||
print(f'🔮 Jyotish API v6.7.3 running on http://localhost:{port}')
|
||||
print(f'🔮 Jyotish API v6.9.14 running on http://localhost:{port}')
|
||||
print(f' POST /api/chart — 完整星盘计算')
|
||||
print(f' POST /api/remedies — 补救建议')
|
||||
print(f' POST /api/kp — KP分析')
|
||||
|
||||
+10
-10
@@ -12,7 +12,7 @@
|
||||
varga 分盘计算(D9/D10)
|
||||
varga-full BPHS十六分盘完整计算(D2-D60)(v3.7新增)
|
||||
aspects 度数精确相位系统(v3.7新增)
|
||||
jaimini Jaimini系统(Chara Karaka/Karakamsha;Chara Dasha timing partial)(v3.7新增)
|
||||
jaimini Jaimini系统(Chara Karaka/Karakamsha;Chara Dasha timing covered)(v3.7新增)
|
||||
nakshatra-adv 高级Nakshatra分析(Tara Bala/Sub-Lord/兼容性)(v3.7新增)
|
||||
argala Argala门闩系统(v3.7新增)
|
||||
tajika Tajika/Varshaphala年运盘(v3.7新增)
|
||||
@@ -21,7 +21,7 @@
|
||||
celebrity 名人案例查询(15,807条数据+SQLite验证库)
|
||||
db-stats 验证数据库统计
|
||||
transit 行星过境查询
|
||||
shadbala 六重力量计算(内部一致;外部绝对值校准前partial)(v3.4新增)
|
||||
shadbala 六重力量计算(covered;外部绝对值校准前保留置信度上限)(v3.4新增)
|
||||
ashtakavarga 八分法计算(v3.5升级BPHS完整表,SAV=337)
|
||||
memory Hermes记忆系统(v3.4新增)
|
||||
validate R1-R10数学验证(v3.5新增,含R2b BAV列→SAV校验)
|
||||
@@ -2820,7 +2820,7 @@ def _calc_dasa_convergence(dasha_result, chara_dasha_result, yogini_result, plan
|
||||
"""
|
||||
⭐ v6.1.6: Dasa Convergence 多系统交叉验证
|
||||
Vimshottari + Chara Dasha + Yogini + Ashtottari + Kalachakra 同时激活同一生活领域时,概率大幅提升。
|
||||
Chara Dasha 当前仍按 skill 规范降级为 partial,只作为低权重辅助。
|
||||
Chara Dasha 计算层为 covered;事件预测仍需多系统交叉确认。
|
||||
"""
|
||||
# 提取各系统当前周期
|
||||
convergence_data = {'systems': {}}
|
||||
@@ -3042,7 +3042,7 @@ def _calc_dasa_convergence(dasha_result, chara_dasha_result, yogini_result, plan
|
||||
'systems_summary': convergence_data['systems'],
|
||||
'domain_activations': domain_activations,
|
||||
'top_convergent_domains': [(d, info['convergence_level']) for d, info in top_domains],
|
||||
'protocol': 'v6.1.6 Dasa Convergence 多系统交叉验证。收敛等级: L1(单系统)→L3(双系统)→L4(三系统)→L5(四个及以上系统)。Chara Dasha 当前为 partial,所有预测仍必须由 Vimshottari/Transit/Varga 等独立层确认。',
|
||||
'protocol': 'v6.1.6 Dasa Convergence 多系统交叉验证。收敛等级: L1(单系统)→L3(双系统)→L4(三系统)→L5(四个及以上系统)。Chara Dasha 计算层为 covered;所有预测仍必须由 Vimshottari/Transit/Varga 等独立层确认。',
|
||||
}
|
||||
|
||||
|
||||
@@ -3737,13 +3737,13 @@ def cmd_full_reading(args):
|
||||
except Exception as e:
|
||||
jaimini_result['chara_karaka_jh'] = {"error": str(e)}
|
||||
|
||||
# 使用带 Antardasha 子周期的 Chara Dasha(v4.3.0;v6.0.9后标注为partial)
|
||||
# 使用带 Antardasha 子周期的 Chara Dasha(v4.3.0;v6.1.12 KN Rao benchmark 通过)
|
||||
jaimini_result['chara_dasha'] = calc_chara_dasha_with_antardasha(asc_idx, planet_lons, args.year, args.month)
|
||||
jaimini_result['has_antardasha'] = True
|
||||
jaimini_result['chara_dasha_capability'] = {
|
||||
'status': 'partial',
|
||||
'reason': 'Round 7 vs PyJHora KN Rao matched 58/240 fields; current implementation is simplified, not full KN Rao/PVN Rao/Iranganti.',
|
||||
'usage_rule': 'Use Chara Karaka/Karakamsha normally; use Chara Dasha timing only as low-weight corroboration.'
|
||||
'status': 'covered',
|
||||
'reason': 'KN Rao benchmark overall match 95.83%; Aquarius/Scorpio co-lord strength arbitration remains a documented edge case.',
|
||||
'usage_rule': 'Use Chara Karaka/Karakamsha normally; use Chara Dasha timing with Vimshottari/Transit/Varga corroboration.'
|
||||
}
|
||||
|
||||
# Karakamsha(用AK灵魂星,非DK配偶星)
|
||||
@@ -4267,7 +4267,7 @@ def main():
|
||||
p.add_argument('--node-mode', default='mean', choices=['mean', 'true'], help='Rahu/Ketu节点口径:mean=Mean Node(默认),true=True Node')
|
||||
|
||||
# 9. shadbala (v3.4新增)
|
||||
p = sub.add_parser('shadbala', help='Shadbala六重力量计算(内部一致;外部绝对值校准前partial)')
|
||||
p = sub.add_parser('shadbala', help='Shadbala六重力量计算(covered;外部绝对值校准前保留置信度上限)')
|
||||
_add_chart_args(p)
|
||||
|
||||
# 10. ashtakavarga (v3.4新增)
|
||||
@@ -4339,7 +4339,7 @@ def main():
|
||||
p = sub.add_parser('jaimini', help='Jaimini系统(Chara Karaka/Dasha/Karakamsha/Arudha/Special Lagnas)')
|
||||
_add_chart_args(p)
|
||||
p.add_argument('--mode', default='all', choices=['all','karaka','dasha','karakamsha','arudha','special'], help='分析模式')
|
||||
p.add_argument('--antardasha', action='store_true', help='Chara Dasha含Antardasha子周期(当前timing实现为partial)')
|
||||
p.add_argument('--antardasha', action='store_true', help='Chara Dasha含Antardasha子周期(covered;仍需多系统确认)')
|
||||
|
||||
# 18. nakshatra-adv (v3.7新增 → v6.0.22 升级)
|
||||
p = sub.add_parser('nakshatra-adv', help='高级Nakshatra分析(Tara/Chandra/Sub-Lord/综合)')
|
||||
|
||||
@@ -320,7 +320,7 @@ def build_cover(name, lagna, gender, status, pkg, desc, lang="cn"):
|
||||
<div><dt>{L[4]}</dt><dd>Parashari Jyotish | KN Rao School</dd></div>
|
||||
<div><dt>{L[5]}</dt><dd>Swiss Ephemeris | Lahiri Ayanamsha</dd></div>
|
||||
<div><dt>{L[6]}</dt><dd>Vimsottari (Mahadasha + Antardasha)</dd></div>
|
||||
<div><dt>{L[7]}</dt><dd>Shadbala (relative/partial), Ashtakavarga v2.1 (SAV/BAV), D9 Navamsha</dd></div>
|
||||
<div><dt>{L[7]}</dt><dd>Shadbala (covered, calibration-capped), Ashtakavarga v2.1 (SAV/BAV), D9 Navamsha</dd></div>
|
||||
</div></div>
|
||||
</div>"""
|
||||
|
||||
|
||||
+17
-11
@@ -14,16 +14,13 @@ from pathlib import Path
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
PYTHON = sys.executable
|
||||
|
||||
COMPILE_TARGETS = [
|
||||
ROOT / "scripts" / "jyotish_engine.py",
|
||||
ROOT / "scripts" / "varga.py",
|
||||
ROOT / "scripts" / "ashtakavarga.py",
|
||||
ROOT / "scripts" / "yoga_engine.py",
|
||||
ROOT / "scripts" / "audit_capabilities.py",
|
||||
ROOT / "scripts" / "validate_bphs_invariants.py",
|
||||
ROOT / "scripts" / "_compute_one_chart.py",
|
||||
ROOT / "scripts" / "build_standard_test_charts.py",
|
||||
ROOT / "scripts" / "build_planet_positions_60.py",
|
||||
COMPILE_DIRS = [
|
||||
ROOT / "scripts",
|
||||
ROOT / "jyotish_vedic",
|
||||
]
|
||||
|
||||
EXTRA_COMPILE_TARGETS = [
|
||||
ROOT / "mcp_server.py",
|
||||
ROOT / "tests" / "run_golden_cases.py",
|
||||
]
|
||||
|
||||
@@ -41,7 +38,16 @@ def run(cmd: list[str], *, optional: bool = False) -> bool:
|
||||
|
||||
def compile_targets() -> None:
|
||||
print("\n== Compile core Python files ==")
|
||||
for target in COMPILE_TARGETS:
|
||||
targets: list[Path] = []
|
||||
for directory in COMPILE_DIRS:
|
||||
targets.extend(sorted(directory.glob("*.py")))
|
||||
targets.extend(EXTRA_COMPILE_TARGETS)
|
||||
|
||||
seen: set[Path] = set()
|
||||
for target in targets:
|
||||
if target in seen or not target.exists():
|
||||
continue
|
||||
seen.add(target)
|
||||
print(f"compile {target.relative_to(ROOT)}")
|
||||
py_compile.compile(str(target), doraise=True)
|
||||
|
||||
|
||||
+1
-1
@@ -107,7 +107,7 @@ def calc_shadbala(planets: Dict, asc_sign: str, birth_hour: float,
|
||||
sun_lon: float, moon_lon: float,
|
||||
birth_minute: float = 0.0) -> Dict:
|
||||
"""
|
||||
计算 Shadbala 相对强弱参考(内部一致;外部绝对值校准前 partial)
|
||||
计算 Shadbala 相对强弱参考(covered;外部绝对值校准前保留置信度上限)
|
||||
|
||||
Args:
|
||||
planets: 行星数据 dict,每颗行星需要 {sign, degree, house, retrograde, speed}
|
||||
|
||||
Reference in New Issue
Block a user