Skip to content

feat: implement sentinel progress tracking and dynamic skill discovery#458

Open
locfaker wants to merge 4 commits intoobra:mainfrom
locfaker:feat/sentinel-discovery-windows-fix
Open

feat: implement sentinel progress tracking and dynamic skill discovery#458
locfaker wants to merge 4 commits intoobra:mainfrom
locfaker:feat/sentinel-discovery-windows-fix

Conversation

@locfaker
Copy link

@locfaker locfaker commented Feb 12, 2026

This PR introduces two major enhancements to Superpowers:

  1. Sentinel: Automated progress tracking in PROGRESS.md during plan execution for better transparency.
  2. Discovery: Lightweight SKILLS_INDEX.md generation and lookup to prevent context overload with large skill libraries.
  3. Windows Adaptability: Improved OS command mapping documentation in using-superpowers skill.

These changes handle scalability (900+ skills) and improve the development experience on Windows.

Motivation and Context

How Has This Been Tested?

Breaking Changes

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

Summary by CodeRabbit

  • Documentation
    • Added a new skills index catalog for easy reference of available skills.
    • Enhanced documentation with skill discovery best practices and cross-platform support guidance.
    • Introduced progress tracking documentation structure for improved project transparency.

This PR introduces two major enhancements to Superpowers:

1. Sentinel: Automated progress tracking in PROGRESS.md during plan execution for better transparency.
2. Discovery: Lightweight SKILLS_INDEX.md generation and lookup to prevent context overload with large skill libraries.
3. Windows Adaptability: Improved OS command mapping documentation in using-superpowers skill.

These changes handle scalability (900+ skills) and improve the development experience on Windows.
@coderabbitai
Copy link

coderabbitai bot commented Feb 12, 2026

📝 Walkthrough

Walkthrough

The PR introduces progress tracking infrastructure and skill discovery/indexing capabilities. It adds a PROGRESS.md tracking document, dual index generation scripts (Node.js and Python), a generated skills index, planning documentation, and updates existing skill guides with cross-platform guidance and discovery strategies.

Changes

Cohort / File(s) Summary
Progress Tracking Infrastructure
PROGRESS.md, docs/plans/2026-02-12-sentinel-discovery.md
New progress tracking document with task completion table and planning document detailing three tasks: OS adaptability updates, Skill Discovery Index generation, and Sentinel progress logic implementation.
Skill Discovery Index Scripts
lib/scripts/generate_skills_index.js, lib/scripts/generate_skills_index.py
Parallel Node.js and Python scripts that recursively scan the skills directory for SKILL.md files, extract name and description metadata, and generate a Markdown index table written to skills/SKILLS_INDEX.md.
Generated Skills Index
skills/SKILLS_INDEX.md
New static Markdown file containing a tabular catalog of available skills with names and descriptions.
Skill Documentation Updates
skills/executing-plans/SKILL.md, skills/using-superpowers/SKILL.md
Executing-plans skill updated to include explicit PROGRESS.md update step in batch execution flow. Using-superpowers skill expanded with Skill Discovery (scaling strategy) and Windows & Cross-Platform Adaptability sections.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

Poem

🐰 Index and progress, neatly aligned,
Scripts that discover skills of all kind,
From Windows to Linux, we adapt with care,
Progress recorded everywhere—
A rabbit's toolkit, complete and fair!

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
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.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title accurately reflects the main changes: implementing sentinel progress tracking (PROGRESS.md documentation and execution flow updates) and dynamic skill discovery (SKILLS_INDEX.md generation with lookup mechanism).

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

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

No actionable comments were generated in the recent review. 🎉

🧹 Recent nitpick comments
lib/scripts/generate_skills_index.js (1)

50-54: Script executes on require() — consider guarding with a main-module check.

If this module is ever imported by another script (e.g., for testing or reuse of generateIndex), it will immediately run the generation side effect. Wrapping the invocation and exporting the function would make it more reusable.

Proposed fix
+module.exports = { generateIndex };
+
 const baseDir = path.resolve(__dirname, '../..');
 const skillsDir = path.join(baseDir, 'skills');
 const outputFile = path.join(baseDir, 'skills/SKILLS_INDEX.md');

-generateIndex(skillsDir, outputFile);
+if (require.main === module) {
+    generateIndex(skillsDir, outputFile);
+}

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.

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

🤖 Fix all issues with AI agents
In `@docs/plans/2026-02-12-sentinel-discovery.md`:
- Around line 18-21: Update "Task 2: Implement Skill Discovery Index" to mention
both generator scripts by adding `lib/scripts/generate_skills_index.js`
alongside `lib/scripts/generate_skills_index.py` (and keep
`skills/SKILLS_INDEX.md`), or replace the single-file listing with a short note
explaining why both variants are included (e.g., environment flexibility or
compatibility), referencing the filenames `generate_skills_index.py` and
`generate_skills_index.js` so readers can locate the JS and Python
implementations.

In `@lib/scripts/generate_skills_index.js`:
- Around line 10-36: The current getFiles -> skillFiles loop can produce
non-deterministic output and unescaped Markdown pipes; after computing
skillFiles, sort the array (e.g., skillFiles.sort()) to make order
deterministic, and before appending to indexContent escape any pipe characters
in the parsed name and description (replace '|' with '\|' and keep the existing
trimming/quote-stripping logic). Update references in the processing block that
compute name and description so the sanitized values are used when building
indexContent, preserving the fallback for name
(path.basename(path.dirname(file))) and default description.

In `@lib/scripts/generate_skills_index.py`:
- Around line 10-23: The loop using os.walk in generate_skills_index.py produces
non-deterministic order and leaves pipe characters unescaped; instead, collect
all SKILL.md paths (using the current os.walk over root, _dirs, files), build a
list of skill_path entries, sort that list, then iterate the sorted list when
reading content to append to index_content; additionally, sanitize description
by escaping any '|' characters (e.g., replace '|' with '\|') before writing into
the Markdown table and rename dirs → _dirs to address the Ruff B007 warning;
keep the existing name_match/desc_match logic (name_match, desc_match,
skill_path, index_content) when implementing these changes.

In `@PROGRESS.md`:
- Around line 1-9: PROGRESS.md was committed with session-specific rows instead
of a reusable template; update the file so it contains only the header and an
empty table (or a clear placeholder row) and include a short note about
lifecycle (whether sessions should append or start fresh). Locate the
PROGRESS.md table (the markdown header and the | Date & Time | Task Description
| Status | Commit / Evidence | row) and remove the five pre-populated entries,
replacing them with either an empty table skeleton or a one-line placeholder
like "No entries yet — append per session" plus a brief comment explaining
expected usage (append vs reset).

In `@skills/executing-plans/SKILL.md`:
- Around line 31-32: Edit the SKILL.md instruction that currently says "Update
`PROGRESS.md`" to explicitly specify the repository root path (e.g., "Update
./PROGRESS.md" or "Update root PROGRESS.md") so readers know which PROGRESS.md
to modify; update the line in SKILL.md where the step references `PROGRESS.md`
to include the explicit path.

In `@skills/using-superpowers/SKILL.md`:
- Around line 99-107: Update the Windows equivalent for creating an empty file
in the table row that currently shows `touch file` -> `echo. > file`: replace
`echo. > file` with the correct CMD and PowerShell commands — `type nul > file`
for CMD and `New-Item file -ItemType File` for PowerShell — and ensure the
Purpose column still reads "Create empty file" so the mapping (`touch file`)
reflects the accurate Windows alternatives.
🧹 Nitpick comments (4)
skills/SKILLS_INDEX.md (1)

1-19: Risk of static index drifting from actual skills.

This file is committed as a static artifact, but there are generator scripts (generate_skills_index.js / .py) that produce the same content dynamically. If new skills are added without re-running the generator, this index will silently go stale. Consider either:

  • Adding a CI step or git hook to regenerate and verify this file, or
  • Adding a comment at the top noting it's auto-generated (e.g., <!-- AUTO-GENERATED — do not edit manually. Run lib/scripts/generate_skills_index.py to regenerate. -->)
lib/scripts/generate_skills_index.py (1)

34-34: Orphaned comment — no corresponding code.

Line 34 says # Also handle the awesome-automation if linked but there's no implementation following it. Remove the comment or implement the handling.

lib/scripts/generate_skills_index.js (2)

42-46: generateIndex executes immediately at module level and is not exported.

Calling generateIndex unconditionally at the top level means require()-ing this module triggers a side effect (file write). Consider guarding with require.main === module and exporting the function for reuse:

Proposed fix
+module.exports = { generateIndex };
+
-const baseDir = path.resolve(__dirname, '../..');
-const skillsDir = path.join(baseDir, 'skills');
-const outputFile = path.join(baseDir, 'skills/SKILLS_INDEX.md');
-
-generateIndex(skillsDir, outputFile);
+if (require.main === module) {
+    const baseDir = path.resolve(__dirname, '../..');
+    const skillsDir = path.join(baseDir, 'skills');
+    const outputFile = path.join(baseDir, 'skills/SKILLS_INDEX.md');
+    generateIndex(skillsDir, outputFile);
+}

13-14: Parameter file is reassigned inside forEach, shadowing the callback parameter.

This works but harms readability. Use a different variable name for the resolved path.

Proposed fix
         list.forEach(file => {
-            file = path.join(dir, file);
-            const stat = fs.statSync(file);
+            const filePath = path.join(dir, file);
+            const stat = fs.statSync(filePath);
             if (stat && stat.isDirectory()) {
-                results = results.concat(getFiles(file));
-            } else if (file.endsWith('SKILL.md')) {
-                results.push(file);
+                results = results.concat(getFiles(filePath));
+            } else if (filePath.endsWith('SKILL.md')) {
+                results.push(filePath);
             }
         });

Comment on lines 18 to 21
### Task 2: Implement Skill Discovery Index
**Files:**
- Create: `lib/scripts/generate_skills_index.py`
- Create: `skills/SKILLS_INDEX.md`
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Plan omits the JS variant of the generator script.

Task 2 lists only generate_skills_index.py, but the PR also ships generate_skills_index.js. Update the plan to reflect both files, or document why both exist (e.g., environment flexibility).

🤖 Prompt for AI Agents
In `@docs/plans/2026-02-12-sentinel-discovery.md` around lines 18 - 21, Update
"Task 2: Implement Skill Discovery Index" to mention both generator scripts by
adding `lib/scripts/generate_skills_index.js` alongside
`lib/scripts/generate_skills_index.py` (and keep `skills/SKILLS_INDEX.md`), or
replace the single-file listing with a short note explaining why both variants
are included (e.g., environment flexibility or compatibility), referencing the
filenames `generate_skills_index.py` and `generate_skills_index.js` so readers
can locate the JS and Python implementations.

Comment on lines 10 to 36
const getFiles = (dir) => {
let results = [];
const list = fs.readdirSync(dir);
list.forEach(file => {
file = path.join(dir, file);
const stat = fs.statSync(file);
if (stat && stat.isDirectory()) {
results = results.concat(getFiles(file));
} else if (file.endsWith('SKILL.md')) {
results.push(file);
}
});
return results;
};

const skillFiles = getFiles(skillsDir);

skillFiles.forEach(file => {
const content = fs.readFileSync(file, 'utf8');
const nameMatch = content.match(/^name:\s*(.+)$/m);
const descMatch = content.match(/^description:\s*(.+)$/m);

const name = nameMatch ? nameMatch[1].trim() : path.basename(path.dirname(file));
const description = descMatch ? descMatch[1].trim().replace(/^"|"$/g, '') : "No description available.";

indexContent += `| ${name} | ${description} |\n`;
});
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

Same issues as the Python variant: non-deterministic order and unescaped pipes.

readdirSync order is OS-dependent. Sort skillFiles before iterating, and escape | in name/description to protect the Markdown table. See the Python file comment for rationale.

Proposed fix (sorting + escaping)
     const skillFiles = getFiles(skillsDir);
+    skillFiles.sort();

     skillFiles.forEach(file => {
         const content = fs.readFileSync(file, 'utf8');
         const nameMatch = content.match(/^name:\s*(.+)$/m);
         const descMatch = content.match(/^description:\s*(.+)$/m);

-        const name = nameMatch ? nameMatch[1].trim() : path.basename(path.dirname(file));
-        const description = descMatch ? descMatch[1].trim().replace(/^"|"$/g, '') : "No description available.";
+        const name = (nameMatch ? nameMatch[1].trim() : path.basename(path.dirname(file))).replace(/\|/g, '\\|');
+        const description = (descMatch ? descMatch[1].trim().replace(/^"|"$/g, '') : "No description available.").replace(/\|/g, '\\|');

         indexContent += `| ${name} | ${description} |\n`;
     });
🤖 Prompt for AI Agents
In `@lib/scripts/generate_skills_index.js` around lines 10 - 36, The current
getFiles -> skillFiles loop can produce non-deterministic output and unescaped
Markdown pipes; after computing skillFiles, sort the array (e.g.,
skillFiles.sort()) to make order deterministic, and before appending to
indexContent escape any pipe characters in the parsed name and description
(replace '|' with '\|' and keep the existing trimming/quote-stripping logic).
Update references in the processing block that compute name and description so
the sanitized values are used when building indexContent, preserving the
fallback for name (path.basename(path.dirname(file))) and default description.

Comment on lines +10 to +23
for root, dirs, files in os.walk(skills_dir):
if "SKILL.md" in files:
skill_path = os.path.join(root, "SKILL.md")
with open(skill_path, 'r', encoding='utf-8') as f:
content = f.read()

# Extract frontmatter name and description
name_match = re.search(r'^name:\s*(.+)$', content, re.MULTILINE)
desc_match = re.search(r'^description:\s*(.+)$', content, re.MULTILINE)

name = name_match.group(1).strip() if name_match else os.path.basename(root)
description = desc_match.group(1).strip().strip('"') if desc_match else "No description available."

index_content += f"| {name} | {description} |\n"
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

Non-deterministic output order and unescaped pipe characters.

Two issues:

  1. os.walk traversal order is filesystem-dependent, so the generated index will vary between runs/platforms, causing noisy diffs. Sort the discovered skill files before iterating.
  2. Pipe characters (|) in skill descriptions will break the Markdown table. Escape them.
Proposed fix
-    for root, dirs, files in os.walk(skills_dir):
-        if "SKILL.md" in files:
-            skill_path = os.path.join(root, "SKILL.md")
-            with open(skill_path, 'r', encoding='utf-8') as f:
-                content = f.read()
-                
-                # Extract frontmatter name and description
-                name_match = re.search(r'^name:\s*(.+)$', content, re.MULTILINE)
-                desc_match = re.search(r'^description:\s*(.+)$', content, re.MULTILINE)
-                
-                name = name_match.group(1).strip() if name_match else os.path.basename(root)
-                description = desc_match.group(1).strip().strip('"') if desc_match else "No description available."
-                
-                index_content += f"| {name} | {description} |\n"
+    skill_files = []
+    for root, _dirs, files in os.walk(skills_dir):
+        if "SKILL.md" in files:
+            skill_files.append(os.path.join(root, "SKILL.md"))
+    skill_files.sort()
+
+    for skill_path in skill_files:
+        with open(skill_path, 'r', encoding='utf-8') as f:
+            content = f.read()
+
+            name_match = re.search(r'^name:\s*(.+)$', content, re.MULTILINE)
+            desc_match = re.search(r'^description:\s*(.+)$', content, re.MULTILINE)
+
+            name = name_match.group(1).strip() if name_match else os.path.basename(os.path.dirname(skill_path))
+            description = desc_match.group(1).strip().strip('"') if desc_match else "No description available."
+
+            # Escape pipes to preserve Markdown table formatting
+            name = name.replace('|', '\\|')
+            description = description.replace('|', '\\|')
+
+            index_content += f"| {name} | {description} |\n"

This also addresses the Ruff B007 warning by renaming dirs_dirs.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
for root, dirs, files in os.walk(skills_dir):
if "SKILL.md" in files:
skill_path = os.path.join(root, "SKILL.md")
with open(skill_path, 'r', encoding='utf-8') as f:
content = f.read()
# Extract frontmatter name and description
name_match = re.search(r'^name:\s*(.+)$', content, re.MULTILINE)
desc_match = re.search(r'^description:\s*(.+)$', content, re.MULTILINE)
name = name_match.group(1).strip() if name_match else os.path.basename(root)
description = desc_match.group(1).strip().strip('"') if desc_match else "No description available."
index_content += f"| {name} | {description} |\n"
skill_files = []
for root, _dirs, files in os.walk(skills_dir):
if "SKILL.md" in files:
skill_files.append(os.path.join(root, "SKILL.md"))
skill_files.sort()
for skill_path in skill_files:
with open(skill_path, 'r', encoding='utf-8') as f:
content = f.read()
name_match = re.search(r'^name:\s*(.+)$', content, re.MULTILINE)
desc_match = re.search(r'^description:\s*(.+)$', content, re.MULTILINE)
name = name_match.group(1).strip() if name_match else os.path.basename(os.path.dirname(skill_path))
description = desc_match.group(1).strip().strip('"') if desc_match else "No description available."
# Escape pipes to preserve Markdown table formatting
name = name.replace('|', '\\|')
description = description.replace('|', '\\|')
index_content += f"| {name} | {description} |\n"
🧰 Tools
🪛 Ruff (0.15.0)

[warning] 10-10: Loop control variable dirs not used within loop body

Rename unused dirs to _dirs

(B007)

🤖 Prompt for AI Agents
In `@lib/scripts/generate_skills_index.py` around lines 10 - 23, The loop using
os.walk in generate_skills_index.py produces non-deterministic order and leaves
pipe characters unescaped; instead, collect all SKILL.md paths (using the
current os.walk over root, _dirs, files), build a list of skill_path entries,
sort that list, then iterate the sorted list when reading content to append to
index_content; additionally, sanitize description by escaping any '|' characters
(e.g., replace '|' with '\|') before writing into the Markdown table and rename
dirs → _dirs to address the Ruff B007 warning; keep the existing
name_match/desc_match logic (name_match, desc_match, skill_path, index_content)
when implementing these changes.

Comment on lines +1 to +9
# Project Progress Tracking (Sentinel)

| Date & Time | Task Description | Status | Commit / Evidence |
|-------------|------------------|--------|-------------------|
| 2026-02-12 17:45 | Initial PR Design & Planning | ✅ COMPLETED | Brainstorming Session |
| 2026-02-12 17:55 | OS Adaptability Mapping | ✅ COMPLETED | Updated skills/using-superpowers/SKILL.md |
| 2026-02-12 17:58 | Skill Discovery Indexing | ✅ COMPLETED | Added SKILLS_INDEX.md & Generator |
| 2026-02-12 18:02 | Sentinel Logic Integration | ✅ COMPLETED | Updated skills/executing-plans/SKILL.md |
| 2026-02-12 18:05 | Skill Index Verification | ✅ VERIFIED | SKILLS_INDEX.md generated correctly |
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

This was intended as a template but contains session-specific data.

The plan (docs/plans/2026-02-12-sentinel-discovery.md, Task 3) describes this as Create: PROGRESS.md (template), but it ships with five pre-populated entries from this implementation session. For reuse across future plan executions, consider either shipping an empty template (header + empty table) or clarifying the intended lifecycle — should new sessions append here or start fresh?

🤖 Prompt for AI Agents
In `@PROGRESS.md` around lines 1 - 9, PROGRESS.md was committed with
session-specific rows instead of a reusable template; update the file so it
contains only the header and an empty table (or a clear placeholder row) and
include a short note about lifecycle (whether sessions should append or start
fresh). Locate the PROGRESS.md table (the markdown header and the | Date & Time
| Task Description | Status | Commit / Evidence | row) and remove the five
pre-populated entries, replacing them with either an empty table skeleton or a
one-line placeholder like "No entries yet — append per session" plus a brief
comment explaining expected usage (append vs reset).

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

🤖 Fix all issues with AI agents
In `@docs/plans/2026-02-12-sentinel-discovery.md`:
- Around line 14-26: The document jumps from an H1 to H3 for task sections;
update the task headings so they are H2 instead of H3 (e.g., change "### Task 1:
Update `using-superpowers`..." to "## Task 1: Update `using-superpowers`..." and
do the same for Task 2 and Task 3) across the plan file and ensure corresponding
TOC/links (if any) still resolve; verify related files named SKILL.md,
generate_skills_index.js, SKILLS_INDEX.md, and PROGRESS.md mentioned in the plan
remain referenced consistently after the heading level changes.

In `@pr_body.md`:
- Around line 12-13: Change instances of the incorrect noun-form "lookup" used
as a verb to the two-word verb phrase "look up" in the new docs and skill text:
update the PR body entry that mentions "using-superpowers" and the README/skill
guidance added by generate_skills_index.js (and any references in
SKILLS_INDEX.md) so the phrasing reads "look up the index" (e.g., in the
"using-superpowers" skill guidance and the bullet describing the SKILLS_INDEX.md
generation).

In `@skills/using-superpowers/SKILL.md`:
- Around line 99-107: The Windows column header "Windows (CMD/PowerShell)" is
misleading because the example "type nul > file" is CMD-only; update the table
in SKILL.md to either change the header to "Windows (CMD)" or add a PowerShell
equivalent for the "touch file" row (e.g., use New-Item file -ItemType File) so
the Windows column content matches the header; locate the table and the "touch
file" / "type nul > file" cell and make the header or cell change accordingly.
🧹 Nitpick comments (1)
skills/using-superpowers/SKILL.md (1)

89-91: Tighten wording.

“Highly relevant” is redundant; “relevant” reads cleaner.

✏️ Suggested edit
-3. **Invoke specific skills** - Use the Skill tool (or Read tool in other environments) only on those highly relevant skills.
+3. **Invoke specific skills** - Use the Skill tool (or Read tool in other environments) only on those relevant skills.

Comment on lines +14 to +26
### Task 1: Update `using-superpowers` (OS Adaptability)
**Files:**
- Modify: `skills/using-superpowers/SKILL.md`

### Task 2: Implement Skill Discovery Index
**Files:**
- Create: `lib/scripts/generate_skills_index.js`
- Create: `skills/SKILLS_INDEX.md`

### Task 3: Implement Sentinel Logic (Progress Tracking)
**Files:**
- Modify: `skills/executing-plans/SKILL.md`
- Create: `PROGRESS.md` (template)
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Heading level jumps from H1 to H3.

For Markdown consistency, use H2 for task sections under the H1.

✏️ Suggested fix
-### Task 1: Update `using-superpowers` (OS Adaptability)
+## Task 1: Update `using-superpowers` (OS Adaptability)
...
-### Task 2: Implement Skill Discovery Index
+## Task 2: Implement Skill Discovery Index
...
-### Task 3: Implement Sentinel Logic (Progress Tracking)
+## Task 3: Implement Sentinel Logic (Progress Tracking)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
### Task 1: Update `using-superpowers` (OS Adaptability)
**Files:**
- Modify: `skills/using-superpowers/SKILL.md`
### Task 2: Implement Skill Discovery Index
**Files:**
- Create: `lib/scripts/generate_skills_index.js`
- Create: `skills/SKILLS_INDEX.md`
### Task 3: Implement Sentinel Logic (Progress Tracking)
**Files:**
- Modify: `skills/executing-plans/SKILL.md`
- Create: `PROGRESS.md` (template)
## Task 1: Update `using-superpowers` (OS Adaptability)
**Files:**
- Modify: `skills/using-superpowers/SKILL.md`
## Task 2: Implement Skill Discovery Index
**Files:**
- Create: `lib/scripts/generate_skills_index.js`
- Create: `skills/SKILLS_INDEX.md`
## Task 3: Implement Sentinel Logic (Progress Tracking)
**Files:**
- Modify: `skills/executing-plans/SKILL.md`
- Create: `PROGRESS.md` (template)
🧰 Tools
🪛 markdownlint-cli2 (0.20.0)

[warning] 14-14: Heading levels should only increment by one level at a time
Expected: h2; Actual: h3

(MD001, heading-increment)

🤖 Prompt for AI Agents
In `@docs/plans/2026-02-12-sentinel-discovery.md` around lines 14 - 26, The
document jumps from an H1 to H3 for task sections; update the task headings so
they are H2 instead of H3 (e.g., change "### Task 1: Update
`using-superpowers`..." to "## Task 1: Update `using-superpowers`..." and do the
same for Task 2 and Task 3) across the plan file and ensure corresponding
TOC/links (if any) still resolve; verify related files named SKILL.md,
generate_skills_index.js, SKILLS_INDEX.md, and PROGRESS.md mentioned in the plan
remain referenced consistently after the heading level changes.

pr_body.md Outdated
Comment on lines 12 to 13
- Added a Node.js-based `generate_skills_index.js` script to create a lightweight `SKILLS_INDEX.md`.
- Updated `using-superpowers` skill to guide agents to lookup the index first, preventing context bloat and token waste.
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Grammar: “look up” as verb.

Prefer “look up the index” instead of “lookup the index.”

✏️ Suggested edit
-- Updated `using-superpowers` skill to guide agents to lookup the index first, preventing context bloat and token waste.
+- Updated `using-superpowers` skill to guide agents to look up the index first, preventing context bloat and token waste.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Added a Node.js-based `generate_skills_index.js` script to create a lightweight `SKILLS_INDEX.md`.
- Updated `using-superpowers` skill to guide agents to lookup the index first, preventing context bloat and token waste.
- Added a Node.js-based `generate_skills_index.js` script to create a lightweight `SKILLS_INDEX.md`.
- Updated `using-superpowers` skill to guide agents to look up the index first, preventing context bloat and token waste.
🧰 Tools
🪛 LanguageTool

[grammar] ~13-~13: Ensure spelling is correct
Context: ...g-superpowers` skill to guide agents to lookup the index first, preventing context blo...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🤖 Prompt for AI Agents
In `@pr_body.md` around lines 12 - 13, Change instances of the incorrect noun-form
"lookup" used as a verb to the two-word verb phrase "look up" in the new docs
and skill text: update the PR body entry that mentions "using-superpowers" and
the README/skill guidance added by generate_skills_index.js (and any references
in SKILLS_INDEX.md) so the phrasing reads "look up the index" (e.g., in the
"using-superpowers" skill guidance and the bullet describing the SKILLS_INDEX.md
generation).

Comment on lines +99 to +107
| POSIX / Linux | Windows (CMD/PowerShell) | Purpose |
|---------------|--------------------------|---------|
| `ls -la` | `dir` | List files |
| `rm -rf <dir>` | `rmdir /s /q <dir>` | Delete directory |
| `cp -r` | `xcopy /e /i /y` | Copy directory |
| `grep "text"` | `findstr "text"` | Search in files |
| `cat file` | `type file` | View file content |
| `touch file` | `type nul > file` | Create empty file (CMD) |

Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Windows column mixes CMD-only syntax while labeled CMD/PowerShell.

type nul > file is CMD-only. Either change the column header to “CMD” or add a PowerShell equivalent (e.g., New-Item file -ItemType File) to avoid misleading guidance.

✅ Suggested fix (add PowerShell variant)
-| POSIX / Linux | Windows (CMD/PowerShell) | Purpose |
+| POSIX / Linux | Windows (CMD / PowerShell) | Purpose |
 ...
-| `touch file` | `type nul > file` | Create empty file (CMD) |
+| `touch file` | `type nul > file` / `New-Item file -ItemType File` | Create empty file |
🤖 Prompt for AI Agents
In `@skills/using-superpowers/SKILL.md` around lines 99 - 107, The Windows column
header "Windows (CMD/PowerShell)" is misleading because the example "type nul >
file" is CMD-only; update the table in SKILL.md to either change the header to
"Windows (CMD)" or add a PowerShell equivalent for the "touch file" row (e.g.,
use New-Item file -ItemType File) so the Windows column content matches the
header; locate the table and the "touch file" / "type nul > file" cell and make
the header or cell change accordingly.

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.

1 participant

Comments