{"_id":"@0ct0s3c/cursor-to-opencode","_rev":"9-1c05f11e0dce05a44c947b6132efc28a","name":"@0ct0s3c/cursor-to-opencode","dist-tags":{"latest":"1.0.6"},"versions":{"1.0.1":{"name":"@0ct0s3c/cursor-to-opencode","version":"1.0.1","keywords":["opencode","cursor","cursor-to-opencode","cursor-rules","plugin","ai"],"author":"","license":"MIT","_id":"@0ct0s3c/cursor-to-opencode@1.0.1","maintainers":[{"name":"octosec","email":"ardian@octosec.io"}],"dist":{"shasum":"e7bcb83004a2577cab2ba35a68579476cd0f6016","tarball":"https://registry.npmjs.org/@0ct0s3c/cursor-to-opencode/-/cursor-to-opencode-1.0.1.tgz","fileCount":6,"integrity":"sha512-6z60Kymcy/uHeZcJm+0P2M/j1POyDUy+pVPUB3aNvhtp4T+z1D+p0Hqh8cN75km7SHN7kR1faCI84SGgCsf3Yg==","signatures":[{"sig":"MEUCIQDcDtIJ+hMXGFcBJFMU5lqLVmM9cPn3MVJgTg2SQompRgIgJQlTzJAM7PnFQlQmuhYjPINHZiyN4W8o366DLlyGh8w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112239},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./server":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f99a97e0aec4a939122d9917847d8ffdcdc47cb3","scripts":{"ci":"npm run typecheck && npm run test && npm run build && npm run verify:package && npm run pack:dry","test":"vitest run","build":"tsup src/index.ts --format esm --dts --clean --sourcemap","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","deploy":"node scripts/deploy.mjs","prepack":"npm run build","pack:dry":"npm pack --dry-run","typecheck":"tsc --noEmit","verify:package":"node scripts/verify-package.mjs","prepare:release":"node scripts/prepare-release.mjs"},"_npmUser":{"name":"octosec","email":"ardian@octosec.io"},"_npmVersion":"11.4.2","description":"OpenCode plugin that loads Cursor rules from .cursor/rules.","directories":{},"sideEffects":false,"_nodeVersion":"24.3.0","dependencies":{"yaml":"^2.8.4","picomatch":"^4.0.4","@opencode-ai/plugin":"^1.14.41"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^6.0.3","@types/node":"^25.6.2","@types/picomatch":"^4.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cursor-to-opencode_1.0.1_1778333624282_0.3227883815334607","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@0ct0s3c/cursor-to-opencode","version":"1.0.2","keywords":["opencode","cursor","cursor-to-opencode","cursor-rules","plugin","ai"],"author":"","license":"MIT","_id":"@0ct0s3c/cursor-to-opencode@1.0.2","maintainers":[{"name":"octosec","email":"admin@octolus.net"}],"dist":{"shasum":"97d2963b52d026a0654ce926ff5e11e0358f9282","tarball":"https://registry.npmjs.org/@0ct0s3c/cursor-to-opencode/-/cursor-to-opencode-1.0.2.tgz","fileCount":6,"integrity":"sha512-L8037jJkoW7iwhTTVXiDjEPJawWsuLFPRn27HY9LjqS5Asv3dJiW2qQzA7n3pN/5bApWcwLJlt2yvRwlcq/piA==","signatures":[{"sig":"MEUCIQDlzI+g0LYPcwH6k92sPwqyqhYRRD0J5gyF2Tnhnyz5+gIgODlod0tmfF6FkIeOTz7IbBtFXMIpEwmAbns83vxILm0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115340},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./server":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f99a97e0aec4a939122d9917847d8ffdcdc47cb3","scripts":{"ci":"npm run typecheck && npm run test && npm run build && npm run verify:package && npm run pack:dry","test":"vitest run","build":"tsup src/index.ts --format esm --dts --clean --sourcemap","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","deploy":"node scripts/deploy.mjs","prepack":"npm run build","pack:dry":"npm pack --dry-run","typecheck":"tsc --noEmit","verify:package":"node scripts/verify-package.mjs","prepare:release":"node scripts/prepare-release.mjs"},"_npmUser":{"name":"octosec","email":"admin@octolus.net"},"_npmVersion":"11.4.2","description":"OpenCode plugin that loads Cursor rules from .cursor/rules.","directories":{},"sideEffects":false,"_nodeVersion":"24.3.0","dependencies":{"yaml":"^2.8.4","picomatch":"^4.0.4","@opencode-ai/plugin":"^1.14.41"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^6.0.3","@types/node":"^25.6.2","@types/picomatch":"^4.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cursor-to-opencode_1.0.2_1778334149556_0.01855868267096694","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@0ct0s3c/cursor-to-opencode","version":"1.0.3","keywords":["opencode","cursor","cursor-to-opencode","cursor-rules","plugin","ai"],"author":"","license":"MIT","_id":"@0ct0s3c/cursor-to-opencode@1.0.3","maintainers":[{"name":"octosec","email":"admin@octolus.net"}],"dist":{"shasum":"e545c461da7203e28f3fa31975cb11d73cd9bd52","tarball":"https://registry.npmjs.org/@0ct0s3c/cursor-to-opencode/-/cursor-to-opencode-1.0.3.tgz","fileCount":6,"integrity":"sha512-80HMepiH+wttyGcHe7vsdNdMFR+0cz9WiHM1g995zOdOaKuqndHhpP5szw9GUkjnXDDoF2h/5rhMlAwekrJzdg==","signatures":[{"sig":"MEUCIAp4GEAQiT/JatRpiRGVXHgJktP6aIP2JOscS1zzUn6rAiEA+g8+lQKklJUwGdZQ42kdCT1oJuPa37vnV0YjnKujI1Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106541},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./server":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"dc82377df1e6a14a7e408a1987d1a9ab38309a1a","scripts":{"ci":"npm run typecheck && npm run test && npm run build && npm run verify:package && npm run pack:dry","test":"vitest run","build":"tsup src/index.ts --format esm --dts --clean --sourcemap","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","deploy":"node scripts/deploy.mjs","prepack":"npm run build","pack:dry":"npm pack --dry-run","typecheck":"tsc --noEmit","verify:package":"node scripts/verify-package.mjs","prepare:release":"node scripts/prepare-release.mjs"},"_npmUser":{"name":"octosec","email":"admin@octolus.net"},"_npmVersion":"11.4.2","description":"OpenCode plugin that loads Cursor rules from .cursor/rules.","directories":{},"sideEffects":false,"_nodeVersion":"24.3.0","dependencies":{"yaml":"^2.8.4","picomatch":"^4.0.4","@opencode-ai/plugin":"^1.14.41"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^6.0.3","@types/node":"^25.6.2","@types/picomatch":"^4.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cursor-to-opencode_1.0.3_1778334309111_0.577868193713029","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@0ct0s3c/cursor-to-opencode","version":"1.0.4","keywords":["opencode","cursor","cursor-to-opencode","cursor-rules","plugin","ai"],"author":"","license":"MIT","_id":"@0ct0s3c/cursor-to-opencode@1.0.4","maintainers":[{"name":"octosec","email":"admin@octolus.net"}],"dist":{"shasum":"670c36c32d4b014767f0be47ff33eb4b13a69e8c","tarball":"https://registry.npmjs.org/@0ct0s3c/cursor-to-opencode/-/cursor-to-opencode-1.0.4.tgz","fileCount":6,"integrity":"sha512-NhJzlipJ1xauEhNGOsC72rJc2Y+es2mKFex0gvmKcR3FYZ3rHcqjvMIeJtfFMJYTentF21oAU/ydvCWGTK0G4Q==","signatures":[{"sig":"MEYCIQCQV3NlGDb4ZsAXkYDbmmrjj1kgMwMhTl7XlD1E9W69XwIhANoOkT++fcmQZUr9lrE+jWuPckr2hEw5pop/8x/ID1FM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106541},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./server":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"dc82377df1e6a14a7e408a1987d1a9ab38309a1a","scripts":{"ci":"npm run typecheck && npm run test && npm run build && npm run verify:package && npm run pack:dry","test":"vitest run","build":"tsup src/index.ts --format esm --dts --clean --sourcemap","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","deploy":"node scripts/deploy.mjs","prepack":"npm run build","pack:dry":"npm pack --dry-run","typecheck":"tsc --noEmit","verify:package":"node scripts/verify-package.mjs","prepare:release":"node scripts/prepare-release.mjs"},"_npmUser":{"name":"octosec","email":"admin@octolus.net"},"_npmVersion":"11.4.2","description":"OpenCode plugin that loads Cursor rules from .cursor/rules.","directories":{},"sideEffects":false,"_nodeVersion":"24.3.0","dependencies":{"yaml":"^2.8.4","picomatch":"^4.0.4","@opencode-ai/plugin":"^1.14.41"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^6.0.3","@types/node":"^25.6.2","@types/picomatch":"^4.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cursor-to-opencode_1.0.4_1778334436241_0.7727149434240208","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@0ct0s3c/cursor-to-opencode","version":"1.0.5","keywords":["opencode","cursor","cursor-to-opencode","cursor-rules","plugin","ai"],"author":"","license":"MIT","_id":"@0ct0s3c/cursor-to-opencode@1.0.5","maintainers":[{"name":"octosec","email":"admin@octolus.net"}],"dist":{"shasum":"06f7d659c6fc836a8cc8123cc9d431bf3b344b12","tarball":"https://registry.npmjs.org/@0ct0s3c/cursor-to-opencode/-/cursor-to-opencode-1.0.5.tgz","fileCount":6,"integrity":"sha512-s4z2DP97DGoedrbxPZtVK6DQqHFLHYZJL7q3L9wxHO3fVWAfppGQyQVAkopX1fj2r8OWAyWDOV9RfUzABMX8lg==","signatures":[{"sig":"MEUCIFxNE5Rp4yMCG5TnaE4Kl5INMkM2YBMbA7Xrp6sOoP2RAiEAret5fCEFycXLYUd23JZtvC2F6w0Spr40D5F8LeNsZTg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109457},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./server":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"03d8ea8a262ad79b23ceb8594b1d889f61928d3b","scripts":{"ci":"npm run typecheck && npm run test && npm run build && npm run verify:package && npm run pack:dry","test":"vitest run","build":"tsup src/index.ts --format esm --dts --clean --sourcemap","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","deploy":"node scripts/deploy.mjs","prepack":"npm run build","pack:dry":"npm pack --dry-run","typecheck":"tsc --noEmit","verify:package":"node scripts/verify-package.mjs","prepare:release":"node scripts/prepare-release.mjs"},"_npmUser":{"name":"octosec","email":"admin@octolus.net"},"_npmVersion":"11.4.2","description":"OpenCode plugin that loads Cursor rules from .cursor/rules.","directories":{},"sideEffects":false,"_nodeVersion":"24.3.0","dependencies":{"yaml":"^2.8.4","picomatch":"^4.0.4","@opencode-ai/plugin":"^1.14.41"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.5","typescript":"^6.0.3","@types/node":"^25.6.2","@types/picomatch":"^4.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cursor-to-opencode_1.0.5_1778334782624_0.2133421773255879","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@0ct0s3c/cursor-to-opencode","version":"1.0.6","description":"Use Cursor .cursor/rules in OpenCode with dynamic rule injection, diagnostics, and stats.","type":"module","sideEffects":false,"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./server":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","build":"tsup src/index.ts --format esm --dts --clean --sourcemap","typecheck":"tsc --noEmit","test":"vitest run","prepare:release":"node scripts/prepare-release.mjs","verify:package":"node scripts/verify-package.mjs","pack:dry":"npm pack --dry-run","deploy":"node scripts/deploy.mjs","prepack":"npm run build","ci":"npm run typecheck && npm run test && npm run build && npm run verify:package && npm run pack:dry"},"keywords":["opencode","opencode-plugin","opencode-ai","cursor","cursor-ai","cursor-rules","cursor-to-opencode","cursorrules","cursor-rules-opencode","ai-coding","ai-agent","system-prompt","rules-engine","plugin","developer-tools"],"author":"","license":"MIT","repository":{"type":"git","url":"git+https://github.com/Octolus/Cursor-to-OpenCode.git"},"bugs":{"url":"https://github.com/Octolus/Cursor-to-OpenCode/issues"},"homepage":"https://github.com/Octolus/Cursor-to-OpenCode#readme","engines":{"node":">=20"},"publishConfig":{"access":"public"},"dependencies":{"@opencode-ai/plugin":"^1.14.41","picomatch":"^4.0.4","yaml":"^2.8.4"},"devDependencies":{"@types/node":"^25.6.2","@types/picomatch":"^4.0.3","tsup":"^8.5.1","typescript":"^6.0.3","vitest":"^4.1.5"},"_id":"@0ct0s3c/cursor-to-opencode@1.0.6","gitHead":"f1df73f5a97b0be343ab31d94918536ea9a88963","_nodeVersion":"24.3.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-y2kXt73eoJYr71GDFuIKZnmDVYe82+U5A+BrTRXWtomwO28ynvjrdAwijffia2JUXuD2kzj8O/3qE8gjekaSYQ==","shasum":"a8dd52e92818cd2e2ff8747b213818e080943007","tarball":"https://registry.npmjs.org/@0ct0s3c/cursor-to-opencode/-/cursor-to-opencode-1.0.6.tgz","fileCount":6,"unpackedSize":111081,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCCGtv6TGTHKrlGv4lxfsJ99PrP83e1rA7FERy8DYc+ewIgD5wGvZ01/WhV0o2FLweRMBBMRWkzKr8owcGzTdd5RdI="}]},"_npmUser":{"name":"octosec","email":"admin@octolus.net"},"directories":{},"maintainers":[{"name":"octosec","email":"admin@octolus.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cursor-to-opencode_1.0.6_1778334993965_0.02311857969134401"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-09T13:33:44.189Z","modified":"2026-05-09T13:56:34.264Z","1.0.0":"2026-05-09T13:29:41.590Z","1.0.1":"2026-05-09T13:33:44.478Z","1.0.2":"2026-05-09T13:42:29.742Z","1.0.3":"2026-05-09T13:45:09.233Z","1.0.4":"2026-05-09T13:47:16.416Z","1.0.5":"2026-05-09T13:53:02.785Z","1.0.6":"2026-05-09T13:56:34.119Z"},"license":"MIT","keywords":["opencode","opencode-plugin","opencode-ai","cursor","cursor-ai","cursor-rules","cursor-to-opencode","cursorrules","cursor-rules-opencode","ai-coding","ai-agent","system-prompt","rules-engine","plugin","developer-tools"],"description":"Use Cursor .cursor/rules in OpenCode with dynamic rule injection, diagnostics, and stats.","maintainers":[{"name":"octosec","email":"admin@octolus.net"}],"readme":"# Cursor-to-OpenCode: Cursor Rules for OpenCode\n\n[![npm version](https://img.shields.io/npm/v/@0ct0s3c/cursor-to-opencode.svg)](https://www.npmjs.com/package/@0ct0s3c/cursor-to-opencode)\n[![npm package](https://img.shields.io/npm/dm/@0ct0s3c/cursor-to-opencode.svg)](https://www.npmjs.com/package/@0ct0s3c/cursor-to-opencode)\n[![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\nUse Cursor `.cursor/rules` in OpenCode. This OpenCode plugin discovers Cursor rule files, validates frontmatter, dynamically injects matching rules into chat context, and provides `/cursor-to-opencode` diagnostics for loaded, inactive, skipped, and rejected rules.\n\n## Features\n\n- Loads Cursor rules from `.cursor/rules/**/*.md` and `.cursor/rules/**/*.mdc`.\n- Supports `alwaysApply`, `globs`, `description`, manual rule mentions, `@file` references, optional `.cursorrules`, and `AGENTS.md` detection.\n- Dynamically injects only the relevant Cursor rules for the current OpenCode session.\n- Reports invalid or unsupported Cursor rules with clear diagnostics.\n- Provides `/cursor-to-opencode` and `/cursor-to-opencode stats` commands.\n- Stores stats outside the project by default so your repo does not get noisy changed files.\n\n## Keywords\n\nOpenCode plugin, Cursor rules, `.cursor/rules`, `.cursorrules`, Cursor-to-OpenCode, AI coding rules, system prompt injection, OpenCode AI, Cursor AI, developer tools.\n\n## Install\n\nAdd the npm package to `opencode.json`:\n\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"plugin\": [\"@0ct0s3c/cursor-to-opencode@latest\"]\n}\n```\n\nPin a release if you want reproducible behavior:\n\n```json\n{\n  \"plugin\": [\"@0ct0s3c/cursor-to-opencode@1.0.6\"]\n}\n```\n\n## Test Locally Before Publishing\n\nYou do not need to publish to npm to test this plugin on your computer. OpenCode supports local path plugins.\n\nBuild the package:\n\n```powershell\nnpm install\nnpm run build\n```\n\nThen add the local package directory to the OpenCode config for the project you want to test:\n\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"plugin\": [\n    \"C:/path/to/Cursor-to-OpenCode\"\n  ]\n}\n```\n\nYou can also point directly at the built server file:\n\n```json\n{\n  \"plugin\": [\n    \"file:///C:/path/to/Cursor-to-OpenCode/dist/index.js\"\n  ]\n}\n```\n\nRestart OpenCode after changing `opencode.json`. Create a test rule such as `.cursor/rules/test.mdc` in the project being tested:\n\n```md\n---\nalwaysApply: true\n---\n\nReply with \"Cursor rule plugin is active\" when asked to verify rules.\n```\n\nThen ask OpenCode to verify the rule. To inspect diagnostics, ask it to call the `cursor_to_opencode`, `cursor_to_opencode_status`, or `cursor_to_opencode_stats` tool.\n\nThe plugin intercepts `/cursor-to-opencode` through OpenCode's `command.execute.before` hook, the same pattern used by plugins like DCP. Restart OpenCode after changing plugin config, then run:\n\n```text\n/cursor-to-opencode\n```\n\nProject injection stats are available with:\n\n```text\n/cursor-to-opencode stats\n```\n\nStats are stored outside the project by default under OpenCode's config directory, so `/cursor-to-opencode stats` does not create changed files in your repo. Set `statsPath` only if you explicitly want project-local stats.\n\nIf your OpenCode build does not dispatch unknown slash commands to plugin hooks, create `.opencode/commands/cursor-to-opencode.md` in the project where you are testing:\n\n```md\n---\ndescription: Show Cursor rules loaded in this OpenCode session\n---\n\nCall the `cursor_to_opencode` tool. Show which Cursor rules were loaded, matched, skipped, or rejected for this session. Include validation warnings and rejection reasons.\n```\n\nAlternatively, define `/cursor-to-opencode` directly in `opencode.json`:\n\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"plugin\": [\n    \"file:///C:/path/to/Cursor-to-OpenCode/dist/index.js\"\n  ],\n  \"command\": {\n    \"cursor-to-opencode\": {\n      \"description\": \"Show Cursor rules loaded in this OpenCode session\",\n      \"template\": \"If the first argument is `stats`, call the `cursor_to_opencode_stats` tool. Otherwise call the `cursor_to_opencode` tool. Show Cursor rule diagnostics clearly.\"\n    }\n  }\n}\n```\n\nWith this config, `/cursor-to-opencode` is an OpenCode custom command even if hook-dispatched unknown commands are disabled. The plugin still provides the underlying tools.\n\nTo debug plugin loading, start OpenCode with:\n\n```powershell\nopencode --print-logs --log-level DEBUG\n```\n\nOn Windows, log files are normally under `%USERPROFILE%\\.local\\share\\opencode\\log`.\n\nFor release-like testing, run:\n\n```powershell\nnpm run ci\nnpm pack\n```\n\n`npm pack` verifies the exact tarball that would be published. OpenCode's easiest pre-release path is still the local directory or `file:///.../dist/index.js` plugin config; use the tarball mainly to inspect package contents.\n\n## Manual npm Deploy\n\nGitHub Releases are the preferred publish path, but you can deploy from this machine too.\n\nCreate a local `.env` file that is never committed:\n\n```text\nNPM_TOKEN=npm_your_fresh_automation_token\n```\n\nThen run:\n\n```powershell\nnpm run deploy\n```\n\nThe deploy script:\n\n- loads `NPM_TOKEN` from `.env`\n- validates `package.json` uses strict `x.y.z` semver\n- fails if that package version already exists on npm\n- runs full CI\n- writes a temporary npm config outside the repo\n- publishes `@0ct0s3c/cursor-to-opencode` publicly\n- deletes the temporary npm config afterward\n\n## Supported Cursor Rule Formats\n\n- `.cursor/rules/**/*.md`\n- `.cursor/rules/**/*.mdc`\n- nested `.cursor/rules` folders\n- `.cursor/rules/imported/**`\n- `alwaysApply`\n- `description`\n- `globs`\n- manual `@rule` mentions\n- `@file` references for diagnostics\n- optional legacy `.cursorrules`\n- `AGENTS.md` detection for status parity\n\nCursor User Rules and Team Rules are settings/dashboard data, not normal repo files. The plugin reports those as unsupported external surfaces unless a future option provides an explicit import path.\n\n## Dynamic Rule Matching\n\n- `alwaysApply: true` rules are injected every turn.\n- `globs` rules are injected when a tracked active file matches.\n- `description`-only rules use lightweight prompt/file relevance scoring.\n- manual-only rules inject only when mentioned.\n- invalid rules are rejected with reason-coded diagnostics.\n\n## Commands And Tools\n\nThe plugin exposes these OpenCode tools:\n\n- `cursor_to_opencode`\n- `cursor_to_opencode_status`\n- `cursor_to_opencode_stats`\n\nThe plugin also intercepts these slash commands directly through `command.execute.before`:\n\n- `/cursor-to-opencode`\n- `/cursor-to-opencode stats`\n\nIf your OpenCode build does not dispatch unknown slash commands to plugins, add a command file:\n\n```md\n---\ndescription: Show Cursor rules loaded in this OpenCode session\n---\n\nCall the `cursor_to_opencode` tool and summarize which Cursor rules loaded, matched, skipped, or failed validation.\n```\n\nSave that as `.opencode/commands/cursor-to-opencode.md`, then run `/cursor-to-opencode`.\n\n## Options\n\n```json\n{\n  \"plugin\": [\n    [\"@0ct0s3c/cursor-to-opencode@latest\", {\n      \"legacyCursorrules\": true,\n      \"strict\": false,\n      \"maxRulesPerTurn\": 20,\n      \"maxRuleBytes\": 120000,\n      \"intelligentMatching\": true,\n      \"statusCommand\": true,\n      \"includeAgentsMd\": false,\n      \"allowExternalRulePaths\": false,\n      \"statsEnabled\": true,\n      \"statsPath\": \"\"\n    }]\n  ]\n}\n```\n\nBy default, `statsPath: \"\"` stores stats globally per workspace. If you want the old repo-local behavior, set `statsPath` to `.opencode/cursor-to-opencode-stats.json`.\n\n## Validation\n\nKnown Cursor frontmatter fields are `alwaysApply`, `description`, and `globs`.\n\nThe validator rejects invalid YAML, invalid known-field types, empty rule bodies, unreadable rules, and unsafe paths. It warns for unknown fields, ignored fields under `alwaysApply: true`, oversized rules, unresolved `@file` references, and YAML-array `globs` in non-strict mode.\n\n## Development\n\n```powershell\nnpm install\nnpm run typecheck\nnpm run test\nnpm run build\nnpm run pack:dry\n```\n\nPublish with the release workflow or `npm publish --provenance --access public`.\n","readmeFilename":"README.md","homepage":"https://github.com/Octolus/Cursor-to-OpenCode#readme","repository":{"type":"git","url":"git+https://github.com/Octolus/Cursor-to-OpenCode.git"},"bugs":{"url":"https://github.com/Octolus/Cursor-to-OpenCode/issues"}}