@zalkera/client 0.21.4 → 0.21.5
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/bin/validate-storefront.mjs +31 -2
- package/package.json +1 -1
|
@@ -186,6 +186,19 @@ function markUnmeasured(path, code, what) {
|
|
|
186
186
|
* 한 자리로 모은다.
|
|
187
187
|
*/
|
|
188
188
|
function readSafe(file, what) {
|
|
189
|
+
// ⚠ **심링크를 따라가지 않는다.** 0.21.4 는 파생 경로(`containedPath`)만 봉쇄했는데, 검사기가
|
|
190
|
+
// **이름으로 여는 파일** — `AGENTS.md`·`globals.css`·`content/index.ts` 등 — 에는 봉쇄가 없었다.
|
|
191
|
+
// 테넌트가 그 이름을 임의 절대경로로 심링크하면 서빙 샌드박스에서 존재·가독성·정확한 MB·
|
|
192
|
+
// 백틱 안 경로형 문자열을 회신으로 되받는다(심의 실측). 여는 자리에도 같은 규칙을 건다.
|
|
193
|
+
//
|
|
194
|
+
// 레포 **안**을 가리키는 심링크는 그대로 읽는다(모노레포의 공유 설정 등) — 경계는 이탈이지
|
|
195
|
+
// 심링크 자체가 아니다.
|
|
196
|
+
const safe = containedPath(repoRootDir, file);
|
|
197
|
+
if (safe === null) {
|
|
198
|
+
markUnmeasured(file, "EXDEV", `${what} — 레포 밖을 가리켜 읽지 않았습니다`);
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
file = safe;
|
|
189
202
|
try {
|
|
190
203
|
// ⚠ 크기 상한. 이 검사기는 **신뢰 밖 소스**에도 도는데(서빙 샌드박스), 상한이 없으면 import
|
|
191
204
|
// 한 줄로 임의 크기 파일을 읽혀 빌드 박스 메모리를 밀어낼 수 있다 — 실측으로 레포 밖 400MB
|
|
@@ -1454,6 +1467,22 @@ function fileExists(path) {
|
|
|
1454
1467
|
}
|
|
1455
1468
|
}
|
|
1456
1469
|
|
|
1470
|
+
/**
|
|
1471
|
+
* **이름이 있는가** — 심링크를 따라가지 않는다.
|
|
1472
|
+
*
|
|
1473
|
+
* 고정 이름 파일(`AGENTS.md`·`llms.txt`)의 존재를 `statSync` 로 물으면 **심링크 표적**을 따라가고,
|
|
1474
|
+
* 그 표적이 있느냐 없느냐로 회신이 갈린다 — 표적이 신뢰 밖 소스의 통제 아래라 그 차이가 오라클이다.
|
|
1475
|
+
* 이름의 존재만 묻고, 읽을 수 있는지는 `readSafe` 의 봉쇄가 판단하게 둔다(표적과 무관하게 한 줄).
|
|
1476
|
+
*/
|
|
1477
|
+
function nameExists(path) {
|
|
1478
|
+
try {
|
|
1479
|
+
lstatSync(path);
|
|
1480
|
+
return true;
|
|
1481
|
+
} catch {
|
|
1482
|
+
return false;
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1485
|
+
|
|
1457
1486
|
/**
|
|
1458
1487
|
* D 규칙의 심각도 — 좌표의 실재는 **사실 판정**이라 어느 레포에서도 참이지만, 남의 레포 문서에
|
|
1459
1488
|
* 에러를 던지지는 않는다(전제 1 "강제할 수 없다"). 우리 계약을 하나라도 선언한 레포에서만 error 다.
|
|
@@ -1474,7 +1503,7 @@ function checkDocCoordinates() {
|
|
|
1474
1503
|
const sink = docsSink();
|
|
1475
1504
|
|
|
1476
1505
|
const agents = join(repoRoot, "AGENTS.md");
|
|
1477
|
-
if (
|
|
1506
|
+
if (nameExists(agents)) {
|
|
1478
1507
|
const agentsText = readSafe(agents, "D1 문서 좌표 검사(AGENTS.md)");
|
|
1479
1508
|
for (const tok of docPathTokens(agentsText ?? "")) {
|
|
1480
1509
|
const target = containedPath(repoRoot, tok);
|
|
@@ -1500,7 +1529,7 @@ function checkDocCoordinates() {
|
|
|
1500
1529
|
if (!isExemplar) return;
|
|
1501
1530
|
|
|
1502
1531
|
const llms = join(repoRoot, "node_modules", "@zalkera", "client", "llms.txt");
|
|
1503
|
-
if (!
|
|
1532
|
+
if (!nameExists(llms)) return; // 미설치 — 없는 것을 센 척하지 않는다.
|
|
1504
1533
|
const llmsText = readSafe(llms, "D2 문서 좌표 검사(llms.txt)");
|
|
1505
1534
|
for (const tok of docPathTokens(llmsText ?? "", /^src\/(app|components|lib)\//)) {
|
|
1506
1535
|
const target = containedPath(repoRoot, tok);
|