나스를 찾았다 — Tailscale 의 yunchan-nas (100.116.83.60 / LAN 192.168.0.39), Synology DS420+. SSH 키(id_ed25519)로 이미 붙어서 비밀번호가 필요 없다. Forgejo 구성 컨테이너 kd-forgejo (codeberg.org/forgejo/forgejo:11) + postgres:16-alpine 웹 3000 -> Cloudflare 프록시로 https://git.chanpaca.net git SSH 2222 -> 컨테이너 내부 22 중요: git.chanpaca.net 은 Cloudflare 뒤라 22/2222 가 둘 다 막혀 있다. 오리진 IP 를 감추는 정상 구성이고, 그래서 git push 는 도메인이 아니라 Tailscale 주소로 해야 한다. remote 를 그렇게 걸었다. SSH 키가 이미 Forgejo 에 등록돼 있다(encep-win, yunchan 계정). push 에 토큰도 비밀번호도 필요 없다. 배포 전 검증 전체 빌드 통과 · 테스트 22개 통과 tarball 114.5KB / 22개 파일, 스킬 19개 포함 실제 npx 설치 왕복: install 19개 -> doctor 정상 -> 드리프트 감지 -> update 가 수정 파일 보존 -> uninstall 후 잔여 0 배포 직전에 결함 하나를 잡았다. Windows 에서 작업해 스킬이 전부 CRLF 로 저장돼 있었고, 그대로 tarball 에 들어가면 SKILL.md 의 YAML 프론트매터를 파서에 따라 못 읽는다. 번들 스크립트에서 LF 로 정규화하고 .gitattributes 도 넣었다. 배포물은 어느 OS 에서 만들든 같아야 한다. 푸터 제거 출처가 사라지지 않게 설치 섹션 끝에 한 줄만 남겼다(저장소 · MIT).
This commit is contained in:
parent
8267905c0c
commit
8ed45008a0
8 changed files with 116 additions and 34 deletions
|
|
@ -8,14 +8,26 @@ const here = path.dirname(fileURLToPath(import.meta.url));
|
|||
const src = path.resolve(here, "../../skill");
|
||||
const dest = path.resolve(here, "../dist/skill");
|
||||
|
||||
// 텍스트는 LF 로 정규화해서 싣는다.
|
||||
// Windows 에서 작업하면 파일이 CRLF 로 저장되고, 그대로 tarball 에 들어가면
|
||||
// SKILL.md 의 YAML 프론트매터를 파서에 따라 못 읽는다.
|
||||
// 배포물은 어느 OS 에서 만들었는지와 무관하게 같아야 한다.
|
||||
const TEXT = new Set([".md", ".txt", ".json", ".yml", ".yaml"]);
|
||||
|
||||
async function copyDir(from, to) {
|
||||
await fs.mkdir(to, { recursive: true });
|
||||
for (const e of await fs.readdir(from, { withFileTypes: true })) {
|
||||
if (e.name === "node_modules" || e.name === "package.json") continue;
|
||||
const s = path.join(from, e.name);
|
||||
const d = path.join(to, e.name);
|
||||
if (e.isDirectory()) await copyDir(s, d);
|
||||
else await fs.copyFile(s, d);
|
||||
if (e.isDirectory()) {
|
||||
await copyDir(s, d);
|
||||
} else if (TEXT.has(path.extname(e.name))) {
|
||||
const text = await fs.readFile(s, "utf8");
|
||||
await fs.writeFile(d, text.replace(/\r\n/g, "\n"), "utf8");
|
||||
} else {
|
||||
await fs.copyFile(s, d);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue