Table Permissions Plan
__SITE_NAME__
diff --git a/plugins/power-pages/scripts/lib/render-template.js b/plugins/power-pages/scripts/lib/render-template.js
index f0fabb587..520d908e6 100644
--- a/plugins/power-pages/scripts/lib/render-template.js
+++ b/plugins/power-pages/scripts/lib/render-template.js
@@ -75,6 +75,21 @@ function renderTemplate({ templatePath, outputPath, dataPath, dataObject, requir
}
fs.writeFileSync(outputPath, result, 'utf8');
+
+ // Silently copy the shared Power Pages icon next to the rendered HTML so the
+ // template's

reference resolves when the
+ // file is opened directly (or served from docs/). Copy is best-effort —
+ // rendering still succeeds if the icon is missing.
+ const iconSrc = path.join(__dirname, '..', '..', 'skills', 'create-site', 'assets', 'shared', 'power-pages-icon.png');
+ const iconDest = path.join(outputDir, 'power-pages-icon.png');
+ try {
+ if (fs.existsSync(iconSrc)) {
+ fs.copyFileSync(iconSrc, iconDest);
+ }
+ } catch {
+ // non-fatal
+ }
+
console.log(JSON.stringify({ status: 'ok', output: outputPath }));
}
diff --git a/plugins/power-pages/scripts/tests/render-cloudflow-plan.test.js b/plugins/power-pages/scripts/tests/render-cloudflow-plan.test.js
index 1fb545449..aee3832e1 100644
--- a/plugins/power-pages/scripts/tests/render-cloudflow-plan.test.js
+++ b/plugins/power-pages/scripts/tests/render-cloudflow-plan.test.js
@@ -110,6 +110,50 @@ test('render-cloudflow-plan fails with invalid --data-inline JSON', () => {
assert.match(result.stderr, /not valid JSON/);
});
+test('render-cloudflow-plan copies power-pages-icon.png next to the HTML', () => {
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cloudflow-plan-'));
+ const outputPath = path.join(tempDir, 'plan.html');
+ const iconPath = path.join(tempDir, 'power-pages-icon.png');
+
+ const result = spawnSync(
+ process.execPath,
+ [scriptPath, '--output', outputPath, '--data-inline', JSON.stringify(SAMPLE_DATA)],
+ { encoding: 'utf8' }
+ );
+ assert.equal(result.status, 0, result.stderr || result.stdout);
+
+ assert.ok(fs.existsSync(iconPath), 'icon should be copied alongside the rendered HTML');
+ const sourceIcon = path.join(
+ __dirname, '..', '..', 'skills', 'create-site', 'assets', 'shared', 'power-pages-icon.png'
+ );
+ assert.deepEqual(fs.readFileSync(iconPath), fs.readFileSync(sourceIcon), 'icon bytes should match shared asset');
+});
+
+test('render-cloudflow-plan overwrites a stale power-pages-icon.png on re-render', () => {
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cloudflow-plan-'));
+ const outputPath = path.join(tempDir, 'plan.html');
+ const iconPath = path.join(tempDir, 'power-pages-icon.png');
+
+ // Pre-seed a stale/dummy icon that render should overwrite.
+ fs.writeFileSync(iconPath, Buffer.from([0x00, 0x01, 0x02]));
+
+ const result = spawnSync(
+ process.execPath,
+ [scriptPath, '--output', outputPath, '--data-inline', JSON.stringify(SAMPLE_DATA)],
+ { encoding: 'utf8' }
+ );
+ assert.equal(result.status, 0, result.stderr || result.stdout);
+
+ const sourceIcon = path.join(
+ __dirname, '..', '..', 'skills', 'create-site', 'assets', 'shared', 'power-pages-icon.png'
+ );
+ assert.deepEqual(
+ fs.readFileSync(iconPath),
+ fs.readFileSync(sourceIcon),
+ 'stale icon should have been overwritten with the shared asset'
+ );
+});
+
test('render-cloudflow-plan refuses to overwrite existing file', () => {
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cloudflow-plan-'));
const dataPath = path.join(tempDir, 'data.json');
diff --git a/plugins/power-pages/skills/add-cloud-flow/assets/cloud-flow-plan.html b/plugins/power-pages/skills/add-cloud-flow/assets/cloud-flow-plan.html
index 76c73bdc6..c09f7d0c9 100644
--- a/plugins/power-pages/skills/add-cloud-flow/assets/cloud-flow-plan.html
+++ b/plugins/power-pages/skills/add-cloud-flow/assets/cloud-flow-plan.html
@@ -18,7 +18,7 @@
body{font-family:var(--sans);background:var(--bg);color:var(--text);font-size:14px;line-height:1.6;}
.topbar{z-index:100;background:var(--surface);box-shadow:var(--shadow-4);padding:14px 28px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;}
.topbar-left{display:flex;align-items:center;gap:14px;}
-.logo{width:36px;height:36px;border-radius:var(--radius);background:linear-gradient(135deg,#0078d4,#5c2d91);display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:800;color:#fff;font-family:var(--mono);letter-spacing:-0.5px;}
+.logo{width:36px;height:36px;object-fit:contain;display:block;flex-shrink:0;}
.topbar-title{font-size:16px;font-weight:700;color:var(--text-bright);}
.topbar-sub{font-size:11px;color:var(--text-dim);margin-top:1px;}
.layout{display:flex;min-height:calc(100vh - 65px);}
@@ -82,7 +82,7 @@
-
PP
+
__PLAN_TITLE__
__SITE_NAME__
diff --git a/plugins/power-pages/skills/add-server-logic/assets/serverlogic-plan.html b/plugins/power-pages/skills/add-server-logic/assets/serverlogic-plan.html
index 9c5d6a639..916bd7f4c 100644
--- a/plugins/power-pages/skills/add-server-logic/assets/serverlogic-plan.html
+++ b/plugins/power-pages/skills/add-server-logic/assets/serverlogic-plan.html
@@ -18,7 +18,7 @@
body{font-family:var(--sans);background:var(--bg);color:var(--text);font-size:14px;line-height:1.6;}
.topbar{z-index:100;background:var(--surface);box-shadow:var(--shadow-4);padding:14px 28px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;}
.topbar-left{display:flex;align-items:center;gap:14px;}
-.logo{width:36px;height:36px;border-radius:var(--radius);background:linear-gradient(135deg,#0078d4,#5c2d91);display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:800;color:#fff;font-family:var(--mono);letter-spacing:-0.5px;}
+.logo{width:36px;height:36px;object-fit:contain;display:block;flex-shrink:0;}
.topbar-title{font-size:16px;font-weight:700;color:var(--text-bright);}
.topbar-sub{font-size:11px;color:var(--text-dim);margin-top:1px;}
.layout{display:flex;min-height:calc(100vh - 65px);}
@@ -110,7 +110,7 @@
-
PP
+
__PLAN_TITLE__
__SITE_NAME__
diff --git a/plugins/power-pages/skills/audit-permissions/assets/audit-report.html b/plugins/power-pages/skills/audit-permissions/assets/audit-report.html
index 953e5cad2..68645b8eb 100644
--- a/plugins/power-pages/skills/audit-permissions/assets/audit-report.html
+++ b/plugins/power-pages/skills/audit-permissions/assets/audit-report.html
@@ -29,7 +29,7 @@
/* Top Bar */
.topbar{z-index:100;background:var(--surface);box-shadow:var(--shadow-4);padding:14px 28px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;}
.topbar-left{display:flex;align-items:center;gap:14px;}
-.logo{width:36px;height:36px;border-radius:var(--radius);background:linear-gradient(135deg,#0078d4,#5c2d91);display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:800;color:#fff;font-family:var(--mono);letter-spacing:-0.5px;}
+.logo{width:36px;height:36px;object-fit:contain;display:block;flex-shrink:0;}
.topbar-title{font-size:16px;font-weight:700;color:var(--text-bright);}
.topbar-sub{font-size:11px;color:var(--text-dim);margin-top:1px;}
@@ -133,7 +133,7 @@
-
PP
+
Permissions Audit Report
__SITE_NAME__
diff --git a/plugins/power-pages/skills/integrate-backend/assets/backend-plan.html b/plugins/power-pages/skills/integrate-backend/assets/backend-plan.html
index 35306403d..16f190843 100644
--- a/plugins/power-pages/skills/integrate-backend/assets/backend-plan.html
+++ b/plugins/power-pages/skills/integrate-backend/assets/backend-plan.html
@@ -19,7 +19,7 @@
body{font-family:var(--sans);background:var(--bg);color:var(--text);font-size:14px;line-height:1.6;}
.topbar{z-index:100;background:var(--surface);box-shadow:var(--shadow-4);padding:14px 28px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;}
.topbar-left{display:flex;align-items:center;gap:14px;}
-.logo{width:36px;height:36px;border-radius:var(--radius);background:linear-gradient(135deg,#0078d4,#5c2d91);display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:800;color:#fff;font-family:var(--mono);letter-spacing:-0.5px;}
+.logo{width:36px;height:36px;object-fit:contain;display:block;flex-shrink:0;}
.topbar-title{font-size:16px;font-weight:700;color:var(--text-bright);}
.topbar-sub{font-size:11px;color:var(--text-dim);margin-top:1px;}
.layout{display:flex;min-height:calc(100vh - 65px);}
@@ -168,7 +168,7 @@
-
PP
+
__PLAN_TITLE__
__SITE_NAME__