feat: Cursor platform support - skills, commands, and rules#269
feat: Cursor platform support - skills, commands, and rules#269
Conversation
Use object-form source {"source": "url", "url": "..."} instead of bare
URL strings, and remove unrecognized "requires"/"core" keys that cause
schema validation errors when loading the marketplace.
Add PLATFORMS.CURSOR, STATE_DIRS entry, detectPlatform branch, and INSTRUCTION_FILES entry for Cursor support.
Convert plugin content to Cursor MDC rule format with description, globs, and alwaysApply frontmatter. Strips Claude-specific syntax (Task calls, require statements, plugin namespacing) and replaces PLUGIN_ROOT paths.
Returns tuples with agentsys-prefixed rule names, plugin info, description, type, and globs for Cursor MDC rule generation.
Add 'cursor' to VALID_TOOLS, detectInstalledPlatforms, interactive prompt, install subcommand, and main install flow. Add installForCursor function that writes .mdc rules to .cursor/rules/ using discovery mappings and the transformForCursor pipeline. Update help text.
Add Cursor to all reference tables, add MDC rule format section, installation location, and testing checklist entry.
Add transformForCursor tests (frontmatter, description escaping, PLUGIN_ROOT replacement, require stripping, plugin namespacing, Task call stripping). Update VALID_TOOLS, PLATFORMS, STATE_DIRS, and detectPlatform tests for Cursor.
Cursor v2.4+ natively supports the Agent Skills standard (SKILL.md). Instead of converting everything to .mdc rules, install content to the correct locations: - Skills -> .cursor/skills/<name>/SKILL.md (minimal transform) - Commands -> .cursor/commands/<name>.md (light transform) - Rules -> .cursor/rules/*.mdc (reserved for coding standards)
- Validate skill directory names against [a-zA-Z0-9_-]+ to prevent path traversal - Detect Cursor only when .cursor/rules, commands, or skills exist (not bare .cursor/) - Scope command cleanup to only remove known command files, preserving user files - Default description to empty string in transformRuleForCursor - Add PLUGIN_ROOT substitution integration tests for skills and commands
There was a problem hiding this comment.
Pull request overview
This PR adds Cursor as the 4th platform target for agentsys, alongside Claude Code, OpenCode, and Codex CLI. Cursor v2.4+ natively supports the Agent Skills standard, so the implementation installs content with minimal transformations: skills to .cursor/skills/<name>/SKILL.md, commands to .cursor/commands/<name>.md, and infrastructure for future rule generation to .cursor/rules/*.mdc. All content is project-scoped (installed relative to CWD).
Changes:
- Added Cursor platform constants, detection, and CLI integration across core modules
- Implemented three transform functions:
transformSkillForCursor(minimal),transformCommandForCursor(strips frontmatter), andtransformRuleForCursor(MDC format, reserved for future use) - Added
installForCursor()with scoped cleanup that preserves user-created content - Updated documentation, checklists, and help text to reflect 4-platform support
Reviewed changes
Copilot reviewed 17 out of 18 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| lib/adapter-transforms.js | Added three Cursor transform functions with PLUGIN_ROOT replacement, namespace stripping, and MDC frontmatter generation |
| lib/discovery/index.js | Added getCursorRuleMappings function and command filename validation for path traversal protection |
| lib/cross-platform/index.js | Added CURSOR to PLATFORMS, STATE_DIRS, and INSTRUCTION_FILES constants |
| bin/cli.js | Added installForCursor function, Cursor to VALID_TOOLS, platform detection, and CLI help text updates |
| tests/gen-adapters.test.js | Added comprehensive tests for all three Cursor transform functions (78 new tests) |
| tests/cross-platform.test.js | Added tests for Cursor platform detection and constants |
| tests/cli-args.test.js | Added 15 integration tests for installForCursor function |
| docs/.md, checklists/.md | Updated all documentation and checklists to reference 4 platforms and Cursor-specific patterns |
| .claude-plugin/marketplace.json | Changed source field format from string to object and removed requires/core fields |
| README.md, CLAUDE.md, AGENTS.md, CHANGELOG.md | Updated to reference Cursor as 4th platform |
Comments suppressed due to low confidence (10)
tests/gen-adapters.test.js:441
- The test at line 441 checks that control characters are stripped using the pattern
[\x00-\x09\x0b-\x1f\x7f](which excludes\x0a/newline), but the actual implementation at lib/adapter-transforms.js:318 uses[\x00-\x1f\x7f](which includes\x0a/newline). This mismatch means the test is checking for the wrong behavior.
Either update the test to match the implementation's behavior, or fix the implementation to match what the test expects. Given the test input includes \x0a explicitly ("line1\x00line2\x0aline3"), it appears the test expects newlines to be stripped, so the test pattern should match the implementation.
expect(result).not.toMatch(/[\x00-\x09\x0b-\x1f\x7f]/);
CHANGELOG.md:14
- The PR description and CHANGELOG mention that "Rules ->
.cursor/rules/*.mdc" are installed, but the implementation doesn't actually create any.mdcrule files. The test at tests/cli-args.test.js:316-329 explicitly verifies that NO .mdc files are created. The code includes the infrastructure (rulesDir creation, cleanup of old .mdc files, getCursorRuleMappings function, transformRuleForCursor function) but doesn't use it to generate rules.
This appears intentional (the PR description says "transformRuleForCursor - full MDC transform (kept for future rule generation)"), but the PR description and CHANGELOG should be clarified to indicate that rule generation is infrastructure-only and reserved for future implementation, not a currently active feature.
- **Cursor platform support (#261)** — agentsys now installs to Cursor as a 4th platform alongside Claude Code, OpenCode, and Codex CLI. Use `agentsys --tool cursor` or `agentsys install <plugin> --tool cursor` to install. Skills are copied to `.cursor/skills/` (same SKILL.md format - no transform needed), commands to `.cursor/commands/` (light transform), and rules to `.cursor/rules/*.mdc` (MDC frontmatter). All content is project-scoped. Cursor v2.4+ natively supports the Agent Skills standard.
checklists/cross-platform-compatibility.md:18
- The documentation states that Cursor's "Env var for state dir" is "N/A", but the
detectPlatform()function in lib/cross-platform/index.js:81 checks forAI_STATE_DIR=.cursorto detect the Cursor platform. This creates an inconsistency between the documentation and the code.
Either update the documentation to reflect that Cursor can be detected via AI_STATE_DIR=.cursor, or clarify that this environment variable is only used for internal platform detection and not a user-facing feature.
| **Env var for state dir** | N/A | `AI_STATE_DIR` | `AI_STATE_DIR` | N/A |
lib/adapter-transforms.js:357
- The namespace stripping regex is missing the
agnixplugin. The pattern includes: next-task, deslop, ship, sync-docs, audit-project, enhance, perf, repo-map, drift-detect, consult, debate, learn, web-ctl (13 plugins), but the marketplace.json includes 14 plugins includingagnix.
This means any content referencing agnix:agent-name or agnix:skill-name will not have its namespace prefix stripped for Cursor, creating inconsistent behavior compared to other plugins. Add agnix to the namespace stripping pattern.
content = content.replace(/(?:next-task|deslop|ship|sync-docs|audit-project|enhance|perf|repo-map|drift-detect|consult|debate|learn|web-ctl):([a-z][a-z0-9-]*)/g, '$1');
lib/adapter-transforms.js:383
- The namespace stripping regex is missing the
agnixplugin (same issue as in transformRuleForCursor at line 357). Addagnixto the pattern to ensure consistent namespace stripping across all Cursor transform functions.
content = content.replace(/(?:next-task|deslop|ship|sync-docs|audit-project|enhance|perf|repo-map|drift-detect|consult|debate|learn|web-ctl):([a-z][a-z0-9-]*)/g, '$1');
lib/adapter-transforms.js:427
- The namespace stripping regex is missing the
agnixplugin (same issue as in transformRuleForCursor at line 357 and transformSkillForCursor at line 383). Addagnixto the pattern for consistency.
content = content.replace(/(?:next-task|deslop|ship|sync-docs|audit-project|enhance|perf|repo-map|drift-detect|consult|debate|learn|web-ctl):([a-z][a-z0-9-]*)/g, '$1');
lib/adapter-transforms.js:427
- The namespace stripping regex uses a hardcoded list of plugin names, which requires manual maintenance whenever plugins are added or removed. The OpenCode transform functions (lib/adapter-transforms.js:46-51) use
discovery.discoverPlugins(repoRoot)to dynamically build the plugin list, which is more maintainable.
Consider refactoring all three Cursor transform functions (transformRuleForCursor, transformSkillForCursor, transformCommandForCursor) to use the same dynamic discovery approach as OpenCode, passing repoRoot or installDir as a parameter to enable dynamic plugin discovery. This would eliminate the need for manual updates when plugins change.
content = content.replace(/(?:next-task|deslop|ship|sync-docs|audit-project|enhance|perf|repo-map|drift-detect|consult|debate|learn|web-ctl):([a-z][a-z0-9-]*)/g, '$1');
return content;
}
/**
* Transform skill content for Cursor.
*
* Minimal transform - Cursor reads SKILL.md frontmatter natively so we
* preserve it. Only replaces PLUGIN_ROOT paths and strips namespace prefixes.
*
* @param {string} content - Source SKILL.md content
* @param {Object} options
* @param {string} options.pluginInstallPath - Absolute path to plugin install dir
* @returns {string} Transformed skill content
*/
function transformSkillForCursor(content, options) {
const { pluginInstallPath } = options;
// Replace PLUGIN_ROOT paths with actual install path
content = content.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, () => pluginInstallPath);
content = content.replace(/\$CLAUDE_PLUGIN_ROOT/g, () => pluginInstallPath);
content = content.replace(/\$\{PLUGIN_ROOT\}/g, () => pluginInstallPath);
content = content.replace(/\$PLUGIN_ROOT/g, () => pluginInstallPath);
// Strip plugin namespacing (e.g. next-task:agent-name -> agent-name)
content = content.replace(/(?:next-task|deslop|ship|sync-docs|audit-project|enhance|perf|repo-map|drift-detect|consult|debate|learn|web-ctl):([a-z][a-z0-9-]*)/g, '$1');
return content;
}
/**
* Transform command content for Cursor.
*
* Light transform - strips frontmatter, replaces PLUGIN_ROOT paths,
* removes require() statements and Task() calls, strips namespace prefixes.
*
* @param {string} content - Source command markdown content
* @param {Object} options
* @param {string} options.pluginInstallPath - Absolute path to plugin install dir
* @returns {string} Transformed command content
*/
function transformCommandForCursor(content, options) {
const { pluginInstallPath } = options;
// Strip existing frontmatter if present
if (content.startsWith('---')) {
content = content.replace(/^---\n[\s\S]*?\n---\n?/, '');
}
// Replace PLUGIN_ROOT paths with actual install path
content = content.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, () => pluginInstallPath);
content = content.replace(/\$CLAUDE_PLUGIN_ROOT/g, () => pluginInstallPath);
content = content.replace(/\$\{PLUGIN_ROOT\}/g, () => pluginInstallPath);
content = content.replace(/\$PLUGIN_ROOT/g, () => pluginInstallPath);
// Strip require() statements
content = content.replace(/(?:const|let|var)\s+\{?[^}=\n]+\}?\s*=\s*require\s*\([^)]+\);?/g, '');
content = content.replace(/require\s*\(['"][^'"]+['"]\)/g, '');
// Strip Claude-specific syntax: Task tool calls (handles one level of nested braces)
content = content.replace(/await\s+Task\s*\(\s*\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}\s*\);?/g, (match) => {
const agentMatch = match.match(/subagent_type:\s*["'](?:[^"':]+:)?([^"']+)["']/);
if (agentMatch) {
return `Invoke the ${agentMatch[1]} agent`;
}
return '';
});
// Strip plugin namespacing (e.g. next-task:agent-name -> agent-name)
content = content.replace(/(?:next-task|deslop|ship|sync-docs|audit-project|enhance|perf|repo-map|drift-detect|consult|debate|learn|web-ctl):([a-z][a-z0-9-]*)/g, '$1');
lib/adapter-transforms.js:318
- The control character stripping pattern
[\x00-\x1f\x7f]at line 318 includes\x0a(newline, LF) and\x0d(carriage return, CR), which will remove legitimate line breaks from multi-line descriptions. YAML descriptions are typically single-line strings, but if a description contains intentional newlines, they will be incorrectly stripped and replaced with spaces.
Consider using a more selective pattern like [\x00-\x09\x0b-\x0c\x0e-\x1f\x7f] to preserve \x0a (LF) and \x0d (CR) if multi-line descriptions are expected, or document that descriptions must be single-line.
const cleanDescription = description.replace(/[\x00-\x1f\x7f]/g, ' ');
README.md:24
- The PR description states "3655 tests passing across 89 suites", but the README.md line 24 shows "3,357 tests". This is a discrepancy of 298 tests. If the test count has increased with the new Cursor-related tests, the README should be updated to reflect the accurate count. Verify the actual test count and ensure consistency between the PR description and the README.
<b>14 plugins · 43 agents · 30 skills (across all repos) · 26k lines of lib code · 3,357 tests · 4 platforms</b><br>
README.md:934
- The README shows "1,818 tests passing" at line 934, but line 24 shows "3,357 tests" and the PR description mentions "3655 tests". These numbers are inconsistent and confusing. Verify the actual test count and ensure all test count references in the README are accurate and consistent.
- 1,818 tests passing
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| "source": {"source": "url", "url": "https://github.com/agent-sh/next-task.git"}, | ||
| "description": "Master workflow orchestrator: autonomous workflow with model optimization (opus/sonnet/haiku), two-file state management, workflow enforcement gates, 14 specialist agents", | ||
| "version": "1.0.0", | ||
| "category": "productivity", | ||
| "requires": ["deslop", "sync-docs", "ship"], | ||
| "core": ">=1.0.0" | ||
| "homepage": "https://github.com/agent-sh/next-task" | ||
| }, |
There was a problem hiding this comment.
The requires and core fields have been removed from all plugin entries in marketplace.json, but the dependency resolution system in resolvePluginDeps (line 272 in bin/cli.js) checks for plugin.requires to build the dependency graph. Removing these fields will break transitive dependency installation.
According to the repo memory, "plugins[].requires drives transitive dependency installs", so these fields are essential for the installer to work correctly. If these fields are being deprecated, the dependency resolution code needs to be updated accordingly. Otherwise, restore the requires fields.
| { | ||
| "name": "next-task", | ||
| "source": "https://github.com/agent-sh/next-task", | ||
| "source": {"source": "url", "url": "https://github.com/agent-sh/next-task.git"}, |
There was a problem hiding this comment.
The marketplace.json has changed the source field from a string to an object format {"source": "url", "url": "..."}, but the fetchPlugin function at line 297 and usage at line 465 expect plugin.source to be a string. This will cause the installer to fail when trying to fetch plugins.
The code at line 314 expects to parse URLs like "https://github.com/owner/repo" or "github:owner/repo" but will receive an object instead.
Either revert the marketplace.json changes to keep source as a string, or update the fetchPlugin function to handle the new object format by extracting plugin.source.url when plugin.source is an object.
Addresses Copilot review comments: - Restore 'source' field from object format back to string (required by fetchPlugin function) - Restore 'requires' array for each plugin (required for transitive dependency resolution) - Restore 'core' version field for all plugins These fields are essential for the installer to work correctly. The incorrect changes would have broken: 1. Plugin fetching (fetchPlugin expects string URL) 2. Dependency resolution (resolvePluginDeps checks plugin.requires) 3. Core compatibility validation Reverts marketplace.json to match main branch format while preserving Cursor platform support.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 16 out of 17 changed files in this pull request and generated 1 comment.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| <<<<<<< HEAD | ||
| 40 agents across 11 plugins. Key agents by model: | ||
|
|
||
| | Model | Agents | Use Case | | ||
| |-------|--------|----------| | ||
| | **opus** | planning, implementation, perf-orchestrator, debate-orchestrator | Complex reasoning, judgment | | ||
| | **sonnet** | exploration, learn, task-discoverer, delivery-validator, ci-fixer, deslop-agent, reporters | Validation, pattern matching | | ||
| | **haiku** | worktree-manager, ci-monitor, simple-fixer | Mechanical execution | | ||
|
|
||
| See [README.md](./README.md#command-details) and [docs/reference/AGENTS.md](./docs/reference/AGENTS.md) for full agent list. | ||
| </agents> | ||
|
|
||
| <skills> | ||
| ## Skills | ||
|
|
||
| 26 skills across plugins. Agents invoke skills for reusable implementation. | ||
|
|
||
| | Category | Key Skills | | ||
| |----------|------------| | ||
| | Workflow | `orchestrate-review`, `discover-tasks`, `validate-delivery` | | ||
| | Enhancement | `enhance-*` (9 skills for plugins, agents, docs, prompts, hooks) | | ||
| | Performance | `baseline`, `benchmark`, `profile`, `theory-tester` | | ||
| | Cleanup | `deslop`, `sync-docs`, `drift-analysis`, `repo-mapping` | | ||
|
|
||
| See [README.md](./README.md#skills) for full skill list. | ||
| </skills> | ||
|
|
||
| <state-files> | ||
| ## State Files | ||
|
|
||
| | File | Location | Purpose | | ||
| |------|----------|---------| | ||
| | `tasks.json` | `{stateDir}/` | Active task registry | | ||
| | `flow.json` | `{stateDir}/` (worktree) | Workflow progress | | ||
| | `preference.json` | `{stateDir}/sources/` | Cached task source | | ||
| | `suppressions.json` | `~/.<claude\|opencode\|codex>/enhance/` | Auto-learned suppressions | | ||
|
|
||
| Platform-aware state directory: | ||
| - Claude Code: `.claude/` | ||
| - OpenCode: `config/.opencode/` | ||
| - Codex: `.codex/` | ||
| </state-files> | ||
|
|
||
| <workflow-agents> | ||
| ## Workflow Agents (MUST-CALL) | ||
|
|
||
| Cannot skip in /next-task: | ||
| - `exploration-agent` → before planning | ||
| - `planning-agent` → before implementation | ||
| - **Phase 9 review loop** → MUST use orchestrate-review skill | ||
| - `delivery-validator` → before sync-docs:sync-docs-agent | ||
| - `sync-docs:sync-docs-agent` → before /ship | ||
| </workflow-agents> | ||
|
|
||
| <pr-auto-review> | ||
| ## PR Auto-Review | ||
|
|
||
| 4 reviewers: Copilot, Claude, Gemini, Codex | ||
|
|
||
| 1. Wait 3 min after PR creation (initial auto-reviews) | ||
| 2. Claude-review may take 10+ min - wait for it | ||
| 3. Read ALL comments | ||
| 4. Address EVERY comment | ||
| 5. Iterate until zero unresolved | ||
| </pr-auto-review> | ||
|
|
||
| <model-selection> | ||
| ## Model Selection | ||
|
|
||
| | Model | When to Use | | ||
| |-------|-------------| | ||
| | **Opus** | Complex reasoning, analysis where imperfection compounds | | ||
| | **Sonnet** | Validation, pattern matching, most agents | | ||
| | **Haiku** | Mechanical execution, no judgment needed | | ||
| </model-selection> | ||
|
|
||
| <priorities> | ||
| ## Core Priorities | ||
|
|
||
| 1. User DX (plugin users) | ||
| 2. Worry-free automation | ||
| 3. Token efficiency | ||
| 4. Quality output | ||
| 5. Simplicity | ||
| </priorities> | ||
|
|
||
| <end-reminder> | ||
| **REMEMBER**: | ||
| - Use CHANGELOG.md for completion tracking (not summary files) | ||
| - BEFORE starting → Read the relevant checklist (`checklists/*.md`) | ||
| - BEFORE delivering any work, especially releases → Go through that checklist item by item | ||
| - 4 platforms: Claude Code + OpenCode + Codex + Cursor - ALL must work | ||
| - Agent/Skill pattern: Agents invoke skills, skills have implementation | ||
| - Create PRs for non-trivial changes | ||
| </end-reminder> | ||
|
|
||
| </project-memory> | ||
| ||||||| ddd8211 | ||
| 40 agents across 11 plugins. Key agents by model: | ||
|
|
||
| | Model | Agents | Use Case | | ||
| |-------|--------|----------| | ||
| | **opus** | planning, implementation, perf-orchestrator, debate-orchestrator | Complex reasoning, judgment | | ||
| | **sonnet** | exploration, learn, task-discoverer, delivery-validator, ci-fixer, deslop-agent, reporters | Validation, pattern matching | | ||
| | **haiku** | worktree-manager, ci-monitor, simple-fixer | Mechanical execution | | ||
|
|
||
| See [README.md](./README.md#command-details) and [docs/reference/AGENTS.md](./docs/reference/AGENTS.md) for full agent list. | ||
| </agents> | ||
|
|
||
| <skills> | ||
| ## Skills | ||
|
|
||
| 26 skills across plugins. Agents invoke skills for reusable implementation. | ||
|
|
||
| | Category | Key Skills | | ||
| |----------|------------| | ||
| | Workflow | `orchestrate-review`, `discover-tasks`, `validate-delivery` | | ||
| | Enhancement | `enhance-*` (9 skills for plugins, agents, docs, prompts, hooks) | | ||
| | Performance | `baseline`, `benchmark`, `profile`, `theory-tester` | | ||
| | Cleanup | `deslop`, `sync-docs`, `drift-analysis`, `repo-mapping` | | ||
|
|
||
| See [README.md](./README.md#skills) for full skill list. | ||
| </skills> | ||
|
|
||
| <state-files> | ||
| ## State Files | ||
|
|
||
| | File | Location | Purpose | | ||
| |------|----------|---------| | ||
| | `tasks.json` | `{stateDir}/` | Active task registry | | ||
| | `flow.json` | `{stateDir}/` (worktree) | Workflow progress | | ||
| | `preference.json` | `{stateDir}/sources/` | Cached task source | | ||
| | `suppressions.json` | `~/.<claude\|opencode\|codex>/enhance/` | Auto-learned suppressions | | ||
|
|
||
| Platform-aware state directory: | ||
| - Claude Code: `.claude/` | ||
| - OpenCode: `config/.opencode/` | ||
| - Codex: `.codex/` | ||
| </state-files> | ||
|
|
||
| <workflow-agents> | ||
| ## Workflow Agents (MUST-CALL) | ||
|
|
||
| Cannot skip in /next-task: | ||
| - `exploration-agent` → before planning | ||
| - `planning-agent` → before implementation | ||
| - **Phase 9 review loop** → MUST use orchestrate-review skill | ||
| - `delivery-validator` → before sync-docs:sync-docs-agent | ||
| - `sync-docs:sync-docs-agent` → before /ship | ||
| </workflow-agents> | ||
|
|
||
| <pr-auto-review> | ||
| ## PR Auto-Review | ||
|
|
||
| 4 reviewers: Copilot, Claude, Gemini, Codex | ||
|
|
||
| 1. Wait 3 min after PR creation (initial auto-reviews) | ||
| 2. Claude-review may take 10+ min - wait for it | ||
| 3. Read ALL comments | ||
| 4. Address EVERY comment | ||
| 5. Iterate until zero unresolved | ||
| </pr-auto-review> | ||
|
|
||
| <model-selection> | ||
| ## Model Selection | ||
|
|
||
| | Model | When to Use | | ||
| |-------|-------------| | ||
| | **Opus** | Complex reasoning, analysis where imperfection compounds | | ||
| | **Sonnet** | Validation, pattern matching, most agents | | ||
| | **Haiku** | Mechanical execution, no judgment needed | | ||
| </model-selection> | ||
|
|
||
| <priorities> | ||
| ## Core Priorities | ||
|
|
||
| 1. User DX (plugin users) | ||
| 2. Worry-free automation | ||
| 3. Token efficiency | ||
| 4. Quality output | ||
| 5. Simplicity | ||
| </priorities> | ||
|
|
||
| <end-reminder> | ||
| **REMEMBER**: | ||
| - Use CHANGELOG.md for completion tracking (not summary files) | ||
| - BEFORE starting → Read the relevant checklist (`checklists/*.md`) | ||
| - BEFORE delivering any work, especially releases → Go through that checklist item by item | ||
| - 3 platforms: Claude Code + OpenCode + Codex - ALL must work | ||
| - Agent/Skill pattern: Agents invoke skills, skills have implementation | ||
| - Create PRs for non-trivial changes | ||
| </end-reminder> | ||
|
|
||
| </project-memory> | ||
|
|
||
| ## References | ||
|
|
There was a problem hiding this comment.
This file contains unresolved merge conflict markers (<<<<<<< HEAD, |||||||, and likely ======= and >>>>>>>). The merge conflict must be resolved before this PR can be merged. The conflict appears to be between two versions that both add similar content about agents, skills, state files, and workflow agents. The key difference is line 148 vs line 245 where one version says "4 platforms" (the new version with Cursor) and the other says "3 platforms" (the old version).
Summary
Adds Cursor as the 4th platform target for agentsys (alongside Claude Code, OpenCode, and Codex CLI).
Cursor v2.4+ natively supports the Agent Skills standard (SKILL.md), so instead of converting everything to .mdc rule files, content is installed to the correct Cursor locations:
.cursor/skills/<name>/SKILL.md(minimal transform - same format as Claude Code).cursor/commands/<name>.md(light transform - frontmatter stripped, JS syntax removed).cursor/rules/*.mdc(reserved for coding standards, MDC frontmatter format)All content is project-scoped (installed relative to CWD, not globally).
Key changes
transformSkillForCursor- minimal: PLUGIN_ROOT replacement + namespace strippingtransformCommandForCursor- light: strip frontmatter, require(), Task() calls, namespacestransformRuleForCursor- full MDC transform (kept for future rule generation)installForCursor()with OpenCode-style multi-type installerSecurity hardening
/^[a-zA-Z0-9_-]+$/)$pattern escaping in String.replace() for PLUGIN_ROOT substitutionJSON.stringify()for globs in MDC frontmatter.cursor/rules|commands|skills, not just.cursor/)Test plan
npm testpasses (3655 tests, 89 suites)node bin/cli.js --helpshows cursor in supported platformsnode bin/cli.js list --tool cursorlists available skills + commands.cursor/skills/<name>/SKILL.md.cursor/commands/<name>.mdCloses #261