Skip to content

Comments

feat: Adds native Qwen Code CLI support following the same patterns as Codex and OpenCode installers, incorporating findings from #128.#516

Open
mhenke wants to merge 19 commits intoobra:mainfrom
mhenke:feature/qwen-cli-support
Open

feat: Adds native Qwen Code CLI support following the same patterns as Codex and OpenCode installers, incorporating findings from #128.#516
mhenke wants to merge 19 commits intoobra:mainfrom
mhenke:feature/qwen-cli-support

Conversation

@mhenke
Copy link

@mhenke mhenke commented Feb 20, 2026

Summary

Adds native Qwen Code CLI support following the same patterns as Codex and OpenCode
installers, incorporating findings from #128.

Context

Issue #128 documented that context files (GEMINI.md/QWEN.md) are advisory, not
executable
— the model ignores mandatory instructions in them. The community
converged on: install script + individual skill symlinks (hub pattern) + context
injection with tool mappings. This PR follows that pattern, matching
.codex/INSTALL.md and .opencode/INSTALL.md.

Changes

  • .qwen/install.sh — Install script that:
    • Symlinks each skill individually into ~/.qwen/skills/ (hub pattern, coexists
      with user skills)
    • Injects Superpowers context block into ~/.qwen/QWEN.md with idempotent markers
      (<!-- SUPERPOWERS-CONTEXT-START/END -->)
    • Includes terminology mapping (Claude Code tools → Qwen equivalents)
  • .qwen/INSTALL.md — Installation guide (fetch-and-follow pattern, matching
    Codex/OpenCode)
  • QWEN.md — Context file with tool mapping (no mandatory language)
  • qwen-extension.json — Extension manifest (alternative install path)
  • docs/README.qwen.md — Full docs: tool mapping table, usage, updating,
    uninstalling, troubleshooting
  • README.md — Added Qwen section using fetch-and-follow install pattern

How to Test

# Install from this branch
git clone -b feature/qwen-cli-support https://github.com/mhenke/superpowers.git
~/.qwen/superpowers
~/.qwen/superpowers/.qwen/install.sh

# Verify
ls -l ~/.qwen/skills/            # individual skill symlinks
grep SUPERPOWERS ~/.qwen/QWEN.md # context block injected

Then in Qwen Code CLI:

- [ ]  /skills lists all Superpowers skills
- [ ]  Ask "Do you have superpowers?" — agent responds affirmatively
- [ ]  Ask to brainstorm a feature — agent uses the brainstorming skill

Addresses

- #128 — context-file advisory finding, tool mapping gap, install script approach
- Follows same patterns as .codex/INSTALL.md and .opencode/INSTALL.md
- Compatible with PR #499 approach (hub pattern, context injection)

- Add qwen-extension.json manifest for 'qwen extensions install'
- Add QWEN.md context file for auto-activating using-superpowers skill
- Update docs/README.qwen.md with extension install as primary method
- Update README.md with one-liner install command
- Existing .md commands already work natively (Qwen uses same format)
- Note: Qwen Code can also auto-convert gemini-extension.json
@coderabbitai
Copy link

coderabbitai bot commented Feb 20, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds comprehensive Qwen Code CLI integration to Superpowers, including installation automation via Bash script, configuration metadata, detailed documentation, subagent definitions (code-reviewer, implementer, spec-reviewer with templates), and skill documentation enhancements with code examples.

Changes

Cohort / File(s) Summary
Installation & Configuration
.qwen/INSTALL.md, .qwen/install.sh, qwen-extension.json
Introduces installation documentation and executable Bash script for setting up Qwen integration, creating directories, symlinking skills and agents, and injecting context into QWEN.md. Configuration file declares extension metadata (name: superpowers, version: 4.3.0).
Documentation
README.md, docs/README.qwen.md, .qwen/QWEN.md
Updates root README with Qwen Code CLI installation section; adds detailed Qwen integration guide covering Quick Install, tool mappings (Claude to Qwen equivalents), discovery/usage, and troubleshooting; introduces core context file documenting Superpowers skills library integration.
Subagent Definitions
.qwen/agents/code-reviewer.md, .qwen/agents/code-reviewer-prompt-template.md, .qwen/agents/implementer.md, .qwen/agents/implementer-prompt-template.md, .qwen/agents/spec-reviewer.md, .qwen/agents/spec-reviewer-prompt-template.md
Defines three specialized subagents with YAML frontmatter (name, description, tools) and system prompts: code-reviewer evaluates quality across readability/maintainability/testing; implementer executes tasks with self-review; spec-reviewer verifies implementation against requirements. Includes corresponding prompt templates for each subagent type.
Skill Documentation Examples
skills/dispatching-parallel-agents/SKILL.md, skills/requesting-code-review/SKILL.md, skills/writing-skills/SKILL.md
Adds code examples demonstrating Qwen Code CLI usage patterns: parallel task dispatch, code-reviewer subagent invocation, and RED-GREEN-REFACTOR workflow testing in both Python and TypeScript contexts.

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant InstallScript as install.sh
    participant FileSystem as File System
    participant QwenConfig as Qwen Config<br/>(.qwen/)
    
    User->>InstallScript: Execute install.sh
    InstallScript->>FileSystem: Check/create ~/.qwen directories
    InstallScript->>FileSystem: Validate skills directory
    InstallScript->>FileSystem: Create skill symlinks<br/>(repo → ~/.qwen/skills)
    InstallScript->>FileSystem: Create agent symlinks<br/>(repo → ~/.qwen/agents)
    InstallScript->>FileSystem: Symlink prompt templates<br/>to agent targets
    InstallScript->>QwenConfig: Inject context block<br/>into QWEN.md
    InstallScript->>User: Display completion message<br/>& restart instructions
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 Hop, skip, and symlink away!

Qwen's skills now have their day,

Implementers and reviewers unite,

Superpowers shine so bright! ✨

Install and code with delight! 🎉

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: adding native Qwen Code CLI support following established patterns from Codex/OpenCode installers and addressing issue #128.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, covering the rationale (context files are advisory), the approach (install script + hub pattern + context injection), detailed changes, and testing instructions.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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.

- Add .qwen/install.sh with hub pattern (individual skill symlinks)
- Add .qwen/INSTALL.md matching Codex/OpenCode install doc pattern
- Add idempotent context injection into ~/.qwen/QWEN.md with markers
- Add terminology mapping (Claude Code tools → Qwen equivalents)
- Update QWEN.md to include tool mapping (drop mandatory language)
- Update README.md to use fetch-and-follow install pattern
- Update docs/README.qwen.md with full tool mapping table

Addresses gaps identified in obra#128:
- GEMINI.md/QWEN.md advisory-not-executable finding
- Missing tool terminology translation
- Missing install script (was extension-only)
- Single directory symlink → hub pattern
@mhenke mhenke changed the title feat: Add native Qwen Code CLI extension support feat: Adds native Qwen Code CLI support following the same patterns as Codex and OpenCode installers, incorporating findings from #128. Feb 20, 2026
@mhenke mhenke marked this pull request as ready for review February 20, 2026 21:17
Copilot AI review requested due to automatic review settings February 20, 2026 21:17
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR adds native Qwen Code CLI support following patterns established for Codex and OpenCode installers. Based on learnings from issue #128 (which found that context files are advisory, not executable in similar CLIs), this implementation uses an install script with individual skill symlinks (hub pattern) plus context injection with tool mappings.

Changes:

  • Adds .qwen/install.sh script that symlinks each skill individually into ~/.qwen/skills/ and injects context with tool mappings into ~/.qwen/QWEN.md
  • Includes comprehensive installation documentation following the fetch-and-follow pattern used by Codex and OpenCode
  • Provides both install script approach (recommended) and extension manifest approach (alternative) for flexibility

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
qwen-extension.json Extension manifest for alternative qwen extensions install path
QWEN.md Context file with simplified tool mappings for extension-based install
.qwen/install.sh Installation script implementing hub pattern (individual skill symlinks) with idempotent context injection
.qwen/INSTALL.md Installation guide following fetch-and-follow pattern, includes tool mapping documentation
docs/README.qwen.md Comprehensive documentation covering installation, usage, tool mappings, troubleshooting, and uninstallation
README.md Added Qwen section with fetch-and-follow install instructions consistent with Codex/OpenCode

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

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: 2

🧹 Nitpick comments (3)
docs/README.qwen.md (2)

63-65: Bash naming here is more accurate — consider standardising across all files.

This table correctly uses the actual Claude Code tool name (Bash), but .qwen/INSTALL.md (line 90), QWEN.md (line 15), and the install.sh injected context block (line 78) all use the informal Shell label. Users cross-referencing the files may be confused by the mismatch. Standardising on Bash (the real tool name) across all four documents would be cleaner.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/README.qwen.md` around lines 63 - 65, The README table uses the tool
label `Bash` while other docs use `Shell`, causing inconsistency; update all
occurrences of the informal label to the canonical tool name `Bash` so the
mapping entries remain consistent (e.g., change any `Shell` labels that map to
`run_shell_command` in .qwen/INSTALL.md, QWEN.md, and the install.sh context
block to `Bash`), and verify the table rows (`Search`→`search_file_content`,
`Glob`→`glob`, `Bash`→`run_shell_command`) are identical across documents.

9-11: Consider adding text language specifier for consistency with the SA tooling.

The "Tell Qwen" fetch instruction block at line 9 has no language specifier — identical to the pattern the SA tool correctly flags in .qwen/INSTALL.md. While the tool didn't warn here, adding text aligns with MD040 and makes intent explicit.

♻️ Proposed fix
-```
+```text
 Fetch and follow instructions from https://raw.githubusercontent.com/obra/superpowers/refs/heads/main/.qwen/INSTALL.md
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @docs/README.qwen.md around lines 9 - 11, The fenced code block containing
the fetch instruction ("" followed by the URL line Fetch and follow instructions from https://raw.githubusercontent.com/obra/superpowers/refs/heads/main/.qwen/INSTALL.md "") should include the language specifier text (i.e., change the opening
fence to "text") so the block is explicitly marked as plain text and conforms to the MD040/SA tooling expectation; update that specific fenced block in the README.qwen content to begin with text and keep the URL line unchanged.


</details>

</blockquote></details>
<details>
<summary>.qwen/install.sh (1)</summary><blockquote>

`36-53`: **Symlink targets include a trailing `/` — strip it for cleaner links.**

Because the glob `"$REPO_SKILLS_DIR"/*/` captures a trailing slash, `$skill_path` resolves to something like `/path/to/skills/brainstorming/`. The `ln -s` call embeds that slash in the stored symlink target, which is valid but non-standard (`ls -la` will show the trailing slash in the target path). `basename` already strips it for `$skill_name`, so a matching strip for `$skill_path` keeps things tidy.


<details>
<summary>♻️ Proposed fix</summary>

```diff
     skill_name=$(basename "$skill_path")
+    skill_path="${skill_path%/}"
     target_path="$SKILLS_DIR/$skill_name"
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In @.qwen/install.sh around lines 36 - 53, The symlink target currently includes
a trailing slash because the glob "$REPO_SKILLS_DIR"/*/ yields paths ending with
'/', so when creating the link with ln -s "$skill_path" "$target_path" the
stored target contains that slash; strip the trailing slash from the source path
before linking (e.g., use parameter expansion to set a variable like
skill_src="${skill_path%/}" and use that for ln -s) while keeping existing
variables skill_path, skill_name and target_path and preserving the existing
checks for existing files/links.
```

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>🤖 Prompt for all review comments with AI agents</summary>

Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.qwen/INSTALL.md:

  • Around line 61-63: The plain fenced code blocks containing the Qwen prompts
    (for example the blocks with "/skills", "use the brainstorming skill", and "help
    me plan this feature using the writing-plans skill") should include a language
    specifier to silence markdownlint MD040 and clarify intent; update each
    triple-backtick fence to start with text (or plaintext) so the blocks read
    as text fenced code blocks rather than unspecified code blocks.

In @.qwen/install.sh:

  • Around line 98-102: The current awk command (awk 'NF{p=1} p') removes leading
    blank lines rather than trailing, causing extra blank lines to accumulate before
    appending CONTEXT_BLOCK; replace the awk trimming+mv step with a portable
    trailing-blank-line trimmer (e.g., a sed loop that deletes only trailing empty
    lines) applied to "$QWEN_MD", and then append CONTEXT_BLOCK using a controlled
    echo/printf that ensures exactly one blank line separation (update the section
    around the awk line and the echo -e "\n\n$CONTEXT_BLOCK" >> "$QWEN_MD" to use
    the new sed-based trim and a single newline when appending).

Nitpick comments:
In @.qwen/install.sh:

  • Around line 36-53: The symlink target currently includes a trailing slash
    because the glob "$REPO_SKILLS_DIR"/*/ yields paths ending with '/', so when
    creating the link with ln -s "$skill_path" "$target_path" the stored target
    contains that slash; strip the trailing slash from the source path before
    linking (e.g., use parameter expansion to set a variable like
    skill_src="${skill_path%/}" and use that for ln -s) while keeping existing
    variables skill_path, skill_name and target_path and preserving the existing
    checks for existing files/links.

In @docs/README.qwen.md:

  • Around line 63-65: The README table uses the tool label Bash while other
    docs use Shell, causing inconsistency; update all occurrences of the informal
    label to the canonical tool name Bash so the mapping entries remain consistent
    (e.g., change any Shell labels that map to run_shell_command in
    .qwen/INSTALL.md, QWEN.md, and the install.sh context block to Bash), and
    verify the table rows (Searchsearch_file_content, Globglob,
    Bashrun_shell_command) are identical across documents.
  • Around line 9-11: The fenced code block containing the fetch instruction
    ("" followed by the URL line Fetch and follow instructions from https://raw.githubusercontent.com/obra/superpowers/refs/heads/main/.qwen/INSTALL.md "") should include the language specifier text (i.e., change the opening
    fence to "text") so the block is explicitly marked as plain text and conforms to the MD040/SA tooling expectation; update that specific fenced block in the README.qwen content to begin with text and keep the URL line unchanged.

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

- docs/README.qwen.md: standardize tool naming (Bash → Shell)
- docs/README.qwen.md: add text language specifier to code blocks
- .qwen/install.sh: strip trailing slash in symlink targets
- .qwen/install.sh: move symlink check before mkdir calls
- .qwen/install.sh: use defensive awk for empty files
- .qwen/INSTALL.md: add text language specifiers to Qwen prompts
- README.md: link to docs/README.qwen.md for consistency

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
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

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@README.md`:
- Around line 58-60: The fenced code block that currently contains the
natural-language prompt/URL should include the Markdown language specifier
"text" to satisfy MD040; update the fenced block in README.md (the block
containing "Fetch and follow instructions from
https://raw.githubusercontent.com/obra/superpowers/refs/heads/main/.qwen/INSTALL.md")
to use ```text as the opening fence so it matches the equivalent blocks in
.qwen/INSTALL.md.

@mhenke
Copy link
Author

mhenke commented Feb 20, 2026

@claude code review please

Satisfies MD040 by adding text language specifier to fenced code blocks
containing natural-language install prompts for Qwen, Codex, and OpenCode.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
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.

Caution

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

⚠️ Outside diff range comments (1)
README.md (1)

29-29: ⚠️ Potential issue | 🟡 Minor

Update the "Note" to include Qwen Code CLI.

Line 29 currently lists only Codex and OpenCode as requiring manual setup, but the newly added Qwen Code CLI section follows the same manual fetch-and-follow pattern.

📝 Proposed fix
-**Note:** Installation differs by platform. Claude Code or Cursor have built-in plugin marketplaces. Codex and OpenCode require manual setup.
+**Note:** Installation differs by platform. Claude Code or Cursor have built-in plugin marketplaces. Codex, OpenCode, and Qwen Code CLI require manual setup.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` at line 29, The "Note" mentioning installation differences
currently states "Codex and OpenCode require manual setup" but omits Qwen Code
CLI; update that Note (the line containing "**Note:** Installation differs by
platform. Claude Code or Cursor have built-in plugin marketplaces. Codex and
OpenCode require manual setup.") to also mention Qwen Code CLI so it reads that
Codex, OpenCode, and Qwen Code CLI require manual setup or otherwise include
Qwen Code CLI in the list of tools requiring manual fetch-and-follow
installation instructions.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@README.md`:
- Line 29: The "Note" mentioning installation differences currently states
"Codex and OpenCode require manual setup" but omits Qwen Code CLI; update that
Note (the line containing "**Note:** Installation differs by platform. Claude
Code or Cursor have built-in plugin marketplaces. Codex and OpenCode require
manual setup.") to also mention Qwen Code CLI so it reads that Codex, OpenCode,
and Qwen Code CLI require manual setup or otherwise include Qwen Code CLI in the
list of tools requiring manual fetch-and-follow installation instructions.

Updates installation note to mention that Qwen Code CLI, like Codex
and OpenCode, requires manual fetch-and-follow setup.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 6 out of 6 changed files in this pull request and generated 4 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

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

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@README.md`:
- Line 29: Update the note sentence that currently reads "Codex, OpenCode, and
Qwen Code CLI" so its item order matches the README section order below (which
lists "Qwen Code CLI" first, then "Codex", then "OpenCode"); locate the note
string in README.md and reorder the three names to "Qwen Code CLI, Codex, and
OpenCode" (or alternatively reorder the sections to match the original note) so
the note and section headings are consistent.

@obra obra added the new-harness Requests for harnesses with few existing items label Feb 21, 2026
- Correct comment for awk command (trailing → leading)
- Standardize tool naming (ReadFile → read_file) in install.sh context block
- Add missing web_fetch mapping to QWEN.md

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 6 out of 6 changed files in this pull request and generated no new comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

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.

🧹 Nitpick comments (1)
.qwen/install.sh (1)

52-52: Symlinks use absolute paths — repo relocation silently breaks all skill links.

$skill_path is derived via pwd (line 14), so every symlink written to ~/.qwen/skills/ embeds the absolute path of the repo checkout. Moving or renaming the repo breaks all skills without any warning.

♻️ Portable relative-path alternative
-        ln -s "$skill_path" "$target_path"
+        # Compute path relative to the target directory for portability
+        rel_path="$(python3 -c "import os,sys; print(os.path.relpath(sys.argv[1], sys.argv[2]))" \
+            "$skill_path" "$SKILLS_DIR")"
+        ln -s "$rel_path" "$target_path"

If Python is unavailable, the GNU-only ln -sr flag also produces relative symlinks:

-        ln -s "$skill_path" "$target_path"
+        ln -sr "$skill_path" "$target_path"

Note: -r is GNU coreutils only; not available on macOS ln without a compatibility shim.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.qwen/install.sh at line 52, The current symlink creation uses an absolute
path via ln -s "$skill_path" "$target_path", which breaks if the repo is moved;
change it to create relative symlinks instead (compute the path from the target
directory to $skill_path and pass that relative path to ln). Detect availability
of a relative-symlink method: prefer GNU ln -sr if present, otherwise compute a
relative path with the available Python (or a small POSIX shell fallback) and
call ln -s with that relative path; keep using $skill_path and $target_path
identifiers so the replacement is localized to the existing symlink logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In @.qwen/install.sh:
- Around line 100-104: The current awk invocation trims leading blank lines but
preserves trailing blank lines so each run accumulates extra newlines before
appending the CONTEXT_BLOCK to QWEN_MD; change the pipeline that processes
"$QWEN_MD" (the awk step) to trim trailing blank lines instead (e.g., buffer
blank lines and only print them when a non-empty line follows) and then append
the context block using a single, portable separator (replace echo -e usage) so
you append one consistent separator before "$CONTEXT_BLOCK" and avoid growing
blank lines on each run.

---

Nitpick comments:
In @.qwen/install.sh:
- Line 52: The current symlink creation uses an absolute path via ln -s
"$skill_path" "$target_path", which breaks if the repo is moved; change it to
create relative symlinks instead (compute the path from the target directory to
$skill_path and pass that relative path to ln). Detect availability of a
relative-symlink method: prefer GNU ln -sr if present, otherwise compute a
relative path with the available Python (or a small POSIX shell fallback) and
call ln -s with that relative path; keep using $skill_path and $target_path
identifiers so the replacement is localized to the existing symlink logic.

mhenke and others added 3 commits February 22, 2026 11:56
- Create relative symlinks for portability (GNU ln -sr with Python fallback)
- Trim trailing (not leading) blank lines to prevent accumulation
- Use printf instead of echo -e for consistent newline handling

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Add implementer, spec-reviewer, code-reviewer agent definitions
- Update installer to symlink agents to ~/.qwen/agents/
- Update README.qwen.md with task() tool documentation
- Update injected context with correct Task → task() mapping

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Add implementer, spec-reviewer, code-reviewer prompt templates for task()
- Update installer to symlink templates over Claude Code prompt files
- Enables subagent-driven-development skill for Qwen Code CLI

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- dispatching-parallel-agents: Add Qwen task() examples alongside Claude Task()
- requesting-code-review: Add Qwen task() dispatch syntax
- writing-skills: Add Qwen task() syntax for testing examples

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 15 out of 15 changed files in this pull request and generated 9 comments.

Comments suppressed due to low confidence (1)

skills/dispatching-parallel-agents/SKILL.md:80

  • The code example labels "For Qwen Code CLI:" followed by a Python-style code block, then "For Claude Code:" followed by a TypeScript-style code block. However, the comment at line 75 in the same file says "// In Claude Code / AI environment" which suggests TypeScript/JavaScript syntax. This labeling is inconsistent with other parts of the codebase.

For consistency, consider whether:

  1. The label should match the comment style (Python uses #, TypeScript uses //)
  2. The language identifier in the code fence should be explicit (python vs typescript)
  3. These platform-specific examples should follow a consistent pattern across all skill files
```python
# In Qwen Code CLI environment
task(subagent_type="general-purpose", description="Fix agent-tool-abort.test.ts failures")
task(subagent_type="general-purpose", description="Fix batch-completion-behavior.test.ts failures")
task(subagent_type="general-purpose", description="Fix tool-approval-race-conditions.test.ts failures")
# All three run concurrently
// In Claude Code / AI environment
Task("Fix agent-tool-abort.test.ts failures")
Task("Fix batch-completion-behavior.test.ts failures")
Task("Fix tool-approval-race-conditions.test.ts failures")
// All three run concurrently
</details>



---

💡 <a href="/obra/superpowers/new/main/.github/instructions?filename=*.instructions.md" class="Link--inTextBlock" target="_blank" rel="noopener noreferrer">Add Copilot custom instructions</a> for smarter, more guided reviews. <a href="https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot" class="Link--inTextBlock" target="_blank" rel="noopener noreferrer">Learn how to get started</a>.

- Add python3 availability check before using in symlink fallback
- Suppress macOS/BSD sed errors with proper fallback handling
- Add feedback when no prompt templates found in glob
- Clarify hub pattern is correct (symlinks TO ~/.qwen, not into repo)
- Align QWEN.md Task mapping with install.sh context block
- Fix README.qwen.md table structure (note was interrupting rows)
- Add agent symlink cleanup to uninstall instructions
- Document YAML frontmatter format in agent files

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 15 out of 15 changed files in this pull request and generated 8 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

mhenke and others added 3 commits February 22, 2026 13:15
- Copilot AI review: note implied manual setup but installer handles it

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- README.md: reorder Qwen section to after OpenCode to match note order
- install.sh: add REPO_DIR and check symlink ownership before replacing
  (skip symlinks pointing outside this repo — thread 8)
- install.sh: skip prompt template symlinks when target dir is a symlink
  to avoid modifying repo source (thread 12/21)
- install.sh: only prepend newline separator when QWEN.md has content
  to prevent blank line accumulation (thread 25)
- .qwen/INSTALL.md: fix uninstall agent glob pattern from
  '*/superpowers/agents/*' to '*/superpowers/.qwen/agents/*' (thread 22)
- .qwen/INSTALL.md: fix misleading Task mapping to 'task() tool with
  subagent dispatch' (thread 26)
- .qwen/INSTALL.md: add agent-linking bullet to what-installer-does (thread 27)
- docs/README.qwen.md: add agent-linking step to what-installer-does (thread 24)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Move symlink-is-dir check before rm to avoid deleting from repo source
  when parent directory is a symlink (thread 12/21)
- Use portable ^[[:space:]]*$ pattern in sed instead of non-portable
  \n in bracket expression (thread 23)
- Fix buggy awk fallback that didn't actually trim trailing blank lines;
  use buffer approach that correctly strips them (thread 23)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 15 out of 15 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@mhenke
Copy link
Author

mhenke commented Feb 23, 2026

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Feb 23, 2026

✅ 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.

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: 2

🧹 Nitpick comments (1)
skills/writing-skills/SKILL.md (1)

12-12: Consider adding the Qwen path to the agent-directory list.

Line 12 enumerates skill directories for Claude Code and Codex but omits ~/.qwen/skills/ for Qwen Code CLI, which this PR introduces. Readers using this skill as a setup reference won't find the canonical Qwen path here.

📝 Suggested update
-**Personal skills live in agent-specific directories (`~/.claude/skills` for Claude Code, `~/.agents/skills/` for Codex)**
+**Personal skills live in agent-specific directories (`~/.claude/skills` for Claude Code, `~/.agents/skills/` for Codex, `~/.qwen/skills/` for Qwen Code CLI)**
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@skills/writing-skills/SKILL.md` at line 12, Update the skill-directory
enumeration in SKILL.md to include Qwen's canonical path by adding
"~/.qwen/skills/" alongside the existing "~/.claude/skills" and
"~/.agents/skills/" entries so the document lists Claude, Codex, and Qwen agent
directories consistently; locate the sentence containing "`~/.claude/skills`"
and "`~/.agents/skills/`" and insert "`~/.qwen/skills/`" in the same format.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.qwen/agents/code-reviewer-prompt-template.md:
- Line 26: The template line using bare placeholders BASE_SHA and HEAD_SHA is
inconsistent with the rest of the document which uses bracketed placeholders
(e.g., [From implementer's report]), so update the phrase "Review the code
changes between BASE_SHA and HEAD_SHA for:" to use bracketed placeholders
"[BASE_SHA]" and "[HEAD_SHA]" (or whichever bracket style the template standard
requires) so it matches other placeholders; ensure any other occurrences of
BASE_SHA/HEAD_SHA in the template follow the same bracketed convention and run a
quick grep of the template for BASE_SHA or HEAD_SHA to confirm all instances are
updated.

In @.qwen/agents/spec-reviewer.md:
- Around line 1-34: Remove the leading comments before the YAML frontmatter and
convert the embedded system_prompt: | YAML key into the Markdown body after the
closing frontmatter delimiter: ensure the file begins immediately with the
opening --- delimiter, keep only YAML keys (name/description/tools) inside the
frontmatter, close with a second --- and then paste the former system_prompt
text as plain Markdown (the agent prompt) after that closing ---. Repeat the
same fix for the other agent files (spec-reviewer.md, code-reviewer.md,
implementer.md) so there is no content before the first --- and no
system_prompt: YAML key inside the frontmatter.

---

Duplicate comments:
In @.qwen/agents/code-reviewer.md:
- Around line 1-29: The file has the same structural deviation as
spec-reviewer.md: remove the extraneous Markdown header lines before the top
YAML frontmatter and stop embedding the prompt under the YAML key system_prompt:
|; instead keep only the YAML frontmatter (name, description, tools) between the
--- markers and move the current block under system_prompt: | into the Markdown
body after the closing --- as the agent prompt text. Locate the tokens
"system_prompt: |" and the leading header lines and convert them so the
frontmatter is pure YAML and the prompt exists as the Markdown body following
the closing ---.

In @.qwen/agents/implementer.md:
- Around line 1-47: The file currently embeds the assistant instructions inside
a YAML key named "system_prompt: |" and has stray Markdown header lines before
the opening '---', deviating from the expected frontmatter + Markdown body
format; fix by removing the top Markdown header lines, ensure the YAML
frontmatter is only between the '---' markers (retain name/description/tools),
delete the "system_prompt: |" key and instead place its block content as the
Markdown body after the closing '---' (so the assistant prompt becomes the plain
Markdown content following the frontmatter), preserving the exact prompt text
and list items.

---

Nitpick comments:
In `@skills/writing-skills/SKILL.md`:
- Line 12: Update the skill-directory enumeration in SKILL.md to include Qwen's
canonical path by adding "~/.qwen/skills/" alongside the existing
"~/.claude/skills" and "~/.agents/skills/" entries so the document lists Claude,
Codex, and Qwen agent directories consistently; locate the sentence containing
"`~/.claude/skills`" and "`~/.agents/skills/`" and insert "`~/.qwen/skills/`" in
the same format.

Comment on lines 1 to 34
# Qwen Code CLI Subagent Definition
# Format: YAML frontmatter + Markdown system prompt
# See: https://qwenlm.github.io/qwen-code-docs/en/users/features/sub-agents/
---
name: spec-reviewer
description: A subagent that verifies an implementation matches its specification exactly.
tools:
- read_file
- glob
system_prompt: |
You are a Spec Compliance Reviewer Subagent. Your mission is to verify that a developer's implementation matches the given specification exactly. You must determine if they built what was requested—nothing more, and nothing less.

## CRITICAL: Do Not Trust Reports
The implementer's report of what they built may be incomplete or inaccurate. You MUST verify everything independently by reading the code. Do not trust their claims.

## Your Job
Read the implementation code and compare it line-by-line against the requirements.

Your review must answer these questions:
- **Missing Requirements:** Did the implementer fail to build something that was requested? Are there any skipped or incomplete requirements?
- **Extra/Unneeded Work:** Did the implementer build features or components that were NOT requested? Did they over-engineer a simple solution?
- **Misunderstandings:** Did the implementer interpret the requirements incorrectly? Did they solve the wrong problem?

**Your entire review is based on reading the code, not trusting the report.**

## Report Format
Your final output must be one of two options:

1. If everything matches the spec perfectly:
`✅ Spec compliant`

2. If there are any issues:
`❌ Issues found: [Provide a specific, file-referenced list of what is missing, extra, or misunderstood]`
---
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# First, locate and examine the spec-reviewer.md file
fd -t f "spec-reviewer.md"

Repository: obra/superpowers

Length of output: 42


🏁 Script executed:

# Search for subagent files in the .qwen directory
find .qwen -type f -name "*.md" 2>/dev/null | head -20

Repository: obra/superpowers

Length of output: 314


🌐 Web query:

Qwen Code subagent YAML frontmatter format documentation

💡 Result:

Qwen Code subagents are configured as Markdown files with YAML frontmatter, followed by the agent’s system prompt text. The docs describe this basic frontmatter shape: name, description, and optional tools. [1]

YAML frontmatter format (basic)

---
name: agent-name
description: Brief description of when/how to use this agent
tools:
  - tool1
  - tool2
  - tool3   # optional
---

Then put the agent’s system prompt content under the frontmatter (multiple paragraphs supported), and you can use ${variable} templating inside the prompt. [1]

Where these files live

  • Project-level: .qwen/agents/ (highest precedence)
  • User-level: ~/.qwen/agents/ (fallback)
  • (Optionally) extension-provided agents, discovered from enabled extensions [1]

🏁 Script executed:

cat -n .qwen/agents/spec-reviewer.md | head -40

Repository: obra/superpowers

Length of output: 1985


🏁 Script executed:

cat -n .qwen/agents/code-reviewer.md | head -40

Repository: obra/superpowers

Length of output: 1894


🏁 Script executed:

cat -n .qwen/agents/implementer.md | head -40

Repository: obra/superpowers

Length of output: 2163


Subagent file structure deviates from the Qwen Code spec — agent will silently fail to load.

The official Qwen Code subagent format requires:

  1. The YAML opening --- delimiter at line 1 (no content before it).
  2. The system prompt as the Markdown body after the closing ---, not as a system_prompt: YAML key inside the frontmatter.

This file has comment lines on lines 1–3 before the opening ---, and buries the system prompt under a system_prompt: | YAML key, leaving nothing after the closing --- on line 34. The official docs show the format as --- followed by YAML metadata, then a second ---, with the system prompt content appearing as plain Markdown body afterwards.

The same issue applies to .qwen/agents/code-reviewer.md and .qwen/agents/implementer.md.

🐛 Proposed fix
-# Qwen Code CLI Subagent Definition
-# Format: YAML frontmatter + Markdown system prompt
-# See: https://qwenlm.github.io/qwen-code-docs/en/users/features/sub-agents/
 ---
 name: spec-reviewer
 description: A subagent that verifies an implementation matches its specification exactly.
 tools:
   - read_file
   - glob
-system_prompt: |
-  You are a Spec Compliance Reviewer Subagent. Your mission is to verify...
-  ...
-  ## Report Format
-  ...
-  2.  If there are any issues:
-      `❌ Issues found: [Provide a specific, file-referenced list of what is missing, extra, or misunderstood]`
 ---
+
+You are a Spec Compliance Reviewer Subagent. Your mission is to verify that a developer's implementation matches the given specification exactly. You must determine if they built what was requested—nothing more, and nothing less.
+
+## CRITICAL: Do Not Trust Reports
+The implementer's report of what they built may be incomplete or inaccurate. You MUST verify everything independently by reading the code. Do not trust their claims.
+
+## Your Job
+Read the implementation code and compare it line-by-line against the requirements.
+
+Your review must answer these questions:
+- **Missing Requirements:** Did the implementer fail to build something that was requested? Are there any skipped or incomplete requirements?
+- **Extra/Unneeded Work:** Did the implementer build features or components that were NOT requested? Did they over-engineer a simple solution?
+- **Misunderstandings:** Did the implementer interpret the requirements incorrectly? Did they solve the wrong problem?
+
+**Your entire review is based on reading the code, not trusting the report.**
+
+## Report Format
+Your final output must be one of two options:
+
+1. If everything matches the spec perfectly:
+   `✅ Spec compliant`
+
+2. If there are any issues:
+   `❌ Issues found: [Provide a specific, file-referenced list of what is missing, extra, or misunderstood]`
🧰 Tools
🪛 markdownlint-cli2 (0.21.0)

[warning] 13-13: Headings must start at the beginning of the line

(MD023, heading-start-left)


[warning] 16-16: Headings must start at the beginning of the line

(MD023, heading-start-left)


[warning] 26-26: Headings must start at the beginning of the line

(MD023, heading-start-left)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.qwen/agents/spec-reviewer.md around lines 1 - 34, Remove the leading
comments before the YAML frontmatter and convert the embedded system_prompt: |
YAML key into the Markdown body after the closing frontmatter delimiter: ensure
the file begins immediately with the opening --- delimiter, keep only YAML keys
(name/description/tools) inside the frontmatter, close with a second --- and
then paste the former system_prompt text as plain Markdown (the agent prompt)
after that closing ---. Repeat the same fix for the other agent files
(spec-reviewer.md, code-reviewer.md, implementer.md) so there is no content
before the first --- and no system_prompt: YAML key inside the frontmatter.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 15 out of 15 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

- Fix version mismatch in qwen-extension.json (4.3.0 → 4.3.1) to match
  other plugin manifests (.claude-plugin, .cursor-plugin)
- Fix templates_linked counter in install.sh: move increment to after
  successful symlink creation so the 'No prompt template files found'
  message accurately reflects whether templates were actually linked
- Fix agent uninstall path in docs/README.qwen.md: use
  '*/superpowers/.qwen/agents/*' pattern to match actual symlink targets
  created by the installer (agents live in .qwen/agents/, not agents/)
- Add agent linking step to INSTALL.md installer description (was omitted)
- Fix misleading 'Task with subagents → sequential execution' mapping in
  INSTALL.md; now correctly says 'task() tool with subagent_type parameter'
- Add text language specifiers to bare fenced code blocks in INSTALL.md
  (silences markdownlint MD040)
@mhenke
Copy link
Author

mhenke commented Feb 23, 2026

@coderabbitai @copilot please review this PR for Qwen Code CLI support.

- Update agent file structure (remove leading headers, move prompt to body)
- consistent placeholder format [BASE_SHA] and [HEAD_SHA]
- Add Qwen path to writing-skills/SKILL.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new-harness Requests for harnesses with few existing items

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants