const fs = require("fs"); const ENV_PATH = "c:/Users/k.nogi/#GitHub/NodeSrv/apps/xwiki/.env"; function loadEnv(p) { const text = fs.readFileSync(p, "utf8"); const env = {}; for (const line of text.split(/\r?\n/)) { const m = line.match(/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/); if (!m) continue; let v = m[2]; if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) { v = v.slice(1, -1); } env[m[1]] = v; } return env; } const env = loadEnv(ENV_PATH); const BASE_URL = env.XWIKI_BASE_URL; const AUTH = "Basic " + Buffer.from(`${env.XWIKI_ADMIN_USER}:${env.XWIKI_ADMIN_PASSWORD}`).toString("base64"); const WIKI_ID = "admin"; function xmlEscape(s) { return String(s).replace(/&/g, "&").replace(//g, ">"); } function buildUrl(spacePath) { const segs = spacePath.map((s) => "spaces/" + encodeURIComponent(s)); return `${BASE_URL}/rest/wikis/${WIKI_ID}/${segs.join("/")}/pages/WebHome`; } async function putPage(spacePath, title, content) { const url = buildUrl(spacePath); const body = ` ${xmlEscape(title)} markdown/1.2 ${xmlEscape(content)} `; const res = await fetch(url, { method: "PUT", headers: { "Content-Type": "application/xml; charset=utf-8", Authorization: AUTH }, body, }); const text = await res.text(); return { status: res.status, ok: res.status === 201 || res.status === 202, url, text }; } const SPEC_PATH = "c:/Users/k.nogi/#GitHub/ken_nogi/ClaudePleasanter/★マスターシート/configs/site-189112_★マスターシート/docs/site-189112_spec.md"; const PARENT_SPACE = ["プリザンター", "nextoffice", "96230_【新版】注文住宅MSS", "189112_★マスターシート"]; async function main() { const specContent = fs.readFileSync(SPEC_PATH, "utf8"); // 1. 子ページとして仕様書を投入 const specSpace = PARENT_SPACE.concat("仕様書"); const r1 = await putPage(specSpace, "仕様書:★マスターシート(SiteId: 189112)", specContent); console.log(`[${r1.ok ? "OK" : "NG"} ${r1.status}] ${specSpace.join(" / ")}`); if (!r1.ok) console.log(r1.text.slice(0, 500)); // 2. 親ページ(WebHome)を更新して子ページへのリンクを追記 const parentContent = [ "# ★マスターシート(SiteId:189112)", "", "- SiteId: 189112", "- Pleasanter環境: https://nextoffice.next-hd.co.jp/pleasanter/", "- リポジトリ内パス: `★マスターシート/configs/site-189112_★マスターシート`", "", "## 保存済みファイル", "- [[仕様書]] : サイト仕様書(項目定義・権限・スクリプト等)。2026-08-16投入。", ].join("\n"); const r2 = await putPage(PARENT_SPACE, "★マスターシート(SiteId:189112)", parentContent); console.log(`[${r2.ok ? "OK" : "NG"} ${r2.status}] ${PARENT_SPACE.join(" / ")}`); if (!r2.ok) console.log(r2.text.slice(0, 500)); } main();