Skip to content

Generate flat Cursor command wrappers during install - #47

Merged
galel12 merged 2 commits into
mainfrom
cursor-command-wrappers
May 26, 2026
Merged

galel12 merged 2 commits into
mainfrom
cursor-command-wrappers

Conversation

@galel12

@galel12 galel12 commented May 25, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Integrates Cursor command wrapper generation into install.sh and cleanup into uninstall.sh, replacing the standalone cursor-flatten.sh draft script
  • Cursor only discovers SKILL.md files at the top level of .cursor/skills/*/ — it has no commands/ directory scanning like Claude Code. This means individual workflow phases (/start, /pr, /assess, etc.) were invisible to Cursor users
  • The installer now generates a flat wrapper directory per phase (e.g., .cursor/skills/code-review-start/SKILL.md) that reads the workflow's controller and dispatches the phase

How it works

Install (install.sh cursor):

  1. Symlinks workflow directories as before
  2. For each commands/*.md in a workflow, generates a wrapper directory with a thin SKILL.md
  3. Records all generated directory names in a .generated-wrappers manifest file

Uninstall (uninstall.sh cursor):

  1. Reads the .generated-wrappers manifest
  2. Removes listed wrapper directories (respects --workflows for selective uninstall)
  3. Updates or removes the manifest
  4. Removes workflow symlinks as before

Changes

  • install.sh — added generate_cursor_command_wrappers() helper, called from install_cursor()
  • uninstall.sh — added remove_cursor_command_wrappers() helper, called from uninstall_cursor()
  • README.md — split Usage section into Claude Code (colon-namespaced) and Cursor (hyphen-namespaced) with examples
  • CONTRIBUTING.md — documented Cursor wrapper generation in Installation Internals section

Testing

Tested on the flightctl project:

  • Full install: 67 wrappers generated across 12 workflows
  • Selective install (--workflows code-review,bugfix): 14 wrappers
  • Selective uninstall (--workflows bugfix): removes only bugfix wrappers, leaves code-review intact
  • Full uninstall: all 67 wrappers + manifest removed
  • Idempotent re-runs: overwrites cleanly without duplicates

Made with Cursor

Affected Workflows

All 12 workflows in the repository are affected by this change: ai-ready, bugfix, code-review, cve-fix, design, docs-writer, e2e, implement, kcs, prd, skill-reviewer, and triage. The changes apply uniformly across all workflows via the modified install/uninstall scripts.

Structural Changes to Commands/Skills

Cursor command discovery mechanism: The PR replaces per-workflow wrapper skill directories with a flat command file approach. Instead of creating directory structures like .cursor/skills/{workflow}-{phase}/SKILL.md, the installer now generates simple .md files directly in .cursor/commands/ (project scope) or ~/.cursor/commands/ (user scope), using the naming convention {workflow}-{phase}.md (e.g., bugfix-assess.md, code-review-start.md).

Generated command file structure: Each generated file contains:

  • Front-matter with description extracted from the workflow's commands/{phase}.md file (with fallback to the corresponding skills/{phase}.md)
  • A dispatch prompt that directs users to read the workflow's controller.md and execute the specified phase
  • Quote escaping in descriptions to prevent YAML injection

Skills directory symlinks: Workflow directories remain symlinked into .cursor/skills/{workflow}/ for top-level skill discovery, and the _shared/ directory is symlinked as before.

Installation and Uninstallation Changes

Install (install.sh):

  • New generate_cursor_commands(cmds_dir) function iterates all workflows and creates flat command files in the target commands directory
  • install_cursor() now creates both .cursor/skills and .cursor/commands directories and populates both
  • Scope-aware: directories are created at project level (.cursor/) or user level (~/.cursor/) based on installation scope

Uninstall (uninstall.sh):

  • New remove_cursor_commands(cmds_dir) function removes generated command files by matching {workflow}-{phase}.md filenames against actual source files in commands/
  • uninstall_cursor() calls this cleanup before removing symlinks
  • Selective uninstall (--workflows) correctly removes only commands belonging to specified workflows

Cross-Workflow and Shared Resources

The _shared/ directory and its symlink handling remain unchanged. No modifications were made to shared recipes, review protocols, or cross-workflow conventions. All workflows adopt the same flat command naming and generation mechanism uniformly.

Documentation Updates

README.md now documents the new flat slash-menu command format (/bugfix-assess, /code-review-start, etc.) for Cursor users and recommends adding .cursor/commands/ to project .gitignore. CONTRIBUTING.md added a new "Installation Internals" section explaining Cursor's dual discovery mechanisms (skills and commands directories), how the installer leverages both, and notes on symlink limitations in Cursor and how generated commands avoid relying on symlink resolution.

Review Change Stack

Cursor discovers skills by scanning .cursor/skills/*/SKILL.md — one
directory per entry. Unlike Claude Code, it has no commands/ discovery
system, so individual workflow phases (e.g., /start, /pr, /assess)
were invisible to Cursor users.

The installer now generates a flat wrapper directory per phase during
`install.sh cursor`. For a workflow like code-review with commands
start, continue, and clean, it creates:

  .cursor/skills/code-review-start/SKILL.md
  .cursor/skills/code-review-continue/SKILL.md
  .cursor/skills/code-review-clean/SKILL.md

Each wrapper is a thin SKILL.md that reads the workflow's controller
and dispatches the phase. A single .generated-wrappers manifest in
the skills directory tracks generated directories for clean removal
by uninstall.sh.

Tested: full install (67 wrappers), selective install/uninstall,
idempotent re-runs, and clean uninstall on flightctl project.

Co-authored-by: Cursor <cursoragent@cursor.com>
@coderabbitai

coderabbitai Bot commented May 25, 2026 •

Copy link
Copy Markdown

Walkthrough

This PR implements generation and management of Cursor command markdown files during installation. The install script now extracts command metadata from workflow definitions, generates flat hyphenated command files in a Cursor-accessible directory, and the uninstall script mirrors that cleanup to remove only the generated files without deleting unrelated content.

Changes

Cursor command file generation and lifecycle

Layer / File(s) Summary
User-facing documentation and gitignore guidance
CONTRIBUTING.md, README.md
CONTRIBUTING.md expands Installation Internals to document Claude and Cursor integration mechanics. README.md adds gitignore guidance for generated .cursor/commands/ files, updates the Scopes table to reflect both .cursor/skills/ and .cursor/commands/ usage, and restructures Usage with separate Claude Code (colon-namespaced) and Cursor (hyphenated) command subsections, clarifying that commands are generated .md files managed by install/uninstall.
Cursor command generation during install
install.sh
generate_cursor_commands() reads workflow commands/*.md files, extracts description metadata from YAML front-matter with fallback to skill docs, escapes quotes, writes composed markdown into the target directory, and reports the count. install_cursor() creates both skill and commands directories per scope, symlinks workflow skills, and invokes command generation.
Cursor command cleanup during uninstall
uninstall.sh
remove_cursor_commands() identifies and deletes only generated command files whose corresponding workflow sources still exist, avoiding removal of unrelated files. uninstall_cursor() computes the commands directory for the selected scope and calls the cleanup helper before continuing with skill symlink removal.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Suggested labels

documentation, scripts

Poem

A workflow so fine now has commands galore,
Cursor will find them, slash-menus to explore.
Install creates them, uninstall cleans sweep,
No orphaned files left, the house stays neat. 🚀

🚥 Pre-merge checks | ✅ 7 | ❌ 5

❌ Failed checks (5 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Ai-Attribution ⚠️ Warning AI tool (Cursor) was used and mentioned ("Made with Cursor"), but attributed with Co-authored-by trailer instead of proper Red Hat Assisted-by/Generated-by trailers. Replace Co-authored-by trailer with Assisted-by: Cursor or Generated-by: Cursor per Red Hat attribution standards.
Skill-Md-Under-30-Lines ⚠️ Warning skill-reviewer/SKILL.md is 73 lines, exceeding the 30-line limit. Detailed procedural steps, templates, and file layouts should be in guidelines.md or skills/ files. Move lines 22-73 (detailed steps, templates, file layout) to guidelines.md or skills/review.md; keep SKILL.md as thin entry point with frontmatter, Quick Start routing, and cross-references only.
No-Orphaned-References ⚠️ Warning 8 skill files contain dangling backtick-quoted path references: skills/controller.md should be controller.md (siblings in same directory) per CONTRIBUTING.md line 80 convention. In bugfix/skills/*.md (assess, diagnose, document, fix, pr, reproduce, review, test): change skills/controller.md to controller.md to match documented sibling-reference convention.
Step-Sequencing ⚠️ Warning bugfix/skills/pr.md has step-sequencing violations: starts at Step 0 (should be 1), has 11 steps (exceeds 10-step limit), and Step 3a is a full step mislabeled as sub-step. Renumber: Step 0→1, promote Step 3a→4, renumber Steps 4-9 to 5-10. Then consolidate to achieve 10 or fewer main steps.
✅ Passed checks (7 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Generate flat Cursor command wrappers during install' directly and specifically describes the main change: adding command wrapper generation to the install process.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
No-Absolute-Paths-In-Skills ✅ Passed No prohibited absolute paths found in workflow markdown files. Only /home/user/ placeholder paths in fenced code blocks, which are exempt per check instructions.
Command-Colon-Notation ✅ Passed All 71 command files across 12 workflows have properly formatted YAML frontmatter with name fields using correct colon notation (workflow:phase) matching their parent directories.
No-Content-Duplication ✅ Passed All 12 modified workflows checked: no substantial multi-line duplication found across SKILL.md, guidelines.md, and controller.md files. Each maintains its distinct role.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor-command-wrappers

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.

@galel12 galel12 self-assigned this May 25, 2026
@galel12
galel12 requested review from adalton and amir-yogev-gh May 25, 2026 11:00
@adalton

adalton commented May 25, 2026

Copy link
Copy Markdown
Collaborator

Thanks for tackling this, Gal — the problem is real and clearly articulated. Cursor's lack of commands/ subdirectory scanning means 67 phase-level entry points were invisible, and the wrapper generation approach is a reasonable workaround. A few things I'd like us to work through before merging:

Should these be .cursor/commands/ instead of wrapper skills?

Since Cursor 1.6, there's a native .cursor/commands/*.md system — plain markdown files where the filename becomes the /command-name in the slash menu. These wrapper SKILL.md files are functionally just thin dispatch prompts, which is exactly what the commands system was designed for.

Using commands would:

  • Keep the skills directory clean (12 workflow dirs, not 79)
  • Eliminate the need for a manifest file (just glob {wf}-*.md for cleanup)
  • Generate flat files instead of directories-with-a-single-file

The one concern is whether ~/.cursor/commands/ works for user-level installs — the docs only confirm project-level. Could you verify? If it works, I think commands are the clearly better fit. If not, the skills approach is defensible with the fixes below.

Prefix-matching bug in selective uninstall

if [[ "$wrapper_name" == "${wf}-"* ]]; then

This matches on a prefix, which breaks if one workflow name is a prefix of another. Today's names don't collide, but nothing prevents adding e.g. code-review-advanced in the future, at which point --workflows code-review would also nuke code-review-advanced-* wrappers.

A clean fix would be storing workflow/wrapper-name pairs in the manifest (e.g. bugfix/bugfix-assess) and matching on ^${wf}/ — unambiguous regardless of naming.

Double iteration in remove_cursor_command_wrappers()

The manifest is read twice: once to delete directories, then again to filter entries for selective uninstall. This can be collapsed into a single pass — accumulate kept entries while iterating, then write the filtered manifest once at the end.

Symlink chain fragility

The generated wrappers instruct the AI to Read the file `../{wf}/skills/controller.md` , which resolves through a symlinked workflow directory. There are reported issues with Cursor and symlinked skill directories. The wrappers themselves are real directories (good), but the dispatch still depends on the symlink being followed at runtime. Worth noting in the docs, at minimum. This is a pre-existing concern with the symlink-based install, not something this PR introduces, but it does add a layer of dependency on it.

Smaller items

  • Project-level .gitignore: For --project installs, 67 generated directories will show up as untracked in git status. Either document the recommended .gitignore pattern or have the installer handle it.
  • YAML injection in descriptions: description: "${description}" in the generated frontmatter would break if a description ever contains literal double quotes. Low risk today, but wrapping in single quotes or escaping would make it robust.
  • CONTRIBUTING.md numbering: The new item 3 ("Symlinks each workflow's commands/ directory into .claude/commands/...") describes Claude Code behavior but got inserted into what reads as a shared list. The numbering shifted — item 4 was previously item 3.

Summary

The commit message, testing, and documentation are all strong. My main ask is to investigate the .cursor/commands/ alternative before committing to the heavier wrapper-skills approach — if commands work at user-level, they're a meaningfully simpler solution. Either way, the prefix-matching issue should be fixed. Happy to pair on any of this.

Address PR review feedback from @adalton:

- Switch from generating wrapper SKILL.md directories in .cursor/skills/
  to generating flat .md files in .cursor/commands/. This is Cursor's
  native command system (since 1.6), works at both user-level
  (~/.cursor/commands/) and project-level, eliminates the need for a
  manifest file, and keeps the skills directory clean (12 workflow dirs
  instead of 79).

- Fix the prefix-matching bug in selective uninstall. The old approach
  matched wrapper names with "${wf}-"* which could collide if one
  workflow name prefixed another. The new approach validates each
  candidate file against the source workflow's commands/ directory.

- Escape double quotes in extracted descriptions to prevent YAML
  injection in generated frontmatter.

- Document recommended .gitignore pattern for project-level installs.

- Document symlink chain fragility and how generated commands avoid it
  by using absolute paths to $INSTALL_DIR.

- Fix CONTRIBUTING.md numbering and scope clarity for Claude Code items.

Co-authored-by: Cursor <cursoragent@cursor.com>
@galel12

galel12 commented May 25, 2026 •

Copy link
Copy Markdown
Member Author

Thanks for the thorough review, @adalton. Pushed a commit (see 39105c0) addressing everything:

.cursor/commands/ instead of wrapper skills — adopted

You were right — this is the clearly better fit. Verified that ~/.cursor/commands/ works for user-level installs (Cursor scans both project and user directories). The result:

  • 67 flat .md files instead of 67 directories-with-a-single-file
  • No manifest needed — uninstall identifies generated commands by matching {wf}-{phase}.md against the source workflow's commands/ directory
  • Skills directory stays clean — 12 workflow symlinks, not 79 entries
  • Net -21 lines across the four files

Prefix-matching bug — fixed

The new remove_cursor_commands() validates each candidate {wf}-{phase}.md by checking that ${INSTALL_DIR}/${wf}/commands/${phase}.md exists as a source file. A future code-review-advanced workflow would never collide with code-review during uninstall — no prefix matching at all.

Double iteration — eliminated

Single pass, no manifest, no temp file filtering. The flat-file approach made this a non-issue.

Symlink chain fragility — documented + mitigated

Added a note to CONTRIBUTING.md. The generated command files now use absolute paths to $INSTALL_DIR (e.g., Read /home/user/.ai-workflows/bugfix/skills/controller.md), so the slash commands work independently of symlink resolution. Only top-level skill discovery still depends on symlinks (pre-existing).

Smaller items

  • Project-level .gitignore: Documented the recommended pattern (.cursor/commands/) in README under the selective install section.
  • YAML injection: Added description="${description//\"/\\\"}" to escape double quotes before writing frontmatter.
  • CONTRIBUTING.md numbering: Fixed in the rewrite — Claude Code items (1-4) are clearly scoped under their own heading, Cursor items are separate.

Tested on flightctl: full install (67 commands), selective install/uninstall, idempotent re-runs, and clean uninstall all pass.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
install.sh (1)

22-22: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fix shell strict mode and Cursor command dispatch in install.sh

  • install.sh enables only set -e (line 22); update to set -euo pipefail so unset variables and pipeline failures don’t slip by.
    Suggested patch
-set -e
+set -euo pipefail
  • generate_cursor_commands() always tells agents to read ${INSTALL_DIR}/${wf}/skills/controller.md for every workflow (line 168); this breaks workflows that don’t include a controller (per CONTRIBUTING.md). Generate commands should conditionally reference ../skills/controller.md when present, otherwise fall back to ../SKILL.md or the phase skill, and use relative paths from the command file location.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@install.sh` at line 22, Update shell strictness and fix cursor command path
selection: change the global shell flags in install.sh from set -e to set -euo
pipefail to fail on unset vars and pipeline errors; and modify the
generate_cursor_commands() function so it checks per-workflow whether a
controller file exists and emits a relative path to the nearest skill file
instead of always using ${INSTALL_DIR}/${wf}/skills/controller.md —
specifically: when building commands for a workflow (variables wf, INSTALL_DIR)
test for ../skills/controller.md relative to the command file, if present use
that path, otherwise fall back to ../SKILL.md or the phase-specific skill file,
and ensure paths are relative from the command file location when written to the
generated command files.
uninstall.sh (1)

18-18: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fix uninstall.sh shell strict mode and Cursor command cleanup

  • uninstall.sh uses set -e only; update to set -euo pipefail for safer cleanup.
  • remove_cursor_commands() only removes .cursor/commands/${wf}-*.md when the corresponding ${INSTALL_DIR}/${wf}/commands/${phase}.md still exists; if a phase is removed upstream, previously generated wrappers for that phase remain.
Suggested patch
-set -e
+set -euo pipefail
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@uninstall.sh` at line 18, Update shell strict mode in uninstall.sh from using
set -e to set -euo pipefail for safer error handling, and modify the
remove_cursor_commands() function so it no longer only deletes
.cursor/commands/${wf}-*.md when ${INSTALL_DIR}/${wf}/commands/${phase}.md
exists; instead iterate over the actual files in .cursor/commands matching
${wf}-*.md, parse the phase/name from each filename and remove those wrapper
files unconditionally (or after confirming their derived phase no longer exists
upstream) so stale wrapper files are cleaned up; ensure the function still uses
the wf and INSTALL_DIR variables and handles missing files/empty globs safely
under the new strict mode.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CONTRIBUTING.md`:
- Around line 95-103: The docs currently instruct generated command files
(`.cursor/commands/{workflow}-{phase}.md`) to use absolute paths to
`$INSTALL_DIR`, which conflicts with the project's rule that all file references
must be relative for symlink compatibility; update the text to require relative
paths instead (e.g., reference the workflow/controller via a path relative to
the command file or the skill root) and explicitly state that generated wrappers
must resolve the workflow controller using relative references so they remain
portable and work when `.cursor/skills/{workflow}` is a symlink pointing to
`~/.ai-workflows/{workflow}`; remove the absolute-path example and replace it
with guidance to compute paths relative to the command file or workflow root
when producing dispatch prompts.

In `@install.sh`:
- Around line 166-170: The script currently assumes every workflow has a
controller by always referencing `${INSTALL_DIR}/${wf}/skills/controller.md`;
change the dispatch logic to first test for the existence of
`${INSTALL_DIR}/${wf}/skills/controller.md` and only use it when present,
otherwise fall back to the phase-specific command file (e.g.,
`${INSTALL_DIR}/${wf}/skills/${phase}.md` or dispatch the phase directly from
the workflow directory); update the generated Cursor command construction to
branch on this existence check so workflows without a controller produce valid
commands without breaking.

In `@README.md`:
- Around line 140-142: The table rows for "**User** (default)" and "**Project**
(`--project`)" in README.md use home-absolute paths (e.g.,
"~/.cursor/skills/<workflow>", "~/.cursor/commands/", "~/.claude/CLAUDE.md");
update these examples to use relative paths instead (e.g.,
".cursor/skills/<workflow>", ".cursor/commands/", ".claude/CLAUDE.md") and apply
the same change to the other occurrence noted around the later reference so all
workflow-facing path examples are relative and symlink-safe.

In `@uninstall.sh`:
- Around line 125-134: The loop in uninstall.sh that iterates WORKFLOWS and
cmd_file currently only deletes generated command files when the corresponding
source file exists, leaving orphan files when a source phase was removed; change
the conditional around "${INSTALL_DIR}/${wf}/commands/${suffix}.md" to remove
the generated file when the source file or phase no longer exists (i.e., if the
source path is missing/does not exist), so rm -f "$cmd_file" and increment
removed in that branch; reference the loop variables WORKFLOWS, cmds_dir,
cmd_file, base, suffix, INSTALL_DIR and the removed counter when making this
change.

---

Outside diff comments:
In `@install.sh`:
- Line 22: Update shell strictness and fix cursor command path selection: change
the global shell flags in install.sh from set -e to set -euo pipefail to fail on
unset vars and pipeline errors; and modify the generate_cursor_commands()
function so it checks per-workflow whether a controller file exists and emits a
relative path to the nearest skill file instead of always using
${INSTALL_DIR}/${wf}/skills/controller.md — specifically: when building commands
for a workflow (variables wf, INSTALL_DIR) test for ../skills/controller.md
relative to the command file, if present use that path, otherwise fall back to
../SKILL.md or the phase-specific skill file, and ensure paths are relative from
the command file location when written to the generated command files.

In `@uninstall.sh`:
- Line 18: Update shell strict mode in uninstall.sh from using set -e to set
-euo pipefail for safer error handling, and modify the remove_cursor_commands()
function so it no longer only deletes .cursor/commands/${wf}-*.md when
${INSTALL_DIR}/${wf}/commands/${phase}.md exists; instead iterate over the
actual files in .cursor/commands matching ${wf}-*.md, parse the phase/name from
each filename and remove those wrapper files unconditionally (or after
confirming their derived phase no longer exists upstream) so stale wrapper files
are cleaned up; ensure the function still uses the wf and INSTALL_DIR variables
and handles missing files/empty globs safely under the new strict mode.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 5f694770-e689-44c4-bb3b-85d1ffdcb4ae

📥 Commits

Reviewing files that changed from the base of the PR and between 58ad70b and 39105c0.

📒 Files selected for processing (4)
  • CONTRIBUTING.md
  • README.md
  • install.sh
  • uninstall.sh
📜 Review details
🧰 Additional context used
📓 Path-based instructions (2)
**/*.md

📄 CodeRabbit inference engine (AGENTS.md)

**/*.md: All file references must use relative paths for symlink compatibility
Do not use IDE-specific syntax in workflow content—use only plain markdown

Workflow content should be plain markdown with no IDE-specific syntax

Files:

  • CONTRIBUTING.md
  • README.md

⚙️ CodeRabbit configuration file

**/*.md: Cross-workflow consistency (ai-workflows conventions):

  • All file references must be relative paths (never absolute) —
    this is critical for symlink compatibility
  • No IDE-specific syntax (Cursor-specific, VS Code-specific, etc.)
  • Consistent terminology within a workflow: pick one term, stick
    with it
  • Schema field names and types must match between producer and
    consumer files (e.g., if a field is defined in one phase skill
    and consumed in another, names and types must agree)
  • No verbatim duplication of multi-line instruction blocks
    across SKILL.md, guidelines.md, and controller.md — each has
    a distinct role (shared phase names and brief references are
    expected cross-referencing, not duplication)

Files:

  • CONTRIBUTING.md
  • README.md
**/*.sh

⚙️ CodeRabbit configuration file

**/*.sh: Shell script review (ai-workflows conventions):

  • Must use set -euo pipefail for safety
  • install.sh and uninstall.sh: verify auto-discovery logic
    (scanning for */SKILL.md) is correct
  • validate-structure.sh: verify checks match current
    CONTRIBUTING.md conventions
  • No hardcoded workflow lists — rely on SKILL.md auto-discovery

Files:

  • install.sh
  • uninstall.sh
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: flightctl/ai-workflows

Timestamp: 2026-05-25T16:48:06.798Z
Learning: Workflow directories must be named with lowercase letters and hyphens only
Learnt from: CR
Repo: flightctl/ai-workflows

Timestamp: 2026-05-25T16:48:06.798Z
Learning: Every workflow directory must contain SKILL.md, guidelines.md, and README.md as required files
Learnt from: CR
Repo: flightctl/ai-workflows

Timestamp: 2026-05-25T16:48:06.798Z
Learning: Use consistent terminology within a workflow and pick one term and stick with it
🪛 LanguageTool
README.md

[style] ~149-~149: Consider using the typographical ellipsis character here instead.
Context: ...ss, /bugfix:diagnose, /bugfix:fix, ... - /code-review:start, /code-review:c...

(ELLIPSIS)


[style] ~151-~151: Consider using the typographical ellipsis character here instead.
Context: ...ocs-writer:plan, /docs-writer:draft`, ... ### Cursor The installer generates fl...

(ELLIPSIS)


[style] ~157-~157: Consider using the typographical ellipsis character here instead.
Context: ...ss, /bugfix-diagnose, /bugfix-fix, ... - /code-review-start, /code-review-c...

(ELLIPSIS)


[style] ~159-~159: Consider using the typographical ellipsis character here instead.
Context: ...ocs-writer-plan, /docs-writer-draft, ... Cursor scans both project-level (.cur...

(ELLIPSIS)


[style] ~161-~161: This word has been used in one of the immediately preceding sentences. Using a synonym could make your text more interesting to read, unless the repetition is intentional.
Context: ...es — no manifest or wrapper directories needed. They are created by install.sh and c...

(EN_REPEATEDWORDS_NEED)

Comment thread CONTRIBUTING.md
Comment thread install.sh
Comment thread README.md
Comment thread uninstall.sh
@coderabbitai

coderabbitai Bot commented May 25, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

@galel12 — Understood on both fronts:

  • AI-Attribution: Noted; once the commit trailer is updated that warning should clear.

  • Pre-existing warnings (Docstring Coverage, Skill-Md-Under-30-Lines, No-Orphaned-References, Step-Sequencing in skill-reviewer/SKILL.md and bugfix/skills/*.md): Agreed — these are not introduced by this PR and are out of scope here. Tracking them in separate PRs is the right call.

Would you like me to open follow-up issues for each of those pre-existing warnings so they don't get lost? I can create one issue per concern (or a single grouped issue) and assign it to you.

@adalton

adalton commented May 25, 2026

Copy link
Copy Markdown
Collaborator

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 25, 2026

Copy link
Copy Markdown
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@adalton

adalton commented May 25, 2026

Copy link
Copy Markdown
Collaborator

@coderabbitai approve

@coderabbitai

coderabbitai Bot commented May 25, 2026

Copy link
Copy Markdown
✅ Actions performed

Comments resolved and changes approved.

@galel12
galel12 merged commit 37a380a into main May 26, 2026
7 checks passed
@galel12
galel12 deleted the cursor-command-wrappers branch May 26, 2026 06:21
redhat-chai-bot pushed a commit to redhat-chai-bot/flightctl_ai-workflows that referenced this pull request Sep 18, 2026
Generate flat Cursor command wrappers during install
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