Skip to content

Conversation

@mingyouagi
Copy link

@mingyouagi mingyouagi commented Jan 15, 2026

Add native Cursor IDE integration for Superpowers using Agent Skills with one-command npx installation.

Motivation and Context

Cursor IDE now supports Agent Skills, an open standard for packaging reusable AI agent workflows. This PR adds native Cursor support to Superpowers, making it as easy to install as:

npx github:obra/superpowers/.cursor install --global

Why this is needed:

  • Cursor users can now benefit from all Superpowers skills (brainstorming, TDD, systematic debugging, etc.)
  • Maintains architectural consistency with existing Codex and OpenCode implementations
  • Uses the same shared lib/skills-core.js module for skill discovery and parsing
  • Provides a modern, cross-platform installation experience

How Has This Been Tested?

Tested scenarios:

  • ✅ Global installation (~/.cursor/superpowers)
  • ✅ Local installation (.cursor-superpowers/)
  • ✅ Skill discovery using skillsCore.findSkillsInDir()
  • ✅ Symlink creation on macOS/Linux
  • ✅ Junction fallback on Windows
  • ✅ List command showing both superpowers and custom skills
  • ✅ Uninstall cleaning up all symlinks/junctions
  • ✅ Handling of existing directories (safe overwrite)
  • ✅ CLI error handling and user prompts

Manual verification:

  • Skills appear in Cursor Settings → Rules → Agent Decides
  • Skills auto-invoke based on context
  • Manual skill invocation via / command works

Breaking Changes

None. This is a new platform integration that doesn't affect existing Codex or OpenCode implementations.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Architecture

All three platforms now share the same core:

lib/skills-core.js (shared)
├── Cursor:   .cursor/cli.js (npx installer)
├── Codex:    .codex/superpowers-codex (CLI script)
└── OpenCode: .opencode/plugin/superpowers.js (runtime plugin)

Key features:

  • 🎯 One-command install: npx github:obra/superpowers/.cursor install
  • 🔗 Symlink-based: Skills stay synced with repo
  • 🌍 Global/local options: System-wide or per-project
  • 🎨 Beautiful CLI: Interactive prompts with ora spinners and chalk colors
  • 📦 Cross-platform: macOS, Linux, Windows (with junction fallback)
  • 🔄 Easy management: install, uninstall, list, update commands

Files added:

  • .cursor/cli.js - NPX CLI using skills-core (592 lines)
  • .cursor/package.json - NPM dependencies
  • .cursor/README.md - Usage documentation
  • .cursor/INSTALL.md - Detailed installation guide
  • docs/README.cursor.md - Quick reference
  • Main README.md updated with Cursor installation

Implementation highlights:

  1. Uses skillsCore.findSkillsInDir() for consistent skill discovery
  2. Uses skillsCore.extractFrontmatter() for metadata parsing
  3. Safe handling of existing directories (won't overwrite non-superpowers content)
  4. Complete cleanup on uninstall (removes all symlinks/junctions)
  5. Lists both superpowers skills and user custom skills

Requirements:

  • Cursor IDE with Nightly channel enabled
  • Node.js 14.0.0+

Comparison with other platforms:

Platform Implementation Integration Method
Cursor NPX CLI installer Native Agent Skills (symlinks)
Codex CLI script Bootstrap + CLI output
OpenCode Runtime plugin Plugin API + custom tools

All platforms use the same lib/skills-core.js module for skill operations, ensuring consistent behavior across platforms.

Summary by CodeRabbit

  • New Features

    • Added a CLI to install, list, update, link, and uninstall Cursor Agent Skills with guided global/local flows and verification.
  • Documentation

    • Added a comprehensive installation guide, Cursor-focused README, and docs page covering quick start, commands, architecture, troubleshooting, updating, and usage examples.
  • Chores

    • Updated ignore rules (node_modules, *.log, .DS_Store) and added a package manifest with a CLI entry.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Jan 15, 2026

📝 Walkthrough

Walkthrough

Adds Cursor Agent Skills integration: a new Node.js CLI (install/list/uninstall/update), package manifest, .gitignore additions, and comprehensive Cursor installation and README docs. No runtime code paths or public APIs are modified. (≤50 words)

Changes

Cohort / File(s) Change Summary
Cursor CLI & Package
.cursor/cli.js, .cursor/package.json
New CLI superpowers-cursor implementing global/local install, list, uninstall, update flows; symlink/junction creation, Git update support, and helper utilities. Package manifest defines CLI bin, deps, scripts, and node engine.
Cursor ignore
.cursor/.gitignore
Added ignore entries: node_modules/, *.log, and .DS_Store.
Cursor Installation & Docs
.cursor/INSTALL.md, .cursor/README.md, docs/README.cursor.md
Added comprehensive installation guide and READMEs covering prerequisites, NPX/clone/manual/PowerShell install methods, verification, troubleshooting, update/uninstall, architecture, commands, and developer guidance.
Main Repository README
README.md
Updated Installation section to include Cursor NPX global/local install commands, requirement note about Cursor Nightly channel, and link to .cursor/INSTALL.md.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant CLI as superpowers-cursor CLI
  participant Cursor as Cursor App/Project
  participant Skills as skills-core
  participant Git as Git/GitHub
  participant FS as Filesystem/OS

  User->>CLI: run install (global/local)
  CLI->>Cursor: verify Cursor installed & Nightly channel
  CLI->>Skills: discover available skills
  CLI->>Git: clone or fetch/pull when repo-based
  Git-->>CLI: repo contents / update status
  CLI->>FS: copy files / create symlinks (or junctions on Windows)
  FS-->>Cursor: expose skills via symlinks in Cursor skills dir
  CLI-->>User: display installed/linked skills and next steps
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐇 I hopped across the terminal bright,
I stitched up links by moonlit byte,
Skills found, cloned, and softly tied,
Updates fetched from countryside,
—a rabbit winked: "Cursor's set to flight!"

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.11% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Add native Cursor IDE integration' clearly and concisely summarizes the main objective of the PR, which is to add Cursor IDE support as documented across the new .cursor/ directory and updated documentation.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.



📜 Recent review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8efa821 and 3665dc0.

📒 Files selected for processing (1)
  • docs/README.cursor.md
🧰 Additional context used
🪛 LanguageTool
docs/README.cursor.md

[style] ~114-~114: Consider using a different adverb to strengthen your wording.
Context: ...nel (Settings → Beta) 2. Restart Cursor completely 3. Check: `npx github:obra/superpowers/...

(COMPLETELY_ENTIRELY)

🔇 Additional comments (1)
docs/README.cursor.md (1)

1-137: LGTM! Comprehensive and accurate Cursor integration documentation.

All previously identified issues have been successfully addressed:

  • Relative links correctly reference ../.cursor/ paths
  • All code blocks include appropriate language specifiers (bash and text)
  • Node.js requirement matches package.json (18.0.0+)
  • Cursor documentation link uses the English version

The documentation is well-structured, providing clear quick start instructions, comprehensive command reference, architecture diagrams for both global and local installations, and helpful troubleshooting guidance. The content accurately reflects the Cursor integration features described in the PR objectives.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@mingyouagi mingyouagi changed the title Enhance Cursor installer Add native Cursor IDE integration Jan 15, 2026
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🤖 Fix all issues with AI agents
In @.cursor/cli.js:
- Around line 174-180: The fallback using fs.cpSync in the try/catch (invoking
execSync then fs.cpSync with REPO_ROOT and targetDir) risks runtime errors on
Node <16.7; either replace the fallback with a cross-platform Node copy
implementation (e.g., use fs-extra.copySync or implement a recursive copy using
fs.promises and symlink handling) and import/use that API instead of fs.cpSync,
or update package.json engines to require a Node version that supports fs.cpSync
(>=16.7, preferably >=18 to match ora v8) and bump the project docs; ensure you
update references in .cursor/cli.js to call the new copy helper (or
fs-extra.copySync) and remove direct fs.cpSync usage to maintain compatibility
with Node 14–16.6 if you choose the library approach.
- Around line 118-137: The removeLinkedSkills function uses
entryReal.startsWith(skillsReal), which can false-match similar prefixes;
replace that check with a robust path containment test (e.g., compute
path.relative(skillsReal, entryReal) and ensure it does not start with '..' and
is not equal to '..' or use skillsReal+path.sep and check
entryReal.startsWith(that) or check equality) so only true child paths of
skillsReal (or the same path) trigger removal; update the condition that
currently references entryReal and skillsReal (and uses getRealPathSafe) to use
the safer containment logic and preserve existing try/catch removal behavior.
- Around line 83-99: The prefix check using linkReal.startsWith(targetReal) can
produce false positives when paths share a prefix but are not actually within
the target directory; change the logic in the block handling directory links
(the code referencing linkReal, targetReal, getRealPathSafe, and fs.rmSync) to
verify containment by either comparing equality or ensuring linkReal starts with
targetReal plus a path separator (use Node's path.sep) or by using path.relative
and confirming the relative path does not start with '..' (and is not equal to
'' for edge cases); update the condition accordingly so only true subpaths of
targetReal are removed.

In @.cursor/INSTALL.md:
- Around line 158-162: The fenced code block showing symlink output is missing a
language specifier; update the block around the lines containing "brainstorming
-> /Users/you/.cursor/..." and "systematic-debugging -> /Users/you/.cursor/..."
to use a non-executable language tag such as text or plaintext (e.g., change ```
to ```text) so the markdown linter recognizes it as plain output.

In @.cursor/package.json:
- Around line 27-34: The package.json currently lists "engines": {"node":"
>=14.0.0"} but depends on "ora": "^8.0.1" which requires Node 18+, so either
update the engines entry to "node": ">=18.0.0" to reflect ora v8 requirement, or
change the dependency to a Node 14-compatible version (e.g., set "ora":
"^6.0.0") in the dependencies block; update package.json accordingly and
regenerate lockfile (npm/yarn/pnpm) so the lock reflects the chosen resolution.

In `@docs/README.cursor.md`:
- Around line 103-108: Update the two incorrect relative links in
README.cursor.md: replace the ".cursor/INSTALL.md" and ".cursor/README.md" paths
with paths that go up one level (e.g., "../.cursor/INSTALL.md" and
"../.cursor/README.md") so the links resolve correctly from the docs/ directory.
- Line 123: Update the relative link in docs/README.cursor.md: replace the
current link target ".cursor/INSTALL.md#troubleshooting" with
"../.cursor/INSTALL.md#troubleshooting" so the "Full troubleshooting:
[INSTALL.md](...)" reference correctly points from docs/ to the .cursor
INSTALL.md file.
🧹 Nitpick comments (4)
.cursor/cli.js (2)

58-69: Handle cancelled prompts gracefully.

When a user cancels a prompts dialog (e.g., via Ctrl+C), the response object may be empty ({}), causing response.ready to be undefined. The current check !response.ready handles this, but it silently exits with code 0, which might be confusing. Consider explicitly detecting cancellation for clearer messaging.

Proposed enhancement
   const response = await prompts({
     type: 'confirm',
     name: 'ready',
     message: 'Have you enabled Nightly channel?',
     initial: false
   });
   
-  if (!response.ready) {
+  if (response.ready === undefined) {
+    // User cancelled the prompt
+    process.exit(0);
+  }
+  
+  if (!response.ready) {
     log.info('Please enable Nightly channel first, then run this command again');
     process.exit(0);
   }

488-518: Same path prefix matching pattern.

Lines 494 and 514 use the same startsWith pattern. Consider extracting a helper function to centralize the path containment check and apply the fix consistently.

Proposed helper function
function isPathWithin(childPath, parentPath) {
  if (!childPath || !parentPath) return false;
  return childPath === parentPath || childPath.startsWith(parentPath + path.sep);
}

Then use isPathWithin(linkReal, skillsDirReal) and isPathWithin(entryReal, skillsDirReal) throughout.

docs/README.cursor.md (2)

73-91: Add language specifiers to code blocks.

The code blocks showing directory structures should specify a language for proper syntax highlighting and markdown compliance.

Based on static analysis hints.

📝 Proposed fix
 **Global install:**
-```
+```text
 ~/.cursor/
 ├── superpowers/           # Full repo
 │   └── skills/           # All skills
 └── skills/               # Symlinks (Cursor discovers these)
     ├── brainstorming -> ../superpowers/skills/brainstorming
     └── ...

Local install:
- +text
your-project/
├── .cursor-superpowers/ # Full repo
└── .cursor/
└── skills/ # Symlinks
├── brainstorming -> ../../.cursor-superpowers/skills/brainstorming
└── ...


66-69: Add language specifier to code block.

The code block on line 67 should specify bash for proper syntax highlighting.

Based on static analysis hints.

📝 Proposed fix
 ## Requirements
 
-- **Cursor IDE** with **Nightly channel** (Settings → Beta → Update Channel → Nightly)
+```bash
+# Requirements:
+```
+
+- **Cursor IDE** with **Nightly channel** (Settings → Beta → Update Channel → Nightly)
 - **Node.js** 14.0.0+

Wait, that doesn't make sense. Let me re-read the static analysis hint. It says line 67-67 has a fenced code block without language. But looking at the code, line 67 is just text: - **Cursor IDE** with **Nightly channel**...

Let me recount. The static analysis says:

  • 67-67: Fenced code blocks should have a language specified
  • 78-78: Fenced code blocks should have a language specified
  • 88-88: Fenced code blocks should have a language specified

Looking at the actual line numbers:

  • Line 67 is in Requirements section - not a code block
  • Line 78 is in the middle of the Global install code block
  • Line 88 is in the middle of the Local install code block

I think the linter is flagging the code blocks that START before these lines. Let me look again:

Line 74-81 is the first code block (starts at 74)
Line 84-91 is the second code block (starts at 84)

Ah, I see. The linter might be reporting the line where the issue is most significant or the middle of the block. But I already covered these in my earlier comment about lines 73-91.

Actually, wait. Let me look more carefully at what's on line 67. In the annotated code:

## Requirements
- **Cursor IDE** with **Nightly channel** (Settings → Beta → Update Channel → Nightly)

So line 67 is blank. This is confusing. Let me look at the raw markdown more carefully. The issue says line 67-67.

Looking at the structure again, there might be a discrepancy between how I'm reading it and how the linter is counting lines. But based on what I see, the only code blocks are the directory structure ones which I already addressed.

Let me skip this since I already covered the architecture section code blocks.

[scratchpad_end] -->

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a08f088 and 75ec78a.

⛔ Files ignored due to path filters (1)
  • .cursor/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (7)
  • .cursor/.gitignore
  • .cursor/INSTALL.md
  • .cursor/README.md
  • .cursor/cli.js
  • .cursor/package.json
  • README.md
  • docs/README.cursor.md
🧰 Additional context used
🧬 Code graph analysis (1)
.cursor/cli.js (2)
skills/writing-skills/render-graphs.js (2)
  • path (17-17)
  • fs (16-16)
.opencode/plugin/superpowers.js (1)
  • superpowersSkillsDir (21-21)
🪛 LanguageTool
docs/README.cursor.md

[style] ~114-~114: Consider using a different adverb to strengthen your wording.
Context: ...nel (Settings → Beta) 2. Restart Cursor completely 3. Check: `npx github:obra/superpowers/...

(COMPLETELY_ENTIRELY)

🪛 markdownlint-cli2 (0.18.1)
docs/README.cursor.md

67-67: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


78-78: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


88-88: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


116-116: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


119-119: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


134-134: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)

.cursor/INSTALL.md

67-67: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


78-78: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


88-88: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


116-116: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


119-119: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


134-134: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


172-172: Bare URL used

(MD034, no-bare-urls)


173-173: Bare URL used

(MD034, no-bare-urls)

🔇 Additional comments (10)
.cursor/.gitignore (1)

1-3: LGTM!

Standard ignore entries for a Node.js package: dependencies, logs, and macOS metadata files.

.cursor/README.md (1)

1-261: LGTM!

Comprehensive README with clear installation instructions, feature highlights, architecture diagrams, and troubleshooting guidance. The documentation aligns well with the CLI implementation and cross-references the shared lib/skills-core.js module appropriately.

.cursor/cli.js (6)

1-24: LGTM!

Clean ES module setup with proper __dirname derivation and well-structured logging utilities using chalk for consistent visual feedback.


25-46: LGTM!

Platform-specific Cursor detection covers common installation paths. The troubleshooting documentation appropriately guides users with custom installations to use manual setup.


285-293: LGTM!

Good practice to automatically update .gitignore to exclude the local installation directory. The check for existing entry prevents duplicate additions.


344-361: LGTM!

Good handling of user cancellation in the interactive prompt - the check for !installType on line 358 properly handles when the user exits the selection dialog.


372-437: LGTM!

The uninstall command properly confirms with the user before removing installations and cleans up both symlinks/junctions and the installation directory.


536-589: LGTM!

The update command correctly checks for git repository presence, fetches updates, and provides clear feedback. Error handling catches failures gracefully with informative messages.

.cursor/INSTALL.md (1)

344-347: Minor: Use markdown links instead of bare URLs.

The static analysis flagged bare URLs. Convert them to proper markdown link syntax for consistency.

Proposed fix
 ## Getting Help
 
-- **Documentation**: [Cursor Skills](https://cursor.com/cn/docs/context/skills) | [Superpowers](https://github.com/obra/superpowers)
+- **Documentation**: [Cursor Skills](https://cursor.com/cn/docs/context/skills) | [Superpowers](https://github.com/obra/superpowers)
 - **Issues**: [GitHub Issues](https://github.com/obra/superpowers/issues)
 - **Discussions**: [GitHub Discussions](https://github.com/obra/superpowers/discussions)

Note: The existing links already use proper markdown syntax. The static analysis hint at lines 172-173 appears to be a false positive since those lines contain the word "CLI" output examples, not the "Getting Help" section. The documentation looks good.

README.md (1)

29-43: LGTM! Clean integration of Cursor installation section.

The new Cursor installation section is well-structured and consistent with the existing platform-specific installation sections. The NPX command format and requirements are clearly stated.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

- Fix path prefix matching in createSymlink and removeLinkedSkills (add path.sep check)
- Add Node.js version compatibility: require 18.0.0+ to match ora v8 requirement
- Add copyDirRecursive fallback for older Node.js versions
- Fix markdown code block language specifier in INSTALL.md
- Fix relative link paths in docs/README.cursor.md
- Update documentation to reflect Node.js 18.0.0+ requirement
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🤖 Fix all issues with AI agents
In @.cursor/cli.js:
- Around line 536-564: The list command incorrectly treats paths like
"/path/skills-custom" as inside the skills dir because it uses
linkReal.startsWith(skillsDirReal) and entryReal.startsWith(skillsDirReal)
without a separator check; update the checks in the discoveredSkills loop and
the customSkills loop to require the skillsDirReal boundary by either comparing
equality or testing startsWith(skillsDirReal + path.sep) (ensure both paths are
normalized via getRealPathSafe or path.resolve beforehand), e.g. replace
linkReal.startsWith(skillsDirReal) and entryReal.startsWith(skillsDirReal) with
a safe-boundary check (linkReal === skillsDirReal ||
linkReal.startsWith(skillsDirReal + path.sep)) and similarly for entryReal so
only true child paths are considered linked to superpowers.

In @.cursor/INSTALL.md:
- Around line 179-181: The fenced code block containing the example user query
"Let's brainstorm ideas for improving our CI/CD pipeline" is missing a language
specifier; update that fenced block to use the markdown language tag "text"
(i.e., change the opening fence from ``` to ```text) so the example is
lint-compliant.

In @.cursor/README.md:
- Around line 183-190: Update the fenced code block that contains the module
diagram listing lib/skills-core.js and its functions (extractFrontmatter,
findSkillsInDir, stripFrontmatter, resolveSkillPath, checkForUpdates) to include
a language specifier by changing the opening fence from ``` to ```text so the
block becomes ```text and ensure the closing fence remains ```; this will mark
the diagram as plain text for proper rendering.
- Around line 78-91: Add a language specifier to the fenced code block
containing the directory diagram (the block that starts with "~/.cursor/" and
lists superpowers/ and skills/ entries) by changing the opening fence from ```
to ```text and keeping the closing fence; ensure the block begins with ```text
and ends with ``` so the diagram is rendered as plain text.

In `@docs/README.cursor.md`:
- Line 69: Documentation lists Node.js 14.0.0+ but project requirements and
dependencies need Node.js 18+, so update the Node.js requirement in
docs/README.cursor.md (the line showing "**Node.js** 14.0.0+") to "**Node.js**
18.0.0+" (or ">=18.0.0") to match package.json's "node": ">=18.0.0" and
.cursor/INSTALL.md and note the CLI dependency (ora v8) requires Node 18+.
- Around line 34-46: Update the fenced code blocks in README.cursor.md to
include the language specifier "text" for the plain text examples; specifically
change the blocks showing the agent flow (“Let’s build a new feature for user
authentication” → Agent uses ...) and the Manual Invocation block (the `/ →
"brainstorming" → Select` example) to start with ```text instead of ``` so they
satisfy markdownlint.
- Around line 74-91: Update the two fenced directory-diagram code blocks so they
include the language specifier "text" (change the opening fences from ``` to
```text) for both the ~/.cursor/ diagram and the your-project/ local install
diagram, leaving the closing ``` fences unchanged; ensure spacing and content of
the diagrams are preserved exactly while only adding the "text" specifier.
🧹 Nitpick comments (1)
.cursor/cli.js (1)

607-635: Update command relies on parsing git status output.

The check status.includes('behind') at line 622 is fragile as it depends on the English locale of git output. Users with non-English git configurations may see different text, causing the update detection to fail silently.

Consider using rev-list for locale-independent check
     // Fetch latest
     execSync('git fetch origin', { cwd: targetDir, stdio: 'pipe' });
     
-    // Check if behind
-    const status = execSync('git status -uno', { cwd: targetDir, encoding: 'utf8' });
-    
-    if (status.includes('behind')) {
+    // Check if behind using locale-independent method
+    const behindCount = execSync(
+      'git rev-list HEAD..@{u} --count',
+      { cwd: targetDir, encoding: 'utf8' }
+    ).trim();
+    
+    if (parseInt(behindCount, 10) > 0) {
       spinner.text = 'Updates available, pulling...';
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 75ec78a and 07d4419.

📒 Files selected for processing (5)
  • .cursor/INSTALL.md
  • .cursor/README.md
  • .cursor/cli.js
  • .cursor/package.json
  • docs/README.cursor.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • .cursor/package.json
🧰 Additional context used
🧬 Code graph analysis (1)
.cursor/cli.js (2)
skills/writing-skills/render-graphs.js (2)
  • path (17-17)
  • fs (16-16)
.opencode/plugin/superpowers.js (1)
  • superpowersSkillsDir (21-21)
🪛 LanguageTool
docs/README.cursor.md

[style] ~114-~114: Consider using a different adverb to strengthen your wording.
Context: ...nel (Settings → Beta) 2. Restart Cursor completely 3. Check: `npx github:obra/superpowers/...

(COMPLETELY_ENTIRELY)

🪛 markdownlint-cli2 (0.18.1)
docs/README.cursor.md

34-34: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


43-43: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


74-74: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


84-84: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

.cursor/README.md

78-78: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


183-183: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

.cursor/INSTALL.md

179-179: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🔇 Additional comments (10)
.cursor/cli.js (4)

26-43: LGTM - Good fallback for Node.js compatibility.

The copyDirRecursive function properly handles older Node.js versions where fs.cpSync is unavailable. The implementation correctly creates directories recursively and copies files.


99-143: Path prefix matching fix looks correct.

The updated logic at lines 112-115 properly checks for exact match or path separator to prevent false positives like /path/skills matching /path/skills-custom. This addresses the previous review feedback.


145-170: Path prefix matching fix applied consistently.

The removeLinkedSkills function now correctly uses the same path.sep check pattern at lines 157-160, consistent with the fix in createSymlink.


172-254: Global installation flow is well-structured.

The installGlobal function handles existing installations gracefully with user prompts, uses the shared skillsCore.findSkillsInDir for discovery, and provides clear feedback via spinners and success counts.

.cursor/INSTALL.md (2)

158-162: Previous review feedback addressed.

The code block now correctly includes the text language specifier.


1-353: Comprehensive installation documentation.

The guide covers all essential aspects: prerequisites, multiple installation methods (NPX, clone, manual), platform-specific instructions (including Windows PowerShell), verification steps, troubleshooting, and advanced configuration. Well organized and user-friendly.

docs/README.cursor.md (2)

105-108: Previous review feedback addressed.

The relative link paths have been corrected to use ../.cursor/ prefix, properly resolving from the docs/ directory.


123-123: Previous review feedback addressed.

The troubleshooting link path has been corrected.

.cursor/README.md (2)

119-124: Node.js requirement is correctly documented.

This file correctly states Node.js 18.0.0+ requirement, consistent with the package.json engine specification.


1-261: Well-structured documentation with good coverage.

The README provides comprehensive guidance including quick install, feature highlights, usage examples, architecture details, troubleshooting, platform comparisons, and development instructions. The shared core module documentation effectively communicates the cross-platform architecture.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

- Add path.sep check in list command for skill link detection
- Add path.sep check in custom skills detection
- Fix markdown code block language specifier in INSTALL.md
- Add text language specifier to all plain text code blocks
- Fix Node.js version requirement in docs/README.cursor.md (14.0.0+ → 18.0.0+)
- Ensure all documentation consistently requires Node.js 18.0.0+
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@docs/README.cursor.md`:
- Line 107: The "Cursor Skills" link text and href mismatch: the visible text
shows cursor.com/docs/context/skills but the anchor points to
https://cursor.com/cn/docs/context/skills; update the anchor href for the
"Cursor Skills" entry so it matches the displayed URL by changing it to
https://cursor.com/docs/context/skills.
♻️ Duplicate comments (1)
docs/README.cursor.md (1)

74-91: Add language specifiers to architecture diagrams.

The directory structure code blocks are missing language specifiers, which markdownlint flags. Add text to both blocks.

📝 Proposed fix
 **Global install:**
-```
+```text
 ~/.cursor/
 ├── superpowers/           # Full repo
 │   └── skills/           # All skills
 └── skills/               # Symlinks (Cursor discovers these)
     ├── brainstorming -> ../superpowers/skills/brainstorming
     └── ...
 ```
 
 **Local install:**
-```
+```text
 your-project/
 ├── .cursor-superpowers/  # Full repo
 └── .cursor/
     └── skills/           # Symlinks
         ├── brainstorming -> ../../.cursor-superpowers/skills/brainstorming
         └── ...
 ```
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 657938d and 8efa821.

📒 Files selected for processing (2)
  • .cursor/README.md
  • docs/README.cursor.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • .cursor/README.md
🧰 Additional context used
🪛 LanguageTool
docs/README.cursor.md

[style] ~114-~114: Consider using a different adverb to strengthen your wording.
Context: ...nel (Settings → Beta) 2. Restart Cursor completely 3. Check: `npx github:obra/superpowers/...

(COMPLETELY_ENTIRELY)

🪛 markdownlint-cli2 (0.18.1)
docs/README.cursor.md

74-74: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


84-84: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

- Change /cn/docs to /docs (English version instead of Chinese)
- Add text language specifier to global and local install diagrams
@obra
Copy link
Owner

obra commented Jan 19, 2026

Thanks so much for offering this up. I would love super powers to work cleanly inside of Cursor. This looks like there is a ton of code and prose that duplicates existing stuff. Is there a chance you could take a swing at the clean minimal version?

@L0-0m
Copy link

L0-0m commented Jan 20, 2026

great job, thank you !
and i found there is an redundant .. in INSTALL.md#Line114 (ln -sf "$(pwd)/$skill_name" ../../.cursor/skills/"$skill_name").
and also i use the following cmds for LOCAL installation on win11, but Cursor couldn't find the Junction-linked skills. (and it works well just copy skills to .cursor/skills.)

Get-ChildItem ".cursor-superpowers/skills" -Directory | ForEach-Object {
    $target = $_.FullName
    $link = Join-Path ".cursor/skills" $_.Name
    if (Test-Path $link) { Remove-Item $link }
    cmd /c mklink /J "$link" "$target"
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants