Commit 4e24940

Browse files
committed
review: address PR #11 follow-ups (drop debug logs, centralize MCP_VERSION)
Addresses apappascs review on #11. - Remove debug `console.log` calls from `incrementOps()` and `window.onmessage` in `ui-entry.ts`. The instrumentation served its purpose; shipping verbose runtime logging in a polish PR was wrong. - Centralize the `pluginos@<version>` pin via build-time injection. The webpack config now reads `mcp-server/package.json#version` and passes it into the UI bundle (DefinePlugin → `__MCP_VERSION__`) and into `bootloader.html` (`templateParameters` → `<%= MCP_VERSION %>`). Drift becomes impossible because `package.json` is the single source. - Drop the regex sweep in `scripts/bump-lockstep.cjs` over `ui-entry.ts` and `bootloader.html` — no longer needed, those files are templated. - Drop the 2-line `constants.ts` shim. With `resolveJsonModule: true`, `ui-entry.ts` imports `DXT_URL` directly from `constants.json`. - README: add a one-line nudge above the `<details>` install block so Cursor / Claude Code CLI users do not skim past the collapsed section. - ESLint: ignore `.claude/` and `.worktrees/` (parallels `.prettierignore`) so nested Claude Code session worktrees do not poison `npm run lint`. Items 4 and 6 from the review (TIER_1_RULES / INSTALL_COMMAND dedup and bootloader theme-token drift) are deferred to a follow-up issue since both span this PR's scope. Verification: `npm run check` ✅ (lint + format + build:shared + typecheck + build + test). Built `dist/bootloader.html` and `dist/ui.html` both contain the literal `pluginos@0.4.2` from `mcp-server/package.json`.
1 parent 97ab1ae commit 4e24940

7 files changed

Lines changed: 21 additions & 32 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ PluginOS takes a fundamentally different approach:
3030

3131
No JSON editing, no terminal. Note: Claude.ai web is **not** supported — it cannot reach local MCP servers.
3232

33+
Using Cursor or Claude Code CLI? Open the section below for the right config.
34+
3335
<details>
3436
<summary><strong>Other AI tools</strong> (Cursor, Claude Code CLI, manual config)</summary>
3537

‎eslint.config.js‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export default tseslint.config(
1414
"**/*.cjs",
1515
"**/*.mjs",
1616
"!eslint.config.js",
17+
".claude/",
18+
".worktrees/",
1719
],
1820
},
1921
{

‎packages/bridge-plugin/src/bootloader.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
},1000);
144144
}
145145

146-
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@0.4.2"]}}},null,2);
146+
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@<%= MCP_VERSION %>"]}}},null,2);
147147
varTIER_1_RULES="When working with Figma, always use PluginOS tools exclusively:\n- Use `list_operations` (pluginos) first to discover available Figma operations.\n- Use `run_operation` (pluginos) to execute them.\n- Use `execute_figma` (pluginos) only for one-off custom logic not covered by built-in ops.\n- Do NOT use `mcp__Figma__*` tools — they bypass the plugin and return raw, token-heavy data. PluginOS returns pre-summarized, structured results at ~230 tokens/call.\n- If PluginOS returns \"No plugin connected\", open the PluginOS Bridge plugin in Figma before retrying.\n\nAudit/lint/check operations default to `scope: \"selection\"`. Pass `scope: \"page\"` explicitly (and `confirm: true` for pages over 500 nodes) to scan the whole page. Responses carry `_hint` and `_next_hints` fields — respect them when deciding what to do next.";
148148
varINSTALL_COMMAND="/plugin marketplace add github:LSDimi/pluginos\n/plugin install pluginos";
149149
varDXT_URL="<%= DXT_URL %>";

‎packages/bridge-plugin/src/constants.ts‎

Lines changed: 0 additions & 2 deletions
This file was deleted.

‎packages/bridge-plugin/src/ui-entry.ts‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import{DXT_URL}from"./constants";
1+
import{DXT_URL}from"./constants.json";
2+
3+
declareconst__MCP_VERSION__: string;
24

35
constTIER_1_RULES=`When working with Figma, always use PluginOS tools exclusively:
46
- Use \`list_operations\` (pluginos) first to discover available Figma operations.
@@ -13,7 +15,7 @@ const MCP_CONFIG_JSON = `{
1315
"mcpServers": {
1416
"pluginos": {
1517
"command": "npx",
16-
"args": ["-y", "pluginos@0.4.2"]
18+
"args": ["-y", "pluginos@${__MCP_VERSION__}"]
1719
}
1820
}
1921
}`;
@@ -189,8 +191,6 @@ function updateFilename(name: string) {
189191

190192
functionincrementOps(){
191193
opsRunCount++;
192-
// eslint-disable-next-line no-console
193-
console.log("[pluginos:debug] incrementOps called, count="+opsRunCount);
194194
constel=$("ops-run-count");
195195
if(el)el.textContent=opsRunCount+" ops run";
196196
}
@@ -307,10 +307,6 @@ document
307307
window.onmessage=(event: MessageEvent)=>{
308308
constmsg=event.data.pluginMessage;
309309
if(!msg)return;
310-
// eslint-disable-next-line no-console
311-
console.log(
312-
"[pluginos:debug] window.onmessage type="+msg.type+" payload.type="+msg?.payload?.type
313-
);
314310

315311
if(msg.type==="__ui_list_operations_result"){
316312
renderOpsPanel(msg.operations);

‎packages/bridge-plugin/webpack.config.js‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
constpath=require("path");
2+
constwebpack=require("webpack");
23
constHtmlWebpackPlugin=require("html-webpack-plugin");
34
constHtmlInlineScriptPlugin=require("html-inline-script-webpack-plugin");
45

56
const{DXT_URL}=require("./src/constants.json");
7+
const{version: MCP_VERSION}=require("../mcp-server/package.json");
68

79
constnoModernSyntax={
810
arrowFunction: true,
@@ -43,6 +45,9 @@ module.exports = (env, argv) => [
4345
resolve: {extensions: [".ts",".js"]},
4446
devtool: false,
4547
plugins: [
48+
newwebpack.DefinePlugin({
49+
__MCP_VERSION__: JSON.stringify(MCP_VERSION),
50+
}),
4651
newHtmlWebpackPlugin({
4752
template: "./src/ui.html",
4853
filename: "ui.html",
@@ -62,7 +67,7 @@ module.exports = (env, argv) => [
6267
template: "./src/bootloader.html",
6368
filename: "bootloader.html",
6469
inject: false,
65-
templateParameters: {DXT_URL},
70+
templateParameters: {DXT_URL,MCP_VERSION},
6671
}),
6772
],
6873
mode: argv.mode||"production",

‎scripts/bump-lockstep.cjs‎

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
/**
33
* Postversion hook for packages/mcp-server. When `npm version` bumps the
44
* MCP server, propagate the same version string to every file that pins the
5-
* pluginos version: peer package.json manifests, the DXT manifest (both the
6-
* top-level `version` and its `server.mcp_config.args` pin), and the
7-
* hardcoded npx args inside the Figma plugin's UI sources.
5+
* pluginos version: peer package.json manifests and the DXT manifest (both
6+
* the top-level `version` and its `server.mcp_config.args` pin).
7+
*
8+
* Note: the Figma plugin UI (`bridge-plugin/src/ui-entry.ts` and
9+
* `bootloader.html`) reads `mcp-server/package.json#version` at webpack
10+
* build time, so no source-file rewrite is needed there.
811
*/
912
constfs=require("node:fs");
1013
constpath=require("node:path");
@@ -40,20 +43,3 @@ if (Array.isArray(dxt?.server?.mcp_config?.args)) {
4043
}
4144
fs.writeFileSync(dxtAbs,JSON.stringify(dxt,null,2)+"\n");
4245
console.log(`Bumped ${dxtManifestRel}${newVersion}`);
43-
44-
// Sources that hardcode `pluginos@<version>` in copy-paste MCP config snippets.
45-
// These use a regex swap so formatting is preserved.
46-
constsourceTargets=[
47-
"packages/bridge-plugin/src/ui-entry.ts",
48-
"packages/bridge-plugin/src/bootloader.html",
49-
];
50-
51-
for(constrelofsourceTargets){
52-
constabs=path.join(repoRoot,rel);
53-
constbefore=fs.readFileSync(abs,"utf8");
54-
constafter=before.replace(/pluginos@\d+\.\d+\.\d+/g,`pluginos@${newVersion}`);
55-
if(after!==before){
56-
fs.writeFileSync(abs,after);
57-
console.log(`Bumped ${rel} → pluginos@${newVersion}`);
58-
}
59-
}

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Commit 4e24940

Browse files
committed
review: address PR #11 follow-ups (drop debug logs, centralize MCP_VERSION)
Addresses apappascs review on #11. - Remove debug `console.log` calls from `incrementOps()` and `window.onmessage` in `ui-entry.ts`. The instrumentation served its purpose; shipping verbose runtime logging in a polish PR was wrong. - Centralize the `pluginos@<version>` pin via build-time injection. The webpack config now reads `mcp-server/package.json#version` and passes it into the UI bundle (DefinePlugin → `__MCP_VERSION__`) and into `bootloader.html` (`templateParameters` → `<%= MCP_VERSION %>`). Drift becomes impossible because `package.json` is the single source. - Drop the regex sweep in `scripts/bump-lockstep.cjs` over `ui-entry.ts` and `bootloader.html` — no longer needed, those files are templated. - Drop the 2-line `constants.ts` shim. With `resolveJsonModule: true`, `ui-entry.ts` imports `DXT_URL` directly from `constants.json`. - README: add a one-line nudge above the `<details>` install block so Cursor / Claude Code CLI users do not skim past the collapsed section. - ESLint: ignore `.claude/` and `.worktrees/` (parallels `.prettierignore`) so nested Claude Code session worktrees do not poison `npm run lint`. Items 4 and 6 from the review (TIER_1_RULES / INSTALL_COMMAND dedup and bootloader theme-token drift) are deferred to a follow-up issue since both span this PR's scope. Verification: `npm run check` ✅ (lint + format + build:shared + typecheck + build + test). Built `dist/bootloader.html` and `dist/ui.html` both contain the literal `pluginos@0.4.2` from `mcp-server/package.json`.
1 parent 97ab1ae commit 4e24940

7 files changed

Lines changed: 21 additions & 32 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ PluginOS takes a fundamentally different approach:
3030

3131
No JSON editing, no terminal. Note: Claude.ai web is **not** supported — it cannot reach local MCP servers.
3232

33+
Using Cursor or Claude Code CLI? Open the section below for the right config.
34+
3335
<details>
3436
<summary><strong>Other AI tools</strong> (Cursor, Claude Code CLI, manual config)</summary>
3537

‎eslint.config.js‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export default tseslint.config(
1414
"**/*.cjs",
1515
"**/*.mjs",
1616
"!eslint.config.js",
17+
".claude/",
18+
".worktrees/",
1719
],
1820
},
1921
{

‎packages/bridge-plugin/src/bootloader.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
},1000);
144144
}
145145

146-
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@0.4.2"]}}},null,2);
146+
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@<%= MCP_VERSION %>"]}}},null,2);
147147
varTIER_1_RULES="When working with Figma, always use PluginOS tools exclusively:\n- Use `list_operations` (pluginos) first to discover available Figma operations.\n- Use `run_operation` (pluginos) to execute them.\n- Use `execute_figma` (pluginos) only for one-off custom logic not covered by built-in ops.\n- Do NOT use `mcp__Figma__*` tools — they bypass the plugin and return raw, token-heavy data. PluginOS returns pre-summarized, structured results at ~230 tokens/call.\n- If PluginOS returns \"No plugin connected\", open the PluginOS Bridge plugin in Figma before retrying.\n\nAudit/lint/check operations default to `scope: \"selection\"`. Pass `scope: \"page\"` explicitly (and `confirm: true` for pages over 500 nodes) to scan the whole page. Responses carry `_hint` and `_next_hints` fields — respect them when deciding what to do next.";
148148
varINSTALL_COMMAND="/plugin marketplace add github:LSDimi/pluginos\n/plugin install pluginos";
149149
varDXT_URL="<%= DXT_URL %>";

‎packages/bridge-plugin/src/constants.ts‎

Lines changed: 0 additions & 2 deletions
This file was deleted.

‎packages/bridge-plugin/src/ui-entry.ts‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import{DXT_URL}from"./constants";
1+
import{DXT_URL}from"./constants.json";
2+
3+
declareconst__MCP_VERSION__: string;
24

35
constTIER_1_RULES=`When working with Figma, always use PluginOS tools exclusively:
46
- Use \`list_operations\` (pluginos) first to discover available Figma operations.
@@ -13,7 +15,7 @@ const MCP_CONFIG_JSON = `{
1315
"mcpServers": {
1416
"pluginos": {
1517
"command": "npx",
16-
"args": ["-y", "pluginos@0.4.2"]
18+
"args": ["-y", "pluginos@${__MCP_VERSION__}"]
1719
}
1820
}
1921
}`;
@@ -189,8 +191,6 @@ function updateFilename(name: string) {
189191

190192
functionincrementOps(){
191193
opsRunCount++;
192-
// eslint-disable-next-line no-console
193-
console.log("[pluginos:debug] incrementOps called, count="+opsRunCount);
194194
constel=$("ops-run-count");
195195
if(el)el.textContent=opsRunCount+" ops run";
196196
}
@@ -307,10 +307,6 @@ document
307307
window.onmessage=(event: MessageEvent)=>{
308308
constmsg=event.data.pluginMessage;
309309
if(!msg)return;
310-
// eslint-disable-next-line no-console
311-
console.log(
312-
"[pluginos:debug] window.onmessage type="+msg.type+" payload.type="+msg?.payload?.type
313-
);
314310

315311
if(msg.type==="__ui_list_operations_result"){
316312
renderOpsPanel(msg.operations);

‎packages/bridge-plugin/webpack.config.js‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
constpath=require("path");
2+
constwebpack=require("webpack");
23
constHtmlWebpackPlugin=require("html-webpack-plugin");
34
constHtmlInlineScriptPlugin=require("html-inline-script-webpack-plugin");
45

56
const{DXT_URL}=require("./src/constants.json");
7+
const{version: MCP_VERSION}=require("../mcp-server/package.json");
68

79
constnoModernSyntax={
810
arrowFunction: true,
@@ -43,6 +45,9 @@ module.exports = (env, argv) => [
4345
resolve: {extensions: [".ts",".js"]},
4446
devtool: false,
4547
plugins: [
48+
newwebpack.DefinePlugin({
49+
__MCP_VERSION__: JSON.stringify(MCP_VERSION),
50+
}),
4651
newHtmlWebpackPlugin({
4752
template: "./src/ui.html",
4853
filename: "ui.html",
@@ -62,7 +67,7 @@ module.exports = (env, argv) => [
6267
template: "./src/bootloader.html",
6368
filename: "bootloader.html",
6469
inject: false,
65-
templateParameters: {DXT_URL},
70+
templateParameters: {DXT_URL,MCP_VERSION},
6671
}),
6772
],
6873
mode: argv.mode||"production",

‎scripts/bump-lockstep.cjs‎

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
/**
33
* Postversion hook for packages/mcp-server. When `npm version` bumps the
44
* MCP server, propagate the same version string to every file that pins the
5-
* pluginos version: peer package.json manifests, the DXT manifest (both the
6-
* top-level `version` and its `server.mcp_config.args` pin), and the
7-
* hardcoded npx args inside the Figma plugin's UI sources.
5+
* pluginos version: peer package.json manifests and the DXT manifest (both
6+
* the top-level `version` and its `server.mcp_config.args` pin).
7+
*
8+
* Note: the Figma plugin UI (`bridge-plugin/src/ui-entry.ts` and
9+
* `bootloader.html`) reads `mcp-server/package.json#version` at webpack
10+
* build time, so no source-file rewrite is needed there.
811
*/
912
constfs=require("node:fs");
1013
constpath=require("node:path");
@@ -40,20 +43,3 @@ if (Array.isArray(dxt?.server?.mcp_config?.args)) {
4043
}
4144
fs.writeFileSync(dxtAbs,JSON.stringify(dxt,null,2)+"\n");
4245
console.log(`Bumped ${dxtManifestRel}${newVersion}`);
43-
44-
// Sources that hardcode `pluginos@<version>` in copy-paste MCP config snippets.
45-
// These use a regex swap so formatting is preserved.
46-
constsourceTargets=[
47-
"packages/bridge-plugin/src/ui-entry.ts",
48-
"packages/bridge-plugin/src/bootloader.html",
49-
];
50-
51-
for(constrelofsourceTargets){
52-
constabs=path.join(repoRoot,rel);
53-
constbefore=fs.readFileSync(abs,"utf8");
54-
constafter=before.replace(/pluginos@\d+\.\d+\.\d+/g,`pluginos@${newVersion}`);
55-
if(after!==before){
56-
fs.writeFileSync(abs,after);
57-
console.log(`Bumped ${rel} → pluginos@${newVersion}`);
58-
}
59-
}

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 4e24940

Browse files
committed
review: address PR #11 follow-ups (drop debug logs, centralize MCP_VERSION)
Addresses apappascs review on #11. - Remove debug `console.log` calls from `incrementOps()` and `window.onmessage` in `ui-entry.ts`. The instrumentation served its purpose; shipping verbose runtime logging in a polish PR was wrong. - Centralize the `pluginos@<version>` pin via build-time injection. The webpack config now reads `mcp-server/package.json#version` and passes it into the UI bundle (DefinePlugin → `__MCP_VERSION__`) and into `bootloader.html` (`templateParameters` → `<%= MCP_VERSION %>`). Drift becomes impossible because `package.json` is the single source. - Drop the regex sweep in `scripts/bump-lockstep.cjs` over `ui-entry.ts` and `bootloader.html` — no longer needed, those files are templated. - Drop the 2-line `constants.ts` shim. With `resolveJsonModule: true`, `ui-entry.ts` imports `DXT_URL` directly from `constants.json`. - README: add a one-line nudge above the `<details>` install block so Cursor / Claude Code CLI users do not skim past the collapsed section. - ESLint: ignore `.claude/` and `.worktrees/` (parallels `.prettierignore`) so nested Claude Code session worktrees do not poison `npm run lint`. Items 4 and 6 from the review (TIER_1_RULES / INSTALL_COMMAND dedup and bootloader theme-token drift) are deferred to a follow-up issue since both span this PR's scope. Verification: `npm run check` ✅ (lint + format + build:shared + typecheck + build + test). Built `dist/bootloader.html` and `dist/ui.html` both contain the literal `pluginos@0.4.2` from `mcp-server/package.json`.
1 parent 97ab1ae commit 4e24940

7 files changed

Lines changed: 21 additions & 32 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ PluginOS takes a fundamentally different approach:
3030

3131
No JSON editing, no terminal. Note: Claude.ai web is **not** supported — it cannot reach local MCP servers.
3232

33+
Using Cursor or Claude Code CLI? Open the section below for the right config.
34+
3335
<details>
3436
<summary><strong>Other AI tools</strong> (Cursor, Claude Code CLI, manual config)</summary>
3537

‎eslint.config.js‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export default tseslint.config(
1414
"**/*.cjs",
1515
"**/*.mjs",
1616
"!eslint.config.js",
17+
".claude/",
18+
".worktrees/",
1719
],
1820
},
1921
{

‎packages/bridge-plugin/src/bootloader.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
},1000);
144144
}
145145

146-
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@0.4.2"]}}},null,2);
146+
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@<%= MCP_VERSION %>"]}}},null,2);
147147
varTIER_1_RULES="When working with Figma, always use PluginOS tools exclusively:\n- Use `list_operations` (pluginos) first to discover available Figma operations.\n- Use `run_operation` (pluginos) to execute them.\n- Use `execute_figma` (pluginos) only for one-off custom logic not covered by built-in ops.\n- Do NOT use `mcp__Figma__*` tools — they bypass the plugin and return raw, token-heavy data. PluginOS returns pre-summarized, structured results at ~230 tokens/call.\n- If PluginOS returns \"No plugin connected\", open the PluginOS Bridge plugin in Figma before retrying.\n\nAudit/lint/check operations default to `scope: \"selection\"`. Pass `scope: \"page\"` explicitly (and `confirm: true` for pages over 500 nodes) to scan the whole page. Responses carry `_hint` and `_next_hints` fields — respect them when deciding what to do next.";
148148
varINSTALL_COMMAND="/plugin marketplace add github:LSDimi/pluginos\n/plugin install pluginos";
149149
varDXT_URL="<%= DXT_URL %>";

‎packages/bridge-plugin/src/constants.ts‎

Lines changed: 0 additions & 2 deletions
This file was deleted.

‎packages/bridge-plugin/src/ui-entry.ts‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import{DXT_URL}from"./constants";
1+
import{DXT_URL}from"./constants.json";
2+
3+
declareconst__MCP_VERSION__: string;
24

35
constTIER_1_RULES=`When working with Figma, always use PluginOS tools exclusively:
46
- Use \`list_operations\` (pluginos) first to discover available Figma operations.
@@ -13,7 +15,7 @@ const MCP_CONFIG_JSON = `{
1315
"mcpServers": {
1416
"pluginos": {
1517
"command": "npx",
16-
"args": ["-y", "pluginos@0.4.2"]
18+
"args": ["-y", "pluginos@${__MCP_VERSION__}"]
1719
}
1820
}
1921
}`;
@@ -189,8 +191,6 @@ function updateFilename(name: string) {
189191

190192
functionincrementOps(){
191193
opsRunCount++;
192-
// eslint-disable-next-line no-console
193-
console.log("[pluginos:debug] incrementOps called, count="+opsRunCount);
194194
constel=$("ops-run-count");
195195
if(el)el.textContent=opsRunCount+" ops run";
196196
}
@@ -307,10 +307,6 @@ document
307307
window.onmessage=(event: MessageEvent)=>{
308308
constmsg=event.data.pluginMessage;
309309
if(!msg)return;
310-
// eslint-disable-next-line no-console
311-
console.log(
312-
"[pluginos:debug] window.onmessage type="+msg.type+" payload.type="+msg?.payload?.type
313-
);
314310

315311
if(msg.type==="__ui_list_operations_result"){
316312
renderOpsPanel(msg.operations);

‎packages/bridge-plugin/webpack.config.js‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
constpath=require("path");
2+
constwebpack=require("webpack");
23
constHtmlWebpackPlugin=require("html-webpack-plugin");
34
constHtmlInlineScriptPlugin=require("html-inline-script-webpack-plugin");
45

56
const{DXT_URL}=require("./src/constants.json");
7+
const{version: MCP_VERSION}=require("../mcp-server/package.json");
68

79
constnoModernSyntax={
810
arrowFunction: true,
@@ -43,6 +45,9 @@ module.exports = (env, argv) => [
4345
resolve: {extensions: [".ts",".js"]},
4446
devtool: false,
4547
plugins: [
48+
newwebpack.DefinePlugin({
49+
__MCP_VERSION__: JSON.stringify(MCP_VERSION),
50+
}),
4651
newHtmlWebpackPlugin({
4752
template: "./src/ui.html",
4853
filename: "ui.html",
@@ -62,7 +67,7 @@ module.exports = (env, argv) => [
6267
template: "./src/bootloader.html",
6368
filename: "bootloader.html",
6469
inject: false,
65-
templateParameters: {DXT_URL},
70+
templateParameters: {DXT_URL,MCP_VERSION},
6671
}),
6772
],
6873
mode: argv.mode||"production",

‎scripts/bump-lockstep.cjs‎

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
/**
33
* Postversion hook for packages/mcp-server. When `npm version` bumps the
44
* MCP server, propagate the same version string to every file that pins the
5-
* pluginos version: peer package.json manifests, the DXT manifest (both the
6-
* top-level `version` and its `server.mcp_config.args` pin), and the
7-
* hardcoded npx args inside the Figma plugin's UI sources.
5+
* pluginos version: peer package.json manifests and the DXT manifest (both
6+
* the top-level `version` and its `server.mcp_config.args` pin).
7+
*
8+
* Note: the Figma plugin UI (`bridge-plugin/src/ui-entry.ts` and
9+
* `bootloader.html`) reads `mcp-server/package.json#version` at webpack
10+
* build time, so no source-file rewrite is needed there.
811
*/
912
constfs=require("node:fs");
1013
constpath=require("node:path");
@@ -40,20 +43,3 @@ if (Array.isArray(dxt?.server?.mcp_config?.args)) {
4043
}
4144
fs.writeFileSync(dxtAbs,JSON.stringify(dxt,null,2)+"\n");
4245
console.log(`Bumped ${dxtManifestRel}${newVersion}`);
43-
44-
// Sources that hardcode `pluginos@<version>` in copy-paste MCP config snippets.
45-
// These use a regex swap so formatting is preserved.
46-
constsourceTargets=[
47-
"packages/bridge-plugin/src/ui-entry.ts",
48-
"packages/bridge-plugin/src/bootloader.html",
49-
];
50-
51-
for(constrelofsourceTargets){
52-
constabs=path.join(repoRoot,rel);
53-
constbefore=fs.readFileSync(abs,"utf8");
54-
constafter=before.replace(/pluginos@\d+\.\d+\.\d+/g,`pluginos@${newVersion}`);
55-
if(after!==before){
56-
fs.writeFileSync(abs,after);
57-
console.log(`Bumped ${rel} → pluginos@${newVersion}`);
58-
}
59-
}

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 4e24940

Browse files
committed
review: address PR #11 follow-ups (drop debug logs, centralize MCP_VERSION)
Addresses apappascs review on #11. - Remove debug `console.log` calls from `incrementOps()` and `window.onmessage` in `ui-entry.ts`. The instrumentation served its purpose; shipping verbose runtime logging in a polish PR was wrong. - Centralize the `pluginos@<version>` pin via build-time injection. The webpack config now reads `mcp-server/package.json#version` and passes it into the UI bundle (DefinePlugin → `__MCP_VERSION__`) and into `bootloader.html` (`templateParameters` → `<%= MCP_VERSION %>`). Drift becomes impossible because `package.json` is the single source. - Drop the regex sweep in `scripts/bump-lockstep.cjs` over `ui-entry.ts` and `bootloader.html` — no longer needed, those files are templated. - Drop the 2-line `constants.ts` shim. With `resolveJsonModule: true`, `ui-entry.ts` imports `DXT_URL` directly from `constants.json`. - README: add a one-line nudge above the `<details>` install block so Cursor / Claude Code CLI users do not skim past the collapsed section. - ESLint: ignore `.claude/` and `.worktrees/` (parallels `.prettierignore`) so nested Claude Code session worktrees do not poison `npm run lint`. Items 4 and 6 from the review (TIER_1_RULES / INSTALL_COMMAND dedup and bootloader theme-token drift) are deferred to a follow-up issue since both span this PR's scope. Verification: `npm run check` ✅ (lint + format + build:shared + typecheck + build + test). Built `dist/bootloader.html` and `dist/ui.html` both contain the literal `pluginos@0.4.2` from `mcp-server/package.json`.
1 parent 97ab1ae commit 4e24940

7 files changed

Lines changed: 21 additions & 32 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ PluginOS takes a fundamentally different approach:
3030

3131
No JSON editing, no terminal. Note: Claude.ai web is **not** supported — it cannot reach local MCP servers.
3232

33+
Using Cursor or Claude Code CLI? Open the section below for the right config.
34+
3335
<details>
3436
<summary><strong>Other AI tools</strong> (Cursor, Claude Code CLI, manual config)</summary>
3537

‎eslint.config.js‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export default tseslint.config(
1414
"**/*.cjs",
1515
"**/*.mjs",
1616
"!eslint.config.js",
17+
".claude/",
18+
".worktrees/",
1719
],
1820
},
1921
{

‎packages/bridge-plugin/src/bootloader.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
},1000);
144144
}
145145

146-
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@0.4.2"]}}},null,2);
146+
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@<%= MCP_VERSION %>"]}}},null,2);
147147
varTIER_1_RULES="When working with Figma, always use PluginOS tools exclusively:\n- Use `list_operations` (pluginos) first to discover available Figma operations.\n- Use `run_operation` (pluginos) to execute them.\n- Use `execute_figma` (pluginos) only for one-off custom logic not covered by built-in ops.\n- Do NOT use `mcp__Figma__*` tools — they bypass the plugin and return raw, token-heavy data. PluginOS returns pre-summarized, structured results at ~230 tokens/call.\n- If PluginOS returns \"No plugin connected\", open the PluginOS Bridge plugin in Figma before retrying.\n\nAudit/lint/check operations default to `scope: \"selection\"`. Pass `scope: \"page\"` explicitly (and `confirm: true` for pages over 500 nodes) to scan the whole page. Responses carry `_hint` and `_next_hints` fields — respect them when deciding what to do next.";
148148
varINSTALL_COMMAND="/plugin marketplace add github:LSDimi/pluginos\n/plugin install pluginos";
149149
varDXT_URL="<%= DXT_URL %>";

‎packages/bridge-plugin/src/constants.ts‎

Lines changed: 0 additions & 2 deletions
This file was deleted.

‎packages/bridge-plugin/src/ui-entry.ts‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import{DXT_URL}from"./constants";
1+
import{DXT_URL}from"./constants.json";
2+
3+
declareconst__MCP_VERSION__: string;
24

35
constTIER_1_RULES=`When working with Figma, always use PluginOS tools exclusively:
46
- Use \`list_operations\` (pluginos) first to discover available Figma operations.
@@ -13,7 +15,7 @@ const MCP_CONFIG_JSON = `{
1315
"mcpServers": {
1416
"pluginos": {
1517
"command": "npx",
16-
"args": ["-y", "pluginos@0.4.2"]
18+
"args": ["-y", "pluginos@${__MCP_VERSION__}"]
1719
}
1820
}
1921
}`;
@@ -189,8 +191,6 @@ function updateFilename(name: string) {
189191

190192
functionincrementOps(){
191193
opsRunCount++;
192-
// eslint-disable-next-line no-console
193-
console.log("[pluginos:debug] incrementOps called, count="+opsRunCount);
194194
constel=$("ops-run-count");
195195
if(el)el.textContent=opsRunCount+" ops run";
196196
}
@@ -307,10 +307,6 @@ document
307307
window.onmessage=(event: MessageEvent)=>{
308308
constmsg=event.data.pluginMessage;
309309
if(!msg)return;
310-
// eslint-disable-next-line no-console
311-
console.log(
312-
"[pluginos:debug] window.onmessage type="+msg.type+" payload.type="+msg?.payload?.type
313-
);
314310

315311
if(msg.type==="__ui_list_operations_result"){
316312
renderOpsPanel(msg.operations);

‎packages/bridge-plugin/webpack.config.js‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
constpath=require("path");
2+
constwebpack=require("webpack");
23
constHtmlWebpackPlugin=require("html-webpack-plugin");
34
constHtmlInlineScriptPlugin=require("html-inline-script-webpack-plugin");
45

56
const{DXT_URL}=require("./src/constants.json");
7+
const{version: MCP_VERSION}=require("../mcp-server/package.json");
68

79
constnoModernSyntax={
810
arrowFunction: true,
@@ -43,6 +45,9 @@ module.exports = (env, argv) => [
4345
resolve: {extensions: [".ts",".js"]},
4446
devtool: false,
4547
plugins: [
48+
newwebpack.DefinePlugin({
49+
__MCP_VERSION__: JSON.stringify(MCP_VERSION),
50+
}),
4651
newHtmlWebpackPlugin({
4752
template: "./src/ui.html",
4853
filename: "ui.html",
@@ -62,7 +67,7 @@ module.exports = (env, argv) => [
6267
template: "./src/bootloader.html",
6368
filename: "bootloader.html",
6469
inject: false,
65-
templateParameters: {DXT_URL},
70+
templateParameters: {DXT_URL,MCP_VERSION},
6671
}),
6772
],
6873
mode: argv.mode||"production",

‎scripts/bump-lockstep.cjs‎

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
/**
33
* Postversion hook for packages/mcp-server. When `npm version` bumps the
44
* MCP server, propagate the same version string to every file that pins the
5-
* pluginos version: peer package.json manifests, the DXT manifest (both the
6-
* top-level `version` and its `server.mcp_config.args` pin), and the
7-
* hardcoded npx args inside the Figma plugin's UI sources.
5+
* pluginos version: peer package.json manifests and the DXT manifest (both
6+
* the top-level `version` and its `server.mcp_config.args` pin).
7+
*
8+
* Note: the Figma plugin UI (`bridge-plugin/src/ui-entry.ts` and
9+
* `bootloader.html`) reads `mcp-server/package.json#version` at webpack
10+
* build time, so no source-file rewrite is needed there.
811
*/
912
constfs=require("node:fs");
1013
constpath=require("node:path");
@@ -40,20 +43,3 @@ if (Array.isArray(dxt?.server?.mcp_config?.args)) {
4043
}
4144
fs.writeFileSync(dxtAbs,JSON.stringify(dxt,null,2)+"\n");
4245
console.log(`Bumped ${dxtManifestRel}${newVersion}`);
43-
44-
// Sources that hardcode `pluginos@<version>` in copy-paste MCP config snippets.
45-
// These use a regex swap so formatting is preserved.
46-
constsourceTargets=[
47-
"packages/bridge-plugin/src/ui-entry.ts",
48-
"packages/bridge-plugin/src/bootloader.html",
49-
];
50-
51-
for(constrelofsourceTargets){
52-
constabs=path.join(repoRoot,rel);
53-
constbefore=fs.readFileSync(abs,"utf8");
54-
constafter=before.replace(/pluginos@\d+\.\d+\.\d+/g,`pluginos@${newVersion}`);
55-
if(after!==before){
56-
fs.writeFileSync(abs,after);
57-
console.log(`Bumped ${rel} → pluginos@${newVersion}`);
58-
}
59-
}

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Commit 4e24940

Browse files
committed
review: address PR #11 follow-ups (drop debug logs, centralize MCP_VERSION)
Addresses apappascs review on #11. - Remove debug `console.log` calls from `incrementOps()` and `window.onmessage` in `ui-entry.ts`. The instrumentation served its purpose; shipping verbose runtime logging in a polish PR was wrong. - Centralize the `pluginos@<version>` pin via build-time injection. The webpack config now reads `mcp-server/package.json#version` and passes it into the UI bundle (DefinePlugin → `__MCP_VERSION__`) and into `bootloader.html` (`templateParameters` → `<%= MCP_VERSION %>`). Drift becomes impossible because `package.json` is the single source. - Drop the regex sweep in `scripts/bump-lockstep.cjs` over `ui-entry.ts` and `bootloader.html` — no longer needed, those files are templated. - Drop the 2-line `constants.ts` shim. With `resolveJsonModule: true`, `ui-entry.ts` imports `DXT_URL` directly from `constants.json`. - README: add a one-line nudge above the `<details>` install block so Cursor / Claude Code CLI users do not skim past the collapsed section. - ESLint: ignore `.claude/` and `.worktrees/` (parallels `.prettierignore`) so nested Claude Code session worktrees do not poison `npm run lint`. Items 4 and 6 from the review (TIER_1_RULES / INSTALL_COMMAND dedup and bootloader theme-token drift) are deferred to a follow-up issue since both span this PR's scope. Verification: `npm run check` ✅ (lint + format + build:shared + typecheck + build + test). Built `dist/bootloader.html` and `dist/ui.html` both contain the literal `pluginos@0.4.2` from `mcp-server/package.json`.
1 parent 97ab1ae commit 4e24940

7 files changed

Lines changed: 21 additions & 32 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ PluginOS takes a fundamentally different approach:
3030

3131
No JSON editing, no terminal. Note: Claude.ai web is **not** supported — it cannot reach local MCP servers.
3232

33+
Using Cursor or Claude Code CLI? Open the section below for the right config.
34+
3335
<details>
3436
<summary><strong>Other AI tools</strong> (Cursor, Claude Code CLI, manual config)</summary>
3537

‎eslint.config.js‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export default tseslint.config(
1414
"**/*.cjs",
1515
"**/*.mjs",
1616
"!eslint.config.js",
17+
".claude/",
18+
".worktrees/",
1719
],
1820
},
1921
{

‎packages/bridge-plugin/src/bootloader.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
},1000);
144144
}
145145

146-
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@0.4.2"]}}},null,2);
146+
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@<%= MCP_VERSION %>"]}}},null,2);
147147
varTIER_1_RULES="When working with Figma, always use PluginOS tools exclusively:\n- Use `list_operations` (pluginos) first to discover available Figma operations.\n- Use `run_operation` (pluginos) to execute them.\n- Use `execute_figma` (pluginos) only for one-off custom logic not covered by built-in ops.\n- Do NOT use `mcp__Figma__*` tools — they bypass the plugin and return raw, token-heavy data. PluginOS returns pre-summarized, structured results at ~230 tokens/call.\n- If PluginOS returns \"No plugin connected\", open the PluginOS Bridge plugin in Figma before retrying.\n\nAudit/lint/check operations default to `scope: \"selection\"`. Pass `scope: \"page\"` explicitly (and `confirm: true` for pages over 500 nodes) to scan the whole page. Responses carry `_hint` and `_next_hints` fields — respect them when deciding what to do next.";
148148
varINSTALL_COMMAND="/plugin marketplace add github:LSDimi/pluginos\n/plugin install pluginos";
149149
varDXT_URL="<%= DXT_URL %>";

‎packages/bridge-plugin/src/constants.ts‎

Lines changed: 0 additions & 2 deletions
This file was deleted.

‎packages/bridge-plugin/src/ui-entry.ts‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import{DXT_URL}from"./constants";
1+
import{DXT_URL}from"./constants.json";
2+
3+
declareconst__MCP_VERSION__: string;
24

35
constTIER_1_RULES=`When working with Figma, always use PluginOS tools exclusively:
46
- Use \`list_operations\` (pluginos) first to discover available Figma operations.
@@ -13,7 +15,7 @@ const MCP_CONFIG_JSON = `{
1315
"mcpServers": {
1416
"pluginos": {
1517
"command": "npx",
16-
"args": ["-y", "pluginos@0.4.2"]
18+
"args": ["-y", "pluginos@${__MCP_VERSION__}"]
1719
}
1820
}
1921
}`;
@@ -189,8 +191,6 @@ function updateFilename(name: string) {
189191

190192
functionincrementOps(){
191193
opsRunCount++;
192-
// eslint-disable-next-line no-console
193-
console.log("[pluginos:debug] incrementOps called, count="+opsRunCount);
194194
constel=$("ops-run-count");
195195
if(el)el.textContent=opsRunCount+" ops run";
196196
}
@@ -307,10 +307,6 @@ document
307307
window.onmessage=(event: MessageEvent)=>{
308308
constmsg=event.data.pluginMessage;
309309
if(!msg)return;
310-
// eslint-disable-next-line no-console
311-
console.log(
312-
"[pluginos:debug] window.onmessage type="+msg.type+" payload.type="+msg?.payload?.type
313-
);
314310

315311
if(msg.type==="__ui_list_operations_result"){
316312
renderOpsPanel(msg.operations);

‎packages/bridge-plugin/webpack.config.js‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
constpath=require("path");
2+
constwebpack=require("webpack");
23
constHtmlWebpackPlugin=require("html-webpack-plugin");
34
constHtmlInlineScriptPlugin=require("html-inline-script-webpack-plugin");
45

56
const{DXT_URL}=require("./src/constants.json");
7+
const{version: MCP_VERSION}=require("../mcp-server/package.json");
68

79
constnoModernSyntax={
810
arrowFunction: true,
@@ -43,6 +45,9 @@ module.exports = (env, argv) => [
4345
resolve: {extensions: [".ts",".js"]},
4446
devtool: false,
4547
plugins: [
48+
newwebpack.DefinePlugin({
49+
__MCP_VERSION__: JSON.stringify(MCP_VERSION),
50+
}),
4651
newHtmlWebpackPlugin({
4752
template: "./src/ui.html",
4853
filename: "ui.html",
@@ -62,7 +67,7 @@ module.exports = (env, argv) => [
6267
template: "./src/bootloader.html",
6368
filename: "bootloader.html",
6469
inject: false,
65-
templateParameters: {DXT_URL},
70+
templateParameters: {DXT_URL,MCP_VERSION},
6671
}),
6772
],
6873
mode: argv.mode||"production",

‎scripts/bump-lockstep.cjs‎

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
/**
33
* Postversion hook for packages/mcp-server. When `npm version` bumps the
44
* MCP server, propagate the same version string to every file that pins the
5-
* pluginos version: peer package.json manifests, the DXT manifest (both the
6-
* top-level `version` and its `server.mcp_config.args` pin), and the
7-
* hardcoded npx args inside the Figma plugin's UI sources.
5+
* pluginos version: peer package.json manifests and the DXT manifest (both
6+
* the top-level `version` and its `server.mcp_config.args` pin).
7+
*
8+
* Note: the Figma plugin UI (`bridge-plugin/src/ui-entry.ts` and
9+
* `bootloader.html`) reads `mcp-server/package.json#version` at webpack
10+
* build time, so no source-file rewrite is needed there.
811
*/
912
constfs=require("node:fs");
1013
constpath=require("node:path");
@@ -40,20 +43,3 @@ if (Array.isArray(dxt?.server?.mcp_config?.args)) {
4043
}
4144
fs.writeFileSync(dxtAbs,JSON.stringify(dxt,null,2)+"\n");
4245
console.log(`Bumped ${dxtManifestRel}${newVersion}`);
43-
44-
// Sources that hardcode `pluginos@<version>` in copy-paste MCP config snippets.
45-
// These use a regex swap so formatting is preserved.
46-
constsourceTargets=[
47-
"packages/bridge-plugin/src/ui-entry.ts",
48-
"packages/bridge-plugin/src/bootloader.html",
49-
];
50-
51-
for(constrelofsourceTargets){
52-
constabs=path.join(repoRoot,rel);
53-
constbefore=fs.readFileSync(abs,"utf8");
54-
constafter=before.replace(/pluginos@\d+\.\d+\.\d+/g,`pluginos@${newVersion}`);
55-
if(after!==before){
56-
fs.writeFileSync(abs,after);
57-
console.log(`Bumped ${rel} → pluginos@${newVersion}`);
58-
}
59-
}

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 4e24940

Browse files
committed
review: address PR #11 follow-ups (drop debug logs, centralize MCP_VERSION)
Addresses apappascs review on #11. - Remove debug `console.log` calls from `incrementOps()` and `window.onmessage` in `ui-entry.ts`. The instrumentation served its purpose; shipping verbose runtime logging in a polish PR was wrong. - Centralize the `pluginos@<version>` pin via build-time injection. The webpack config now reads `mcp-server/package.json#version` and passes it into the UI bundle (DefinePlugin → `__MCP_VERSION__`) and into `bootloader.html` (`templateParameters` → `<%= MCP_VERSION %>`). Drift becomes impossible because `package.json` is the single source. - Drop the regex sweep in `scripts/bump-lockstep.cjs` over `ui-entry.ts` and `bootloader.html` — no longer needed, those files are templated. - Drop the 2-line `constants.ts` shim. With `resolveJsonModule: true`, `ui-entry.ts` imports `DXT_URL` directly from `constants.json`. - README: add a one-line nudge above the `<details>` install block so Cursor / Claude Code CLI users do not skim past the collapsed section. - ESLint: ignore `.claude/` and `.worktrees/` (parallels `.prettierignore`) so nested Claude Code session worktrees do not poison `npm run lint`. Items 4 and 6 from the review (TIER_1_RULES / INSTALL_COMMAND dedup and bootloader theme-token drift) are deferred to a follow-up issue since both span this PR's scope. Verification: `npm run check` ✅ (lint + format + build:shared + typecheck + build + test). Built `dist/bootloader.html` and `dist/ui.html` both contain the literal `pluginos@0.4.2` from `mcp-server/package.json`.
1 parent 97ab1ae commit 4e24940

7 files changed

Lines changed: 21 additions & 32 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ PluginOS takes a fundamentally different approach:
3030

3131
No JSON editing, no terminal. Note: Claude.ai web is **not** supported — it cannot reach local MCP servers.
3232

33+
Using Cursor or Claude Code CLI? Open the section below for the right config.
34+
3335
<details>
3436
<summary><strong>Other AI tools</strong> (Cursor, Claude Code CLI, manual config)</summary>
3537

‎eslint.config.js‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export default tseslint.config(
1414
"**/*.cjs",
1515
"**/*.mjs",
1616
"!eslint.config.js",
17+
".claude/",
18+
".worktrees/",
1719
],
1820
},
1921
{

‎packages/bridge-plugin/src/bootloader.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
},1000);
144144
}
145145

146-
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@0.4.2"]}}},null,2);
146+
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@<%= MCP_VERSION %>"]}}},null,2);
147147
varTIER_1_RULES="When working with Figma, always use PluginOS tools exclusively:\n- Use `list_operations` (pluginos) first to discover available Figma operations.\n- Use `run_operation` (pluginos) to execute them.\n- Use `execute_figma` (pluginos) only for one-off custom logic not covered by built-in ops.\n- Do NOT use `mcp__Figma__*` tools — they bypass the plugin and return raw, token-heavy data. PluginOS returns pre-summarized, structured results at ~230 tokens/call.\n- If PluginOS returns \"No plugin connected\", open the PluginOS Bridge plugin in Figma before retrying.\n\nAudit/lint/check operations default to `scope: \"selection\"`. Pass `scope: \"page\"` explicitly (and `confirm: true` for pages over 500 nodes) to scan the whole page. Responses carry `_hint` and `_next_hints` fields — respect them when deciding what to do next.";
148148
varINSTALL_COMMAND="/plugin marketplace add github:LSDimi/pluginos\n/plugin install pluginos";
149149
varDXT_URL="<%= DXT_URL %>";

‎packages/bridge-plugin/src/constants.ts‎

Lines changed: 0 additions & 2 deletions
This file was deleted.

‎packages/bridge-plugin/src/ui-entry.ts‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import{DXT_URL}from"./constants";
1+
import{DXT_URL}from"./constants.json";
2+
3+
declareconst__MCP_VERSION__: string;
24

35
constTIER_1_RULES=`When working with Figma, always use PluginOS tools exclusively:
46
- Use \`list_operations\` (pluginos) first to discover available Figma operations.
@@ -13,7 +15,7 @@ const MCP_CONFIG_JSON = `{
1315
"mcpServers": {
1416
"pluginos": {
1517
"command": "npx",
16-
"args": ["-y", "pluginos@0.4.2"]
18+
"args": ["-y", "pluginos@${__MCP_VERSION__}"]
1719
}
1820
}
1921
}`;
@@ -189,8 +191,6 @@ function updateFilename(name: string) {
189191

190192
functionincrementOps(){
191193
opsRunCount++;
192-
// eslint-disable-next-line no-console
193-
console.log("[pluginos:debug] incrementOps called, count="+opsRunCount);
194194
constel=$("ops-run-count");
195195
if(el)el.textContent=opsRunCount+" ops run";
196196
}
@@ -307,10 +307,6 @@ document
307307
window.onmessage=(event: MessageEvent)=>{
308308
constmsg=event.data.pluginMessage;
309309
if(!msg)return;
310-
// eslint-disable-next-line no-console
311-
console.log(
312-
"[pluginos:debug] window.onmessage type="+msg.type+" payload.type="+msg?.payload?.type
313-
);
314310

315311
if(msg.type==="__ui_list_operations_result"){
316312
renderOpsPanel(msg.operations);

‎packages/bridge-plugin/webpack.config.js‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
constpath=require("path");
2+
constwebpack=require("webpack");
23
constHtmlWebpackPlugin=require("html-webpack-plugin");
34
constHtmlInlineScriptPlugin=require("html-inline-script-webpack-plugin");
45

56
const{DXT_URL}=require("./src/constants.json");
7+
const{version: MCP_VERSION}=require("../mcp-server/package.json");
68

79
constnoModernSyntax={
810
arrowFunction: true,
@@ -43,6 +45,9 @@ module.exports = (env, argv) => [
4345
resolve: {extensions: [".ts",".js"]},
4446
devtool: false,
4547
plugins: [
48+
newwebpack.DefinePlugin({
49+
__MCP_VERSION__: JSON.stringify(MCP_VERSION),
50+
}),
4651
newHtmlWebpackPlugin({
4752
template: "./src/ui.html",
4853
filename: "ui.html",
@@ -62,7 +67,7 @@ module.exports = (env, argv) => [
6267
template: "./src/bootloader.html",
6368
filename: "bootloader.html",
6469
inject: false,
65-
templateParameters: {DXT_URL},
70+
templateParameters: {DXT_URL,MCP_VERSION},
6671
}),
6772
],
6873
mode: argv.mode||"production",

‎scripts/bump-lockstep.cjs‎

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
/**
33
* Postversion hook for packages/mcp-server. When `npm version` bumps the
44
* MCP server, propagate the same version string to every file that pins the
5-
* pluginos version: peer package.json manifests, the DXT manifest (both the
6-
* top-level `version` and its `server.mcp_config.args` pin), and the
7-
* hardcoded npx args inside the Figma plugin's UI sources.
5+
* pluginos version: peer package.json manifests and the DXT manifest (both
6+
* the top-level `version` and its `server.mcp_config.args` pin).
7+
*
8+
* Note: the Figma plugin UI (`bridge-plugin/src/ui-entry.ts` and
9+
* `bootloader.html`) reads `mcp-server/package.json#version` at webpack
10+
* build time, so no source-file rewrite is needed there.
811
*/
912
constfs=require("node:fs");
1013
constpath=require("node:path");
@@ -40,20 +43,3 @@ if (Array.isArray(dxt?.server?.mcp_config?.args)) {
4043
}
4144
fs.writeFileSync(dxtAbs,JSON.stringify(dxt,null,2)+"\n");
4245
console.log(`Bumped ${dxtManifestRel}${newVersion}`);
43-
44-
// Sources that hardcode `pluginos@<version>` in copy-paste MCP config snippets.
45-
// These use a regex swap so formatting is preserved.
46-
constsourceTargets=[
47-
"packages/bridge-plugin/src/ui-entry.ts",
48-
"packages/bridge-plugin/src/bootloader.html",
49-
];
50-
51-
for(constrelofsourceTargets){
52-
constabs=path.join(repoRoot,rel);
53-
constbefore=fs.readFileSync(abs,"utf8");
54-
constafter=before.replace(/pluginos@\d+\.\d+\.\d+/g,`pluginos@${newVersion}`);
55-
if(after!==before){
56-
fs.writeFileSync(abs,after);
57-
console.log(`Bumped ${rel} → pluginos@${newVersion}`);
58-
}
59-
}

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Commit 4e24940

Browse files
committed
review: address PR #11 follow-ups (drop debug logs, centralize MCP_VERSION)
Addresses apappascs review on #11. - Remove debug `console.log` calls from `incrementOps()` and `window.onmessage` in `ui-entry.ts`. The instrumentation served its purpose; shipping verbose runtime logging in a polish PR was wrong. - Centralize the `pluginos@<version>` pin via build-time injection. The webpack config now reads `mcp-server/package.json#version` and passes it into the UI bundle (DefinePlugin → `__MCP_VERSION__`) and into `bootloader.html` (`templateParameters` → `<%= MCP_VERSION %>`). Drift becomes impossible because `package.json` is the single source. - Drop the regex sweep in `scripts/bump-lockstep.cjs` over `ui-entry.ts` and `bootloader.html` — no longer needed, those files are templated. - Drop the 2-line `constants.ts` shim. With `resolveJsonModule: true`, `ui-entry.ts` imports `DXT_URL` directly from `constants.json`. - README: add a one-line nudge above the `<details>` install block so Cursor / Claude Code CLI users do not skim past the collapsed section. - ESLint: ignore `.claude/` and `.worktrees/` (parallels `.prettierignore`) so nested Claude Code session worktrees do not poison `npm run lint`. Items 4 and 6 from the review (TIER_1_RULES / INSTALL_COMMAND dedup and bootloader theme-token drift) are deferred to a follow-up issue since both span this PR's scope. Verification: `npm run check` ✅ (lint + format + build:shared + typecheck + build + test). Built `dist/bootloader.html` and `dist/ui.html` both contain the literal `pluginos@0.4.2` from `mcp-server/package.json`.
1 parent 97ab1ae commit 4e24940

7 files changed

Lines changed: 21 additions & 32 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ PluginOS takes a fundamentally different approach:
3030

3131
No JSON editing, no terminal. Note: Claude.ai web is **not** supported — it cannot reach local MCP servers.
3232

33+
Using Cursor or Claude Code CLI? Open the section below for the right config.
34+
3335
<details>
3436
<summary><strong>Other AI tools</strong> (Cursor, Claude Code CLI, manual config)</summary>
3537

‎eslint.config.js‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export default tseslint.config(
1414
"**/*.cjs",
1515
"**/*.mjs",
1616
"!eslint.config.js",
17+
".claude/",
18+
".worktrees/",
1719
],
1820
},
1921
{

‎packages/bridge-plugin/src/bootloader.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
},1000);
144144
}
145145

146-
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@0.4.2"]}}},null,2);
146+
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@<%= MCP_VERSION %>"]}}},null,2);
147147
varTIER_1_RULES="When working with Figma, always use PluginOS tools exclusively:\n- Use `list_operations` (pluginos) first to discover available Figma operations.\n- Use `run_operation` (pluginos) to execute them.\n- Use `execute_figma` (pluginos) only for one-off custom logic not covered by built-in ops.\n- Do NOT use `mcp__Figma__*` tools — they bypass the plugin and return raw, token-heavy data. PluginOS returns pre-summarized, structured results at ~230 tokens/call.\n- If PluginOS returns \"No plugin connected\", open the PluginOS Bridge plugin in Figma before retrying.\n\nAudit/lint/check operations default to `scope: \"selection\"`. Pass `scope: \"page\"` explicitly (and `confirm: true` for pages over 500 nodes) to scan the whole page. Responses carry `_hint` and `_next_hints` fields — respect them when deciding what to do next.";
148148
varINSTALL_COMMAND="/plugin marketplace add github:LSDimi/pluginos\n/plugin install pluginos";
149149
varDXT_URL="<%= DXT_URL %>";

‎packages/bridge-plugin/src/constants.ts‎

Lines changed: 0 additions & 2 deletions
This file was deleted.

‎packages/bridge-plugin/src/ui-entry.ts‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import{DXT_URL}from"./constants";
1+
import{DXT_URL}from"./constants.json";
2+
3+
declareconst__MCP_VERSION__: string;
24

35
constTIER_1_RULES=`When working with Figma, always use PluginOS tools exclusively:
46
- Use \`list_operations\` (pluginos) first to discover available Figma operations.
@@ -13,7 +15,7 @@ const MCP_CONFIG_JSON = `{
1315
"mcpServers": {
1416
"pluginos": {
1517
"command": "npx",
16-
"args": ["-y", "pluginos@0.4.2"]
18+
"args": ["-y", "pluginos@${__MCP_VERSION__}"]
1719
}
1820
}
1921
}`;
@@ -189,8 +191,6 @@ function updateFilename(name: string) {
189191

190192
functionincrementOps(){
191193
opsRunCount++;
192-
// eslint-disable-next-line no-console
193-
console.log("[pluginos:debug] incrementOps called, count="+opsRunCount);
194194
constel=$("ops-run-count");
195195
if(el)el.textContent=opsRunCount+" ops run";
196196
}
@@ -307,10 +307,6 @@ document
307307
window.onmessage=(event: MessageEvent)=>{
308308
constmsg=event.data.pluginMessage;
309309
if(!msg)return;
310-
// eslint-disable-next-line no-console
311-
console.log(
312-
"[pluginos:debug] window.onmessage type="+msg.type+" payload.type="+msg?.payload?.type
313-
);
314310

315311
if(msg.type==="__ui_list_operations_result"){
316312
renderOpsPanel(msg.operations);

‎packages/bridge-plugin/webpack.config.js‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
constpath=require("path");
2+
constwebpack=require("webpack");
23
constHtmlWebpackPlugin=require("html-webpack-plugin");
34
constHtmlInlineScriptPlugin=require("html-inline-script-webpack-plugin");
45

56
const{DXT_URL}=require("./src/constants.json");
7+
const{version: MCP_VERSION}=require("../mcp-server/package.json");
68

79
constnoModernSyntax={
810
arrowFunction: true,
@@ -43,6 +45,9 @@ module.exports = (env, argv) => [
4345
resolve: {extensions: [".ts",".js"]},
4446
devtool: false,
4547
plugins: [
48+
newwebpack.DefinePlugin({
49+
__MCP_VERSION__: JSON.stringify(MCP_VERSION),
50+
}),
4651
newHtmlWebpackPlugin({
4752
template: "./src/ui.html",
4853
filename: "ui.html",
@@ -62,7 +67,7 @@ module.exports = (env, argv) => [
6267
template: "./src/bootloader.html",
6368
filename: "bootloader.html",
6469
inject: false,
65-
templateParameters: {DXT_URL},
70+
templateParameters: {DXT_URL,MCP_VERSION},
6671
}),
6772
],
6873
mode: argv.mode||"production",

‎scripts/bump-lockstep.cjs‎

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
/**
33
* Postversion hook for packages/mcp-server. When `npm version` bumps the
44
* MCP server, propagate the same version string to every file that pins the
5-
* pluginos version: peer package.json manifests, the DXT manifest (both the
6-
* top-level `version` and its `server.mcp_config.args` pin), and the
7-
* hardcoded npx args inside the Figma plugin's UI sources.
5+
* pluginos version: peer package.json manifests and the DXT manifest (both
6+
* the top-level `version` and its `server.mcp_config.args` pin).
7+
*
8+
* Note: the Figma plugin UI (`bridge-plugin/src/ui-entry.ts` and
9+
* `bootloader.html`) reads `mcp-server/package.json#version` at webpack
10+
* build time, so no source-file rewrite is needed there.
811
*/
912
constfs=require("node:fs");
1013
constpath=require("node:path");
@@ -40,20 +43,3 @@ if (Array.isArray(dxt?.server?.mcp_config?.args)) {
4043
}
4144
fs.writeFileSync(dxtAbs,JSON.stringify(dxt,null,2)+"\n");
4245
console.log(`Bumped ${dxtManifestRel}${newVersion}`);
43-
44-
// Sources that hardcode `pluginos@<version>` in copy-paste MCP config snippets.
45-
// These use a regex swap so formatting is preserved.
46-
constsourceTargets=[
47-
"packages/bridge-plugin/src/ui-entry.ts",
48-
"packages/bridge-plugin/src/bootloader.html",
49-
];
50-
51-
for(constrelofsourceTargets){
52-
constabs=path.join(repoRoot,rel);
53-
constbefore=fs.readFileSync(abs,"utf8");
54-
constafter=before.replace(/pluginos@\d+\.\d+\.\d+/g,`pluginos@${newVersion}`);
55-
if(after!==before){
56-
fs.writeFileSync(abs,after);
57-
console.log(`Bumped ${rel} → pluginos@${newVersion}`);
58-
}
59-
}

0 commit comments

Comments
 (0)
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Commit 4e24940

Browse files
committed
review: address PR #11 follow-ups (drop debug logs, centralize MCP_VERSION)
Addresses apappascs review on #11. - Remove debug `console.log` calls from `incrementOps()` and `window.onmessage` in `ui-entry.ts`. The instrumentation served its purpose; shipping verbose runtime logging in a polish PR was wrong. - Centralize the `pluginos@<version>` pin via build-time injection. The webpack config now reads `mcp-server/package.json#version` and passes it into the UI bundle (DefinePlugin → `__MCP_VERSION__`) and into `bootloader.html` (`templateParameters` → `<%= MCP_VERSION %>`). Drift becomes impossible because `package.json` is the single source. - Drop the regex sweep in `scripts/bump-lockstep.cjs` over `ui-entry.ts` and `bootloader.html` — no longer needed, those files are templated. - Drop the 2-line `constants.ts` shim. With `resolveJsonModule: true`, `ui-entry.ts` imports `DXT_URL` directly from `constants.json`. - README: add a one-line nudge above the `<details>` install block so Cursor / Claude Code CLI users do not skim past the collapsed section. - ESLint: ignore `.claude/` and `.worktrees/` (parallels `.prettierignore`) so nested Claude Code session worktrees do not poison `npm run lint`. Items 4 and 6 from the review (TIER_1_RULES / INSTALL_COMMAND dedup and bootloader theme-token drift) are deferred to a follow-up issue since both span this PR's scope. Verification: `npm run check` ✅ (lint + format + build:shared + typecheck + build + test). Built `dist/bootloader.html` and `dist/ui.html` both contain the literal `pluginos@0.4.2` from `mcp-server/package.json`.
1 parent 97ab1ae commit 4e24940

7 files changed

Lines changed: 21 additions & 32 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ PluginOS takes a fundamentally different approach:
3030

3131
No JSON editing, no terminal. Note: Claude.ai web is **not** supported — it cannot reach local MCP servers.
3232

33+
Using Cursor or Claude Code CLI? Open the section below for the right config.
34+
3335
<details>
3436
<summary><strong>Other AI tools</strong> (Cursor, Claude Code CLI, manual config)</summary>
3537

‎eslint.config.js‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export default tseslint.config(
1414
"**/*.cjs",
1515
"**/*.mjs",
1616
"!eslint.config.js",
17+
".claude/",
18+
".worktrees/",
1719
],
1820
},
1921
{

‎packages/bridge-plugin/src/bootloader.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
},1000);
144144
}
145145

146-
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@0.4.2"]}}},null,2);
146+
varMCP_CONFIG_JSON=JSON.stringify({mcpServers: {pluginos: {command: "npx",args: ["-y","pluginos@<%= MCP_VERSION %>"]}}},null,2);
147147
varTIER_1_RULES="When working with Figma, always use PluginOS tools exclusively:\n- Use `list_operations` (pluginos) first to discover available Figma operations.\n- Use `run_operation` (pluginos) to execute them.\n- Use `execute_figma` (pluginos) only for one-off custom logic not covered by built-in ops.\n- Do NOT use `mcp__Figma__*` tools — they bypass the plugin and return raw, token-heavy data. PluginOS returns pre-summarized, structured results at ~230 tokens/call.\n- If PluginOS returns \"No plugin connected\", open the PluginOS Bridge plugin in Figma before retrying.\n\nAudit/lint/check operations default to `scope: \"selection\"`. Pass `scope: \"page\"` explicitly (and `confirm: true` for pages over 500 nodes) to scan the whole page. Responses carry `_hint` and `_next_hints` fields — respect them when deciding what to do next.";
148148
varINSTALL_COMMAND="/plugin marketplace add github:LSDimi/pluginos\n/plugin install pluginos";
149149
varDXT_URL="<%= DXT_URL %>";

‎packages/bridge-plugin/src/constants.ts‎

Lines changed: 0 additions & 2 deletions
This file was deleted.

‎packages/bridge-plugin/src/ui-entry.ts‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import{DXT_URL}from"./constants";
1+
import{DXT_URL}from"./constants.json";
2+
3+
declareconst__MCP_VERSION__: string;
24

35
constTIER_1_RULES=`When working with Figma, always use PluginOS tools exclusively:
46
- Use \`list_operations\` (pluginos) first to discover available Figma operations.
@@ -13,7 +15,7 @@ const MCP_CONFIG_JSON = `{
1315
"mcpServers": {
1416
"pluginos": {
1517
"command": "npx",
16-
"args": ["-y", "pluginos@0.4.2"]
18+
"args": ["-y", "pluginos@${__MCP_VERSION__}"]
1719
}
1820
}
1921
}`;
@@ -189,8 +191,6 @@ function updateFilename(name: string) {
189191

190192
functionincrementOps(){
191193
opsRunCount++;
192-
// eslint-disable-next-line no-console
193-
console.log("[pluginos:debug] incrementOps called, count="+opsRunCount);
194194
constel=$("ops-run-count");
195195
if(el)el.textContent=opsRunCount+" ops run";
196196
}
@@ -307,10 +307,6 @@ document
307307
window.onmessage=(event: MessageEvent)=>{
308308
constmsg=event.data.pluginMessage;
309309
if(!msg)return;
310-
// eslint-disable-next-line no-console
311-
console.log(
312-
"[pluginos:debug] window.onmessage type="+msg.type+" payload.type="+msg?.payload?.type
313-
);
314310

315311
if(msg.type==="__ui_list_operations_result"){
316312
renderOpsPanel(msg.operations);

‎packages/bridge-plugin/webpack.config.js‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
constpath=require("path");
2+
constwebpack=require("webpack");
23
constHtmlWebpackPlugin=require("html-webpack-plugin");
34
constHtmlInlineScriptPlugin=require("html-inline-script-webpack-plugin");
45

56
const{DXT_URL}=require("./src/constants.json");
7+
const{version: MCP_VERSION}=require("../mcp-server/package.json");
68

79
constnoModernSyntax={
810
arrowFunction: true,
@@ -43,6 +45,9 @@ module.exports = (env, argv) => [
4345
resolve: {extensions: [".ts",".js"]},
4446
devtool: false,
4547
plugins: [
48+
newwebpack.DefinePlugin({
49+
__MCP_VERSION__: JSON.stringify(MCP_VERSION),
50+
}),
4651
newHtmlWebpackPlugin({
4752
template: "./src/ui.html",
4853
filename: "ui.html",
@@ -62,7 +67,7 @@ module.exports = (env, argv) => [
6267
template: "./src/bootloader.html",
6368
filename: "bootloader.html",
6469
inject: false,
65-
templateParameters: {DXT_URL},
70+
templateParameters: {DXT_URL,MCP_VERSION},
6671
}),
6772
],
6873
mode: argv.mode||"production",

‎scripts/bump-lockstep.cjs‎

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
/**
33
* Postversion hook for packages/mcp-server. When `npm version` bumps the
44
* MCP server, propagate the same version string to every file that pins the
5-
* pluginos version: peer package.json manifests, the DXT manifest (both the
6-
* top-level `version` and its `server.mcp_config.args` pin), and the
7-
* hardcoded npx args inside the Figma plugin's UI sources.
5+
* pluginos version: peer package.json manifests and the DXT manifest (both
6+
* the top-level `version` and its `server.mcp_config.args` pin).
7+
*
8+
* Note: the Figma plugin UI (`bridge-plugin/src/ui-entry.ts` and
9+
* `bootloader.html`) reads `mcp-server/package.json#version` at webpack
10+
* build time, so no source-file rewrite is needed there.
811
*/
912
constfs=require("node:fs");
1013
constpath=require("node:path");
@@ -40,20 +43,3 @@ if (Array.isArray(dxt?.server?.mcp_config?.args)) {
4043
}
4144
fs.writeFileSync(dxtAbs,JSON.stringify(dxt,null,2)+"\n");
4245
console.log(`Bumped ${dxtManifestRel}${newVersion}`);
43-
44-
// Sources that hardcode `pluginos@<version>` in copy-paste MCP config snippets.
45-
// These use a regex swap so formatting is preserved.
46-
constsourceTargets=[
47-
"packages/bridge-plugin/src/ui-entry.ts",
48-
"packages/bridge-plugin/src/bootloader.html",
49-
];
50-
51-
for(constrelofsourceTargets){
52-
constabs=path.join(repoRoot,rel);
53-
constbefore=fs.readFileSync(abs,"utf8");
54-
constafter=before.replace(/pluginos@\d+\.\d+\.\d+/g,`pluginos@${newVersion}`);
55-
if(after!==before){
56-
fs.writeFileSync(abs,after);
57-
console.log(`Bumped ${rel} → pluginos@${newVersion}`);
58-
}
59-
}

0 commit comments

Comments
 (0)