Skill: xiangst0816/dessix-skill (version 1.1.0)

--- name: dessix-skill description: Access a local Dessix desktop workspace by calling the Electron MCP bridge directly from Node.js (socket/pipe), without using MCP stdio JSON-RPC. Use when an agent needs to read or invoke Dessix tools programmatically, build local automations, or fetch Action/Scene prompt content from Dessix blocks. metadata: {"openclaw": {"requires": {"env": ["DESSIX_MCP_BRIDGE_ENDPOINT"], "bins": ["node"]}, "primaryEnv": "DESSIX_MCP_BRIDGE_ENDPOINT", "os": ["darwin", "linux", "win32"], "homepage": "https://github.com/DessixIO/skill"}} --- # Dessix Skill Call the local Dessix bridge directly through a line-delimited JSON socket protocol. Use `scripts/dessix-bridge.mjs` for all requests instead of re-implementing socket logic. ## Workflow 1. (Optional) Locate bundled MCP script path dynamically: ```bash node scripts/dessix-bridge.mjs locate-mcp-script ``` 2. Verify the bridge is reachable: ```bash node scripts/dessix-bridge.mjs health ``` 3. List workspaces: ```bash node scripts/dessix-bridge.mjs invoke \ --tool dessix_list_workspaces \ --args '{}' ``` 4. Call target tool with JSON args: ```bash node scripts/dessix-bridge.mjs invoke \ --tool dessix_search_blocks \ --args '{"query":"MCP","limit":10}' ``` 5. Read a Skill prompt from an Action/Scene block: ```bash node scripts/dessix-bridge.mjs invoke \ --tool dessix_get_skill \ --args '{"block_id":"<BLOCK_ID>"}' ``` ## Notes - Start Dessix desktop app first. The bridge is served by the Electron app process. - To discover bundled MCP script path at runtime, use `node scripts/dessix-bridge.mjs locate-mcp-script`. - Override auto-detection with `DESSIX_MCP_SCRIPT_PATH` (or `--mcpScriptPath <path>`). - Current built-in candidates include: - macOS: `/Applications/Dessix.app/Contents/Resources/electron/compiled/dessix-mcp.js` - Windows: `%LOCALAPPDATA%\\Programs\\Dessix\\resources\\electron\\compiled\\dessix-mcp.js` - If `DESSIX_MCP_BRIDGE_ENDPOINT` is unset, this bridge client uses platform endpoint defaults: - macOS/Linux: `~/.dessix/mcp/dessix-mcp-bridge.sock` - Windows: `\\\\.\\pipe\\dessix-mcp-bridge` - Use compact JSON for `--args`. Invalid JSON fails fast. - Read `references/dessix-tools.md` for tool names and argument templates. ## Multi-Step Workflows Combine tools to achieve higher-level goals. Validate outputs before any write. ### Skill Discovery Build a skill map for the current workspace (read-only): ```bash node scripts/dessix-bridge.mjs invoke --tool dessix_get_current_workspace --args '{}' node scripts/dessix-bridge.mjs invoke --tool dessix_search_blocks --args '{"types":["Action","Scene"],"limit":100}' # for each block_id in results: node scripts/dessix-bridge.mjs invoke --tool dessix_get_skill --args '{"block_id":"<BLOCK_ID>"}' ``` ### Topic to Skill Draft Turn a discussion thread into a reusable Action/Scene block: ```bash node scripts/dessix-bridge.mjs invoke --tool dessix_get_topic_context --args '{"topic_id":"<THREAD_BLOCK_ID>"}' node scripts/dessix-bridge.mjs invoke --tool dessix_search_blocks --args '{"semantic":"related skills and constraints","limit":20}' # draft title+content from combined context, then: node scripts/dessix-bridge.mjs invoke --tool dessix_create_block --args '{"patch":{"type":"Action","title":"<TITLE>","content":"<CONTENT>"}}' ``` ### Skill Maintenance Find and refresh stale skill blocks: ```bash node scripts/dessix-bridge.mjs invoke --tool dessix_search_blocks --args '{"query":"skill","types":["Action","Scene"],"limit":50}' node scripts/dessix-bridge.mjs invoke --tool dessix_read_block --args '{"block_id":"<BLOCK_ID>"}' # compare current state, then patch: node scripts/dessix-bridge.mjs invoke --tool dessix_update_block --args '{"block_id":"<BLOCK_ID>","patch":{"title":"<UPDATED>","content":"<UPDATED>"}}' ``` ### Safety - Run read-only workflows first; escalate to writes only after validating `block_id` and result counts. - Compact JSON only for `--args`.

path: README.md
content: # Dessix Skill

A Claude Code skill for interacting with the local [Dessix](https://github.com/openclaw/clawhub) desktop workspace. It calls the Electron MCP bridge directly via a line-delimited JSON socket protocol, letting an agent read, search, and invoke Dessix tools programmatically.

## Installation

### Via npx (recommended)

```bash
npx skills add dessix-skill
```

### Via git clone

```bash
git clone https://github.com/DessixIO/skill.git
cd skill
```

### Manual

Copy `SKILL.md`, `scripts/`, and `references/` into your project.

## Prerequisites

- **Node.js** (v18+)
- **Dessix desktop app** running (the bridge is served by the Electron process)
- (Optional) Set `DESSIX_MCP_BRIDGE_ENDPOINT` to override the default socket path

## Usage

Check bridge connectivity:

```bash
node scripts/dessix-bridge.mjs health
```

List workspaces:

```bash
node scripts/dessix-bridge.mjs invoke --tool dessix_list_workspaces --args '{}'
```

Search blocks:

```bash
node scripts/dessix-bridge.mjs invoke --tool dessix_search_blocks --args '{"query":"MCP","limit":10}'
```

See `SKILL.md` for full workflow examples and `references/dessix-tools.md` for the complete tool reference.

## Publishing to ClawHub

Install the CLI globally:

```bash
npm i -g clawhub
```

Login (opens browser):

```bash
clawhub login
```

### First release

```bash
npm run clawhub:publish -- --version 1.0.0 --changelog "Initial release"
```

### Iterative updates (auto patch bump)

```bash
npm run clawhub:sync
```

### Minor / major release

```bash
npm run clawhub:sync -- --bump minor --changelog "Add new workflow"
npm run clawhub:sync -- --bump major --changelog "Breaking changes"
```

### Dry run (preview without uploading)

```bash
clawhub sync --root . --dry-run
```

## Project Structure

```
├── SKILL.md              # Skill definition (consumed by Claude Code)
├── package.json          # npm scripts for bridge & publishing
├── scripts/
│   └── dessix-bridge.mjs # Bridge client (health, invoke, locate-mcp-script)
└── references/
    └── dessix-tools.md   # Tool names and argument templates
```

## License

See [LICENSE](./LICENSE).


path: eslint.config.mjs
content: import js from '@eslint/js';
import globals from 'globals';

export default [
  js.configs.recommended,
  {
    languageOptions: {
      ecmaVersion: 'latest',
      sourceType: 'module',
      globals: {
        ...globals.node,
      },
    },
    rules: {
      'no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
      'no-console': 'off',
    },
  },
  {
    ignores: ['node_modules/'],
  },
];


path: package-lock.json
content: {
  "name": "@dessix/skill",
  "version": "0.1.0",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "name": "@dessix/skill",
      "version": "0.1.0",
      "devDependencies": {
        "@eslint/js": "^10.0.1",
        "eslint": "^10.0.2",
        "globals": "^17.3.0",
        "prettier": "^3.8.1"
      }
    },
    "node_modules/@eslint-community/eslint-utils": {
      "version": "4.9.1",
      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "eslint-visitor-keys": "^3.4.3"
      },
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      },
      "peerDependencies": {
        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
      }
    },
    "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
      "version": "3.4.3",
      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "Apache-2.0",
      "engines": {
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      }
    },
    "node_modules/@eslint-community/regexpp": {
      "version": "4.12.2",
      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
      }
    },
    "node_modules/@eslint/config-array": {
      "version": "0.23.2",
      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.2.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "Apache-2.0",
      "dependencies": {
        "@eslint/object-schema": "^3.0.2",
        "debug": "^4.3.1",
        "minimatch": "^10.2.1"
      },
      "engines": {
        "node": "^20.19.0 || ^22.13.0 || >=24"
      }
    },
    "node_modules/@eslint/config-helpers": {
      "version": "0.5.2",
      "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.2.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "Apache-2.0",
      "dependencies": {
        "@eslint/core": "^1.1.0"
      },
      "engines": {
        "node": "^20.19.0 || ^22.13.0 || >=24"
      }
    },
    "node_modules/@eslint/core": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "Apache-2.0",
      "dependencies": {
        "@types/json-schema": "^7.0.15"
      },
      "engines": {
        "node": "^20.19.0 || ^22.13.0 || >=24"
      }
    },
    "node_modules/@eslint/js": {
      "version": "10.0.1",
      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": "^20.19.0 || ^22.13.0 || >=24"
      },
      "funding": {
        "url": "https://eslint.org/donate"
      },
      "peerDependencies": {
        "eslint": "^10.0.0"
      },
      "peerDependenciesMeta": {
        "eslint": {
          "optional": true
        }
      }
    },
    "node_modules/@eslint/object-schema": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "Apache-2.0",
      "engines": {
        "node": "^20.19.0 || ^22.13.0 || >=24"
      }
    },
    "node_modules/@eslint/plugin-kit": {
      "version": "0.6.0",
      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "Apache-2.0",
      "dependencies": {
        "@eslint/core": "^1.1.0",
        "levn": "^0.4.1"
      },
      "engines": {
        "node": "^20.19.0 || ^22.13.0 || >=24"
      }
    },
    "node_modules/@humanfs/core": {
      "version": "0.19.1",
      "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "Apache-2.0",
      "engines": {
        "node": ">=18.18.0"
      }
    },
    "node_modules/@humanfs/node": {
      "version": "0.16.7",
      "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "Apache-2.0",
      "dependencies": {
        "@humanfs/core": "^0.19.1",
        "@humanwhocodes/retry": "^0.4.0"
      },
      "engines": {
        "node": ">=18.18.0"
      }
    },
    "node_modules/@humanwhocodes/module-importer": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "Apache-2.0",
      "engines": {
        "node": ">=12.22"
      },
      "funding": {
        "type": "github",
        "url": "https://github.com/sponsors/nzakas"
      }
    },
    "node_modules/@humanwhocodes/retry": {
      "version": "0.4.3",
      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "Apache-2.0",
      "engines": {
        "node": ">=18.18"
      },
      "funding": {
        "type": "github",
        "url": "https://github.com/sponsors/nzakas"
      }
    },
    "node_modules/@types/esrecurse": {
      "version": "4.3.1",
      "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT"
    },
    "node_modules/@types/estree": {
      "version": "1.0.8",
      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT"
    },
    "node_modules/@types/json-schema": {
      "version": "7.0.15",
      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT"
    },
    "node_modules/acorn": {
      "version": "8.16.0",
      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "bin": {
        "acorn": "bin/acorn"
      },
      "engines": {
        "node": ">=0.4.0"
      }
    },
    "node_modules/acorn-jsx": {
      "version": "5.3.2",
      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "peerDependencies": {
        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
      }
    },
    "node_modules/ajv": {
      "version": "6.14.0",
      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "fast-deep-equal": "^3.1.1",
        "fast-json-stable-stringify": "^2.0.0",
        "json-schema-traverse": "^0.4.1",
        "uri-js": "^4.2.2"
      },
      "funding": {
        "type": "github",
        "url": "https://github.com/sponsors/epoberezkin"
      }
    },
    "node_modules/balanced-match": {
      "version": "4.0.4",
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": "18 || 20 || >=22"
      }
    },
    "node_modules/brace-expansion": {
      "version": "5.0.3",
      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "balanced-match": "^4.0.2"
      },
      "engines": {
        "node": "18 || 20 || >=22"
      }
    },
    "node_modules/cross-spawn": {
      "version": "7.0.6",
      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "path-key": "^3.1.0",
        "shebang-command": "^2.0.0",
        "which": "^2.0.1"
      },
      "engines": {
        "node": ">= 8"
      }
    },
    "node_modules/debug": {
      "version": "4.4.3",
      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "ms": "^2.1.3"
      },
      "engines": {
        "node": ">=6.0"
      },
      "peerDependenciesMeta": {
        "supports-color": {
          "optional": true
        }
      }
    },
    "node_modules/deep-is": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT"
    },
    "node_modules/escape-string-regexp": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/eslint": {
      "version": "10.0.2",
      "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "@eslint-community/eslint-utils": "^4.8.0",
        "@eslint-community/regexpp": "^4.12.2",
        "@eslint/config-array": "^0.23.2",
        "@eslint/config-helpers": "^0.5.2",
        "@eslint/core": "^1.1.0",
        "@eslint/plugin-kit": "^0.6.0",
        "@humanfs/node": "^0.16.6",
        "@humanwhocodes/module-importer": "^1.0.1",
        "@humanwhocodes/retry": "^0.4.2",
        "@types/estree": "^1.0.6",
        "ajv": "^6.14.0",
        "cross-spawn": "^7.0.6",
        "debug": "^4.3.2",
        "escape-string-regexp": "^4.0.0",
        "eslint-scope": "^9.1.1",
        "eslint-visitor-keys": "^5.0.1",
        "espree": "^11.1.1",
        "esquery": "^1.7.0",
        "esutils": "^2.0.2",
        "fast-deep-equal": "^3.1.3",
        "file-entry-cache": "^8.0.0",
        "find-up": "^5.0.0",
        "glob-parent": "^6.0.2",
        "ignore": "^5.2.0",
        "imurmurhash": "^0.1.4",
        "is-glob": "^4.0.0",
        "json-stable-stringify-without-jsonify": "^1.0.1",
        "minimatch": "^10.2.1",
        "natural-compare": "^1.4.0",
        "optionator": "^0.9.3"
      },
      "bin": {
        "eslint": "bin/eslint.js"
      },
      "engines": {
        "node": "^20.19.0 || ^22.13.0 || >=24"
      },
      "funding": {
        "url": "https://eslint.org/donate"
      },
      "peerDependencies": {
        "jiti": "*"
      },
      "peerDependenciesMeta": {
        "jiti": {
          "optional": true
        }
      }
    },
    "node_modules/eslint-scope": {
      "version": "9.1.1",
      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "BSD-2-Clause",
      "dependencies": {
        "@types/esrecurse": "^4.3.1",
        "@types/estree": "^1.0.8",
        "esrecurse": "^4.3.0",
        "estraverse": "^5.2.0"
      },
      "engines": {
        "node": "^20.19.0 || ^22.13.0 || >=24"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      }
    },
    "node_modules/eslint-visitor-keys": {
      "version": "5.0.1",
      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "Apache-2.0",
      "engines": {
        "node": "^20.19.0 || ^22.13.0 || >=24"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      }
    },
    "node_modules/espree": {
      "version": "11.1.1",
      "resolved": "https://registry.npmjs.org/espree/-/espree-11.1.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "BSD-2-Clause",
      "dependencies": {
        "acorn": "^8.16.0",
        "acorn-jsx": "^5.3.2",
        "eslint-visitor-keys": "^5.0.1"
      },
      "engines": {
        "node": "^20.19.0 || ^22.13.0 || >=24"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      }
    },
    "node_modules/esquery": {
      "version": "1.7.0",
      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "BSD-3-Clause",
      "dependencies": {
        "estraverse": "^5.1.0"
      },
      "engines": {
        "node": ">=0.10"
      }
    },
    "node_modules/esrecurse": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "BSD-2-Clause",
      "dependencies": {
        "estraverse": "^5.2.0"
      },
      "engines": {
        "node": ">=4.0"
      }
    },
    "node_modules/estraverse": {
      "version": "5.3.0",
      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "BSD-2-Clause",
      "engines": {
        "node": ">=4.0"
      }
    },
    "node_modules/esutils": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "BSD-2-Clause",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/fast-deep-equal": {
      "version": "3.1.3",
      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT"
    },
    "node_modules/fast-json-stable-stringify": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT"
    },
    "node_modules/fast-levenshtein": {
      "version": "2.0.6",
      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT"
    },
    "node_modules/file-entry-cache": {
      "version": "8.0.0",
      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "flat-cache": "^4.0.0"
      },
      "engines": {
        "node": ">=16.0.0"
      }
    },
    "node_modules/find-up": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "locate-path": "^6.0.0",
        "path-exists": "^4.0.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/flat-cache": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "flatted": "^3.2.9",
        "keyv": "^4.5.4"
      },
      "engines": {
        "node": ">=16"
      }
    },
    "node_modules/flatted": {
      "version": "3.3.3",
      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "ISC"
    },
    "node_modules/glob-parent": {
      "version": "6.0.2",
      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "ISC",
      "dependencies": {
        "is-glob": "^4.0.3"
      },
      "engines": {
        "node": ">=10.13.0"
      }
    },
    "node_modules/globals": {
      "version": "17.3.0",
      "resolved": "https://registry.npmjs.org/globals/-/globals-17.3.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": ">=18"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/ignore": {
      "version": "5.3.2",
      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": ">= 4"
      }
    },
    "node_modules/imurmurhash": {
      "version": "0.1.4",
      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": ">=0.8.19"
      }
    },
    "node_modules/is-extglob": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/is-glob": {
      "version": "4.0.3",
      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "is-extglob": "^2.1.1"
      },
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/isexe": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "ISC"
    },
    "node_modules/json-buffer": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT"
    },
    "node_modules/json-schema-traverse": {
      "version": "0.4.1",
      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT"
    },
    "node_modules/json-stable-stringify-without-jsonify": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT"
    },
    "node_modules/keyv": {
      "version": "4.5.4",
      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "json-buffer": "3.0.1"
      }
    },
    "node_modules/levn": {
      "version": "0.4.1",
      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "prelude-ls": "^1.2.1",
        "type-check": "~0.4.0"
      },
      "engines": {
        "node": ">= 0.8.0"
      }
    },
    "node_modules/locate-path": {
      "version": "6.0.0",
      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "p-locate": "^5.0.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/minimatch": {
      "version": "10.2.4",
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "BlueOak-1.0.0",
      "dependencies": {
        "brace-expansion": "^5.0.2"
      },
      "engines": {
        "node": "18 || 20 || >=22"
      },
      "funding": {
        "url": "https://github.com/sponsors/isaacs"
      }
    },
    "node_modules/ms": {
      "version": "2.1.3",
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT"
    },
    "node_modules/natural-compare": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT"
    },
    "node_modules/optionator": {
      "version": "0.9.4",
      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "deep-is": "^0.1.3",
        "fast-levenshtein": "^2.0.6",
        "levn": "^0.4.1",
        "prelude-ls": "^1.2.1",
        "type-check": "^0.4.0",
        "word-wrap": "^1.2.5"
      },
      "engines": {
        "node": ">= 0.8.0"
      }
    },
    "node_modules/p-limit": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "yocto-queue": "^0.1.0"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/p-locate": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "p-limit": "^3.0.2"
      },
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/path-exists": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/path-key": {
      "version": "3.1.1",
      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/prelude-ls": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": ">= 0.8.0"
      }
    },
    "node_modules/prettier": {
      "version": "3.8.1",
      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "bin": {
        "prettier": "bin/prettier.cjs"
      },
      "engines": {
        "node": ">=14"
      },
      "funding": {
        "url": "https://github.com/prettier/prettier?sponsor=1"
      }
    },
    "node_modules/punycode": {
      "version": "2.3.1",
      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/shebang-command": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "shebang-regex": "^3.0.0"
      },
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/shebang-regex": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/type-check": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "dependencies": {
        "prelude-ls": "^1.2.1"
      },
      "engines": {
        "node": ">= 0.8.0"
      }
    },
    "node_modules/uri-js": {
      "version": "4.4.1",
      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "BSD-2-Clause",
      "dependencies": {
        "punycode": "^2.1.0"
      }
    },
    "node_modules/which": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "ISC",
      "dependencies": {
        "isexe": "^2.0.0"
      },
      "bin": {
        "node-which": "bin/node-which"
      },
      "engines": {
        "node": ">= 8"
      }
    },
    "node_modules/word-wrap": {
      "version": "1.2.5",
      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/yocto-queue": {
      "version": "0.1.0",
      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "dev": true,
      "license": "MIT",
      "engines": {
        "node": ">=10"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    }
  }
}


path: package.json
content: {
  "name": "@dessix/skill",
  "private": true,
  "version": "0.1.0",
  "description": "Dessix skills workspace for ClawHub publishing.",
  "scripts": {
    "lint": "eslint .",
    "lint:fix": "eslint . --fix",
    "format": "prettier --check .",
    "format:fix": "prettier --write .",
    "bridge:health": "node ./scripts/dessix-bridge.mjs health",
    "bridge:invoke": "node ./scripts/dessix-bridge.mjs invoke",
    "clawhub:publish": "clawhub publish . --slug dessix-skill --name \"Dessix Skill\" --tags latest",
    "clawhub:sync": "clawhub sync --root . --bump patch --tags latest"
  },
  "devDependencies": {
    "@eslint/js": "^10.0.1",
    "eslint": "^10.0.2",
    "globals": "^17.3.0",
    "prettier": "^3.8.1"
  }
}


path: references/dessix-tools.md
content: # Dessix MCP Tool Quick Reference

Use these tool names with:

```bash
node scripts/dessix-bridge.mjs invoke --tool <TOOL_NAME> --args '<JSON>'
```

## Workspace

- `dessix_list_workspaces`
  - args: `{}`
- `dessix_get_current_workspace`
  - args: `{}`
- `dessix_create_workspace`
  - args: `{"title":"My Workspace","description":"optional","logo":"optional"}`
- `dessix_update_workspace`
  - args: `{"workspace_id":"<WS_ID>","patch":{"title":"New Title"}}`

## Block Search and Read

- `dessix_search_blocks`
  - keyword query: `{"query":"pricing","limit":20}`
  - semantic query: `{"semantic":"notes about user retention","limit":20}`
  - types only: `{"types":["Action","Scene"],"limit":100}`
- `dessix_read_block`
  - args: `{"block_id":"<BLOCK_ID>"}`

## Block Write

- `dessix_create_block`
  - args: `{"patch":{"type":"Note","title":"Weekly Note","content":"body text"}}`
- `dessix_update_block`
  - args: `{"block_id":"<BLOCK_ID>","patch":{"title":"Updated","content":"new body"}}`
- `dessix_delete_block`
  - args: `{"block_id":"<BLOCK_ID>"}`
- `dessix_restore_block`
  - args: `{"block_id":"<BLOCK_ID>"}`

## Topic and Skill

- `dessix_get_topic_context`
  - args: `{"topic_id":"<THREAD_BLOCK_ID>"}`
- `dessix_get_skill`
  - args: `{"block_id":"<ACTION_OR_SCENE_BLOCK_ID>"}`


path: scripts/dessix-bridge.mjs
content: #!/usr/bin/env node
import os from "node:os";
import path from "node:path";
import net from "node:net";
import fs from "node:fs";

function getDefaultBridgeEndpoint() {
    if (process.platform === "win32") {
        return "\\\\.\\pipe\\dessix-mcp-bridge";
    }
    return path.join(os.homedir(), ".dessix", "mcp", "dessix-mcp-bridge.sock");
}

function resolveBridgeEndpoint() {
    return process.env.DESSIX_MCP_BRIDGE_ENDPOINT?.trim() || getDefaultBridgeEndpoint();
}

function parseArgv(argv) {
    const [command, ...rest] = argv;
    const options = {};
    for (let i = 0; i < rest.length; i += 1) {
        const key = rest[i];
        if (key === "--") continue;
        const value = rest[i + 1];
        if (!key?.startsWith("--")) continue;
        const normalizedKey = key.slice(2);
        if (!normalizedKey) continue;
        if (!value || value === "--" || value.startsWith("--")) {
            options[normalizedKey] = "true";
            continue;
        }
        options[normalizedKey] = value;
        i += 1;
    }
    return {command, options};
}

function createRequest(command, options) {
    const id = `${Date.now()}-${Math.random().toString(16).slice(2)}`;
    if (command === "health") {
        return {id, method: "health", params: {}};
    }
    if (command === "invoke") {
        const tool = String(options.tool || "").trim();
        if (!tool) {
            throw new Error("missing --tool for invoke");
        }
        let args = {};
        if (options.args) {
            try {
                args = JSON.parse(options.args);
            } catch {
                throw new Error("invalid JSON in --args");
            }
        }
        return {
            id,
            method: "invoke",
            params: {
                tool,
                args,
                requestId: options.requestId || `script-${id}`,
            },
        };
    }
    throw new Error("unknown command; use: health | invoke");
}

function getMcpScriptCandidates() {
    if (process.platform === "darwin") {
        return ["/Applications/Dessix.app/Contents/Resources/electron/compiled/dessix-mcp.js"];
    }
    if (process.platform === "win32") {
        return [
            path.join(
                process.env.LOCALAPPDATA || "",
                "Programs",
                "Dessix",
                "resources",
                "electron",
                "compiled",
                "dessix-mcp.js"
            ),
            path.join(
                process.env.USERPROFILE || "",
                "AppData",
                "Local",
                "Programs",
                "Dessix",
                "resources",
                "electron",
                "compiled",
                "dessix-mcp.js"
            ),
        ].filter(Boolean);
    }
    return [
        "/opt/Dessix/resources/electron/compiled/dessix-mcp.js",
        path.join(os.homedir(), ".local", "share", "Dessix", "resources", "electron", "compiled", "dessix-mcp.js"),
    ];
}

function resolveMcpScriptPath(explicitPath = "") {
    const envPath = process.env.DESSIX_MCP_SCRIPT_PATH?.trim();
    if (envPath && fs.existsSync(envPath)) {
        return envPath;
    }
    const normalizedExplicitPath = String(explicitPath || "").trim();
    if (normalizedExplicitPath && fs.existsSync(normalizedExplicitPath)) {
        return normalizedExplicitPath;
    }
    for (const candidate of getMcpScriptCandidates()) {
        if (candidate && fs.existsSync(candidate)) {
            return candidate;
        }
    }
    return "";
}

function bridgeRequest(endpoint, payload, timeoutMs = 5000) {
    return new Promise((resolve, reject) => {
        const socket = net.createConnection(endpoint);
        const timer = setTimeout(() => {
            socket.destroy();
            reject(new Error("BRIDGE_TIMEOUT"));
        }, timeoutMs);

        let buffer = "";
        let settled = false;

        const settle = (fn) => {
            if (settled) return;
            settled = true;
            clearTimeout(timer);
            socket.destroy();
            fn();
        };

        socket.on("connect", () => {
            socket.write(`${JSON.stringify(payload)}\n`);
        });

        socket.on("data", (chunk) => {
            buffer += chunk.toString("utf8");
            const newlineIndex = buffer.indexOf("\n");
            if (newlineIndex === -1) return;
            const line = buffer.slice(0, newlineIndex).trim();
            if (!line) return;
            try {
                const parsed = JSON.parse(line);
                settle(() => resolve(parsed));
            } catch {
                settle(() => reject(new Error("BRIDGE_BAD_RESPONSE")));
            }
        });

        socket.on("error", (error) => {
            settle(() => reject(error));
        });

        socket.on("end", () => {
            if (!settled) {
                settle(() => reject(new Error("BRIDGE_CLOSED")));
            }
        });
    });
}

function printUsage() {
    process.stdout.write(
        [
            "Usage:",
            "  node scripts/dessix-bridge.mjs health",
            "  node scripts/dessix-bridge.mjs locate-mcp-script",
            "  node scripts/dessix-bridge.mjs invoke --tool <tool_name> --args '<json>'",
            "",
            "Examples:",
            "  node scripts/dessix-bridge.mjs health",
            "  node scripts/dessix-bridge.mjs locate-mcp-script",
            "  node scripts/dessix-bridge.mjs invoke --tool dessix_list_workspaces --args '{}'",
            "  node scripts/dessix-bridge.mjs invoke --tool dessix_search_blocks --args '{\"query\":\"MCP\",\"limit\":5}'",
        ].join("\n")
    );
}

async function main() {
    const {command, options} = parseArgv(process.argv.slice(2));
    if (!command || command === "--help" || command === "-h" || command === "help") {
        printUsage();
        process.exit(0);
    }

    if (command === "locate-mcp-script") {
        const scriptPath = resolveMcpScriptPath(options.mcpScriptPath);
        if (!scriptPath) {
            throw new Error(
                "DESSIX_MCP_SCRIPT_NOT_FOUND (set DESSIX_MCP_SCRIPT_PATH or install Dessix desktop app)"
            );
        }
        process.stdout.write(
            `${JSON.stringify({ok: true, path: scriptPath, platform: process.platform}, null, 2)}\n`
        );
        process.exit(0);
    }

    const endpoint = resolveBridgeEndpoint();
    const payload = createRequest(command, options);
    const result = await bridgeRequest(endpoint, payload);
    process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);

    if (!result?.ok) {
        process.exit(1);
    }
    const bridgeResult = result?.result;
    if (bridgeResult && typeof bridgeResult === "object" && bridgeResult.ok === false) {
        process.exit(2);
    }
}

main().catch((error) => {
    process.stderr.write(`[dessix-bridge-script] ${error instanceof Error ? error.message : String(error)}\n`);
    process.exit(1);
});


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal:  | SkillSpector: suspicious (MEDIUM)