fix(qizheng): pin vendor bytes to local a911c890 checkout
Independent Staging Quality Gate / validate (push) Failing after 6m58s
Independent Staging Quality Gate / publish (push) Skipped

Re-copy LICENSE/README/package.json/cli.cjs from the local yinduzhanxing snapshot. Drop dist/index.cjs that was assembled from npm. Do not include 6c27aab6 or 8bba9cb5.
This commit is contained in:
jesse-ux
2026-09-15 16:33:31 +08:00
parent 830799fafb
commit f7386e0717
6 changed files with 19 additions and 46672 deletions
+1 -40
View File
@@ -20,7 +20,6 @@ from typing import Any
REPO_ROOT = Path(__file__).resolve().parents[1]
VENDORED_CLI = REPO_ROOT / "vendor" / "stem-branch" / "dist" / "cli.cjs"
VENDORED_LIB = REPO_ROOT / "vendor" / "stem-branch" / "dist" / "index.cjs"
DEFAULT_TIMEOUT_SECONDS = 20
COORDINATE_SYSTEM = "qizheng_mansion_degrees_from_jiao"
DEFAULT_KETU_MODE = "apogee"
@@ -48,17 +47,6 @@ BOUNDARY = (
"庙旺判定未闭合(十一体×十二宫共 132 格仅 9 格有直接证据,"
"runtime_promotable_count = 0),不得进入解读、报告或咨询结论。"
)
_NODE_EVAL = (
"const fs=require('fs');"
"const payload=JSON.parse(fs.readFileSync(0,'utf8'));"
"const lib=require(payload.library);"
"const chart=lib.getSevenGovernorsChart("
"new Date(payload.iso),"
"{lat:payload.lat,lon:payload.lon},"
"{ketuMode:payload.ketuMode,siderealMode:payload.siderealMode}"
");"
"process.stdout.write(JSON.stringify({sevenGovernors:chart}));"
)
class QizhengChartError(ValueError):
@@ -196,33 +184,10 @@ def _run_cli(iso: str, lat: float, lon: float, timeout_seconds: int) -> dict[str
]
if FORBIDDEN_CLI_FLAGS.intersection(command):
raise QizhengChartError("forbidden engine subcommand blocked", error_code="ERR_QIZHENG_ENGINE")
return _run_node(command, timeout_seconds=timeout_seconds)
def _run_library(iso: str, lat: float, lon: float, ketu_mode: str, sidereal_mode: dict[str, Any], timeout_seconds: int) -> dict[str, Any]:
if not VENDORED_LIB.is_file():
raise QizhengChartError("vendored 七政四余 library is unavailable", error_code="ERR_QIZHENG_CLI_MISSING")
payload = {
"library": os.fspath(VENDORED_LIB),
"iso": iso,
"lat": lat,
"lon": lon,
"ketuMode": ketu_mode,
"siderealMode": sidereal_mode,
}
return _run_node(
[_node_bin(), "-e", _NODE_EVAL],
timeout_seconds=timeout_seconds,
stdin=json.dumps(payload, ensure_ascii=False),
)
def _run_node(command: list[str], *, timeout_seconds: int, stdin: str | None = None) -> dict[str, Any]:
try:
completed = subprocess.run(
command,
cwd=str(REPO_ROOT),
input=stdin,
check=False,
capture_output=True,
text=True,
@@ -320,11 +285,7 @@ def calculate_qizheng_chart(body: dict[str, Any], *, timeout_seconds: int = DEFA
iso = _iso_local(body)
ketu_mode = _ketu_mode(body)
sidereal_mode = _sidereal_mode(body)
uses_defaults = ketu_mode == DEFAULT_KETU_MODE and sidereal_mode == DEFAULT_SIDEREAL_MODE
if uses_defaults:
raw = _run_cli(iso, lat, lon, timeout_seconds)
else:
raw = _run_library(iso, lat, lon, ketu_mode, sidereal_mode, timeout_seconds)
raw = _run_cli(iso, lat, lon, timeout_seconds)
return _normalize(raw, {**body, "lat": lat, "lon": lon}, ketu_mode=ketu_mode, sidereal_mode=sidereal_mode, iso=iso)