diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..e7aed2b --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,39 @@ +name: Release + +on: + push: + tags: + - "v*" + +permissions: + contents: write + +jobs: + dxt: + name: Build and upload pluginos.dxt + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Build shared + run: npm run build:shared + + - name: Build mcp-server + run: npm run build -w packages/mcp-server + + - name: Build DXT artifact + run: npm run build:dxt -w packages/mcp-server + + - name: Upload DXT to release + uses: softprops/action-gh-release@v2 + with: + files: packages/mcp-server/dist/pluginos.dxt + fail_on_unmatched_files: true diff --git a/README.md b/README.md index 4c8b15a..6169276 100644 --- a/README.md +++ b/README.md @@ -22,16 +22,15 @@ PluginOS takes a fundamentally different approach: ### 1. Install for your agent -Pick whichever tool you're using. The Bridge Plugin (step 2) is the same for all three. +Pick whichever tool you're using. The Bridge Plugin (step 2) is the same for all of them. -**Claude Code (recommended — one command):** +**Claude Desktop (recommended for designers — one click):** -```bash -/plugin marketplace add github:LSDimi/pluginos -/plugin install pluginos -``` +1. Download [`pluginos.dxt`](https://github.com/LSDimi/pluginos/releases/latest/download/pluginos.dxt) from the latest GitHub Release. +2. Double-click the downloaded file. Claude Desktop opens an install dialog. +3. Confirm. PluginOS appears in Claude Desktop's connector list. -This installs the MCP server registration and the `pluginos-figma` skill in one step. +No JSON editing, no terminal. Note: Claude.ai web is **not** supported — it cannot reach local MCP servers. **Cursor (`.cursor/mcp.json`):** @@ -40,7 +39,7 @@ This installs the MCP server registration and the `pluginos-figma` skill in one "mcpServers": { "pluginos": { "command": "npx", - "args": ["pluginos@latest"] + "args": ["-y", "pluginos@latest"] } } } @@ -48,16 +47,23 @@ This installs the MCP server registration and the `pluginos-figma` skill in one Then paste the Tier 1 rules below into `.cursorrules` so Cursor prefers PluginOS over the generic Figma MCP. -**Claude chat / Desktop (no Code):** +**Claude Code (CLI — engineers):** + +```bash +/plugin marketplace add github:LSDimi/pluginos +/plugin install pluginos +``` + +Installs the MCP server registration and the `pluginos-figma` skill in one step. -Add the same MCP server block to Claude Desktop's `mcp.json`: +**Manual (advanced — edit `claude_desktop_config.json` directly):** ```json { "mcpServers": { "pluginos": { "command": "npx", - "args": ["pluginos@latest"] + "args": ["-y", "pluginos@latest"] } } } diff --git a/eslint.config.js b/eslint.config.js index f867a79..d4b3105 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -7,7 +7,14 @@ export default tseslint.config( ...tseslint.configs.recommended, eslintConfigPrettier, { - ignores: ["**/dist/", "**/node_modules/", "**/*.js", "**/*.cjs", "!eslint.config.js"], + ignores: [ + "**/dist/", + "**/node_modules/", + "**/*.js", + "**/*.cjs", + "**/*.mjs", + "!eslint.config.js", + ], }, { files: ["**/*.ts"], diff --git a/package-lock.json b/package-lock.json index d0682e5..48b64ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1279,6 +1279,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/adm-zip": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.8.tgz", + "integrity": "sha512-RVVH7QvZYbN+ihqZ4kX/dMiowf6o+Jk1fNwiSdx0NahBJLU787zkULhGhJM8mf/obmLGmgdMM0bXsQTmyfbR7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -2009,6 +2019,16 @@ "node": ">=0.4.0" } }, + "node_modules/adm-zip": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz", + "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, "node_modules/ajv": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", @@ -7669,8 +7689,10 @@ }, "devDependencies": { "@pluginos/shared": "*", + "@types/adm-zip": "^0.5.8", "@types/ws": "^8.5.0", "@vitest/coverage-v8": "^2.1.9", + "adm-zip": "^0.5.17", "tsup": "^8.5.1", "tsx": "^4.19.0", "typescript": "^5.5.0", diff --git a/packages/bridge-plugin/src/bootloader.html b/packages/bridge-plugin/src/bootloader.html index 40b1497..e79bf51 100644 --- a/packages/bridge-plugin/src/bootloader.html +++ b/packages/bridge-plugin/src/bootloader.html @@ -25,18 +25,17 @@ .status-sub { font-size: 10px; color: var(--figma-color-text-secondary, #999); margin-top: 1px; } .divider { height: 1px; background: var(--figma-color-border, #e5e5e5); } .setup-section { padding: 10px 12px 0; display: none; } - .action-card { - width: 100%; display: flex; align-items: center; gap: 10px; - padding: 8px 10px; margin-bottom: 7px; - background: var(--figma-color-bg-secondary, #f5f5f5); - border: 1px solid var(--figma-color-border, #e5e5e5); - border-radius: 6px; cursor: pointer; text-align: left; - font-family: inherit; font-size: 11px; transition: background 0.15s; - } - .action-card:hover { background: var(--figma-color-bg-hover, #ebebeb); } - .action-icon { font-size: 15px; flex-shrink: 0; width: 18px; text-align: center; } - .action-title { font-size: 11px; font-weight: 600; color: var(--figma-color-text); } - .action-desc { font-size: 10px; color: var(--figma-color-text-secondary, #999); margin-top: 1px; } + .setup-cards { display: flex; flex-direction: column; gap: 8px; } + .card { padding: 10px 12px; background: var(--figma-color-bg-secondary, #f5f5f5); border: 1px solid var(--figma-color-border, #e5e5e5); border-radius: 6px; } + .card-title { font-size: 11px; font-weight: 600; color: var(--figma-color-text); margin-bottom: 4px; } + .card-desc { font-size: 10px; color: var(--figma-color-text-secondary, #999); margin-bottom: 8px; } + .card-actions { display: flex; flex-wrap: wrap; gap: 6px; } + .btn { font-family: inherit; font-size: 10px; padding: 4px 10px; border: 1px solid var(--figma-color-border, #e5e5e5); border-radius: 4px; background: var(--figma-color-bg, #fff); color: var(--figma-color-text, #111); cursor: pointer; transition: background 0.15s; } + .btn:hover { background: var(--figma-color-bg-hover, #ebebeb); } + .btn.copied { color: #1bc47d; border-color: #1bc47d; } + .btn-primary { background: var(--figma-color-text, #111); color: var(--figma-color-bg, #fff); border-color: var(--figma-color-text, #111); text-decoration: none; display: inline-block; } + .btn-primary:hover { opacity: 0.9; } + a.btn { text-decoration: none; } .progress-section { padding: 8px 12px 10px; display: none; } .progress-bar { height: 2px; background: var(--figma-color-border, #e5e5e5); border-radius: 1px; overflow: hidden; } .progress-fill { height: 100%; width: 0%; background: #f5a623; border-radius: 1px; } @@ -59,20 +58,32 @@