-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Add personal superpowers overlay system #2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Enables users to write and manage their own skills alongside core skills.
## Key Features:
- Auto-setup on first session: Creates ~/.config/superpowers/ git repo
- Two-tier skills: Personal skills shadow core skills when paths match
- Environment variable support: PERSONAL_SUPERPOWERS_DIR, XDG_CONFIG_HOME
- GitHub integration: Optional public repo creation for sharing skills
- CLI-agnostic: Works across Claude Code, Codex CLI, Gemini CLI (future)
## Changes:
- Added hooks/setup-personal-superpowers.sh - Auto-initializes personal repo
- Updated hooks/session-start.sh - Runs setup, offers GitHub repo creation
- Updated list-skills, skills-search - Search both personal and core skills
- Renamed skills/meta/creating-skills → writing-skills
- Added skills/meta/setting-up-personal-superpowers - Setup documentation
- Added skills/meta/sharing-skills - Contribution workflow
- Removed skills/meta/installing-skills - Old ~/.clank system
- Removed all INDEX.md files - Replaced by list-skills tool
- Updated README.md, getting-started - Document personal skills workflow
## Architecture:
~/.config/superpowers/skills/ # Personal (user-created, git-tracked)
${CLAUDE_PLUGIN_ROOT}/skills/ # Core (read-only, from plugin)
Search order: Personal first, core second (first match wins)
Updates conversation indexing and search to use the new personal superpowers directory structure with environment variable support. Changes: - Added src/paths.ts for centralized directory resolution - Updated db.ts, indexer.ts, verify.ts to use paths.ts - Created migrate-to-config.sh for data migration from ~/.clank - Updated all documentation references from ~/.clank to ~/.config/superpowers - Database paths automatically updated during migration Migration tested with 5,017 conversations and 6,385 exchanges.
Allows indexing conversations without AI summary generation. Still generates embeddings locally for semantic search. Usage: index-conversations --cleanup --no-summaries Changes: - Added --no-summaries flag parsing in index-cli.ts - Updated indexConversations, indexSession, indexUnprocessed to accept noSummaries param - Changed indexUnprocessed to check database instead of summary file existence - Updated help text with new flag and examples This enables indexing large conversation archives without API costs.
Consolidates skill discovery and adds generic runner for cross-platform compatibility. Changes: - Created scripts/find-skills: Unified tool (show all + filter by pattern) - Shows descriptions by default - Searches personal first, then core (shadowing) - Logs searches for gap analysis - Bash 3.2 compatible - Created scripts/run: Generic runner for any skill script - Searches personal superpowers first, then core - Enables running arbitrary skill scripts without CLAUDE_PLUGIN_ROOT env var - Example: scripts/run skills/collaboration/remembering-conversations/tool/search-conversations - Fixed bash 3.2 compatibility in list-skills, skills-search - Replaced associative arrays with newline-delimited lists - Works on macOS default bash (3.2) and Linux bash 4+ - Updated all documentation to reference scripts/find-skills - Removed redundant wrapper scripts This solves the CLAUDE_PLUGIN_ROOT environment variable issue - scripts can now be called from anywhere without needing the env var set.
Consolidated into scripts/find-skills. The old tools in skills/getting-started/ are no longer needed - all functionality is now in scripts/find-skills which: - Shows all skills with descriptions (default) - Filters by pattern (when pattern provided) - Searches both personal and core skills - Works without CLAUDE_PLUGIN_ROOT environment variable
CLAUDE_PLUGIN_ROOT is a template variable for documentation, not a bash environment variable. Updated getting-started to use explicit paths that work in actual bash commands. Changes: - Use ~/.claude/plugins/cache/superpowers explicitly in bash examples - Add helper to find plugin location if needed - Update skill reading instructions to check both personal and core locations
The SessionStart hook now tells Claude the exact paths to find-skills and skill-run tools. Since hooks have CLAUDE_PLUGIN_ROOT expanded, the actual paths are injected into Claude's context. This solves the problem of CLAUDE_PLUGIN_ROOT not being available as a bash environment variable.
WalkthroughIntroduces a personal superpowers directory at ~/.config/superpowers/ with git initialization and optional GitHub integration. Adds scripts for finding and running skills with personal-first shadowing of core skills. Refactors conversation tools to centralized path utilities and a new --no-summaries mode. Updates docs, removes old indices and legacy scripts, and adds a migration tool. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant User
participant SessionStart Hook
participant Setup Script
participant GitHub CLI as gh
participant Context
User->>SessionStart Hook: Start session
SessionStart Hook->>Setup Script: hooks/setup-personal-superpowers.sh
Setup Script-->>SessionStart Hook: setup_output (dir, git init, github_cli_available)
alt setup_failed=true
SessionStart Hook->>Context: Append warning about setup failure
else
opt github_cli_available=true AND no origin
SessionStart Hook->>Context: Add GitHub repo creation suggestion
end
end
SessionStart Hook->>Context: Inject tool paths (find-skills, skill-run)
Note over Context: Personal skills shadow core skills
sequenceDiagram
autonumber
participant User
participant CLI as index-cli.ts
participant Indexer as indexer.ts
participant Paths as paths.ts
participant DB
participant Archive
User->>CLI: index-conversations --no-summaries
CLI->>Paths: getDbPath(), getArchiveDir()
CLI->>Indexer: indexConversations(..., noSummaries=true)
Indexer->>Archive: Read conversations (via Paths)
alt noSummaries=true
Indexer-->>User: Log "skipping summaries"
Indexer->>DB: Upsert conversation metadata only
else
Indexer->>DB: Upsert + generate summaries
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Comment |
Personal skills should be version controlled. Added deployment checklist items: - Commit skill to git - Push to GitHub - Consider sharing to core This ensures personal skills are properly tracked and backed up.
a4e1c2b to
803ce11
Compare
There was a problem hiding this 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
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
skills/collaboration/remembering-conversations/tool/src/index-cli.ts (1)
79-108: Wrap switch case declarations in a block.Variables declared in switch cases without block scope can be accessed by other cases, which can lead to errors.
Apply this diff to wrap the rebuild case in a block:
case 'rebuild': + { console.log('Rebuilding entire index...'); // Delete database const dbPath = getDbPath(); if (fs.existsSync(dbPath)) { fs.unlinkSync(dbPath); console.log('Deleted existing database'); } // Delete all summary files const archiveDir = getArchiveDir(); if (fs.existsSync(archiveDir)) { const projects = fs.readdirSync(archiveDir); for (const project of projects) { const projectPath = path.join(archiveDir, project); if (!fs.statSync(projectPath).isDirectory()) continue; const summaries = fs.readdirSync(projectPath).filter(f => f.endsWith('-summary.txt')); for (const summary of summaries) { fs.unlinkSync(path.join(projectPath, summary)); } } console.log('Deleted all summary files'); } // Re-index everything console.log('Re-indexing all conversations...'); await indexConversations(undefined, undefined, concurrency, noSummaries); break; + }Based on static analysis hints.
🧹 Nitpick comments (2)
skills/meta/sharing-skills/SKILL.md (1)
192-224: Consider markdown formatting improvements for consistency.Static analysis flagged several minor formatting issues:
Troubleshooting items (lines 209, 213, 217, 221): Use proper headings instead of bold emphasis for better document structure and navigation.
Bare URLs (lines 210, 215): Wrap URLs in angle brackets or use markdown link syntax.
Apply this diff to improve markdown structure:
## After PR is Merged Once your PR is merged: -**Option 1: Keep personal version** +### Option 1: Keep personal version - Useful if you want to continue iterating locally - Your personal version will shadow the core version - Can later delete personal version to use core -**Option 2: Delete personal version** +### Option 2: Delete personal version ```bash # Remove from personal repo to use core version rm -rf ~/.config/superpowers/skills/your-skill-name/ cd ~/.config/superpowers git add skills/your-skill-name/ git commit -m "Remove your-skill-name (now in core)" git pushTroubleshooting
-"gh: command not found"
+### "gh: command not found"
- Install GitHub CLI: https://cli.github.com/
- Authenticate:
gh auth login-"Permission denied (publickey)"
+### "Permission denied (publickey)"
- Check SSH keys:
gh auth status- Set up SSH: https://docs.github.com/en/authentication
-"Skill already exists in core"
+### "Skill already exists in core"
- You're creating a modified version
- Consider different skill name or shadow the core version in personal repo
-PR merge conflicts
+### PR merge conflicts
- Rebase on latest upstream:
git fetch upstream && git rebase upstream/main- Resolve conflicts
- Force push:
git push -f origin your-branchFor the bare URLs, consider: ```diff -Install GitHub CLI: https://cli.github.com/ +Install GitHub CLI: <https://cli.github.com/> -Set up SSH: https://docs.github.com/en/authentication +Set up SSH: <https://docs.github.com/en/authentication>skills/meta/writing-skills/SKILL.md (1)
74-81: Add language identifier to fenced code block.Static analysis flagged the code block as missing a language specification, which improves syntax highlighting and accessibility.
Apply this diff:
**All skills are written to `~/.config/superpowers/skills/`:** -``` +```text ~/.config/superpowers/skills/ skill-name/ SKILL.md # Main reference (required) supporting-file.* # Only if needed</blockquote></details> </blockquote></details> <details> <summary>📜 Review details</summary> **Configuration used**: CodeRabbit UI **Review profile**: CHILL **Plan**: Pro <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between dee324d41705a235af987e39c7450ec54a532e24 and 803ce11b5d8ca5009822fb610b7cbb816d72df19. </details> <details> <summary>⛔ Files ignored due to path filters (1)</summary> * `skills/meta/writing-skills/graphviz-conventions.dot` is excluded by `!**/*.dot` </details> <details> <summary>📒 Files selected for processing (29)</summary> * `.gitignore` (1 hunks) * `README.md` (5 hunks) * `hooks/session-start.sh` (1 hunks) * `hooks/setup-personal-superpowers.sh` (1 hunks) * `scripts/find-skills` (1 hunks) * `scripts/skill-run` (1 hunks) * `skills/INDEX.md` (0 hunks) * `skills/collaboration/INDEX.md` (0 hunks) * `skills/collaboration/remembering-conversations/DEPLOYMENT.md` (4 hunks) * `skills/collaboration/remembering-conversations/INDEXING.md` (4 hunks) * `skills/collaboration/remembering-conversations/tool/index-conversations` (2 hunks) * `skills/collaboration/remembering-conversations/tool/migrate-to-config.sh` (1 hunks) * `skills/collaboration/remembering-conversations/tool/src/db.ts` (1 hunks) * `skills/collaboration/remembering-conversations/tool/src/index-cli.ts` (5 hunks) * `skills/collaboration/remembering-conversations/tool/src/indexer.ts` (9 hunks) * `skills/collaboration/remembering-conversations/tool/src/paths.ts` (1 hunks) * `skills/collaboration/remembering-conversations/tool/src/verify.ts` (1 hunks) * `skills/debugging/INDEX.md` (0 hunks) * `skills/getting-started/SKILL.md` (5 hunks) * `skills/getting-started/list-skills` (0 hunks) * `skills/getting-started/skills-search` (0 hunks) * `skills/meta/INDEX.md` (0 hunks) * `skills/meta/installing-skills/CLAUDE_MD_PREAMBLE.md` (0 hunks) * `skills/meta/installing-skills/SKILL.md` (0 hunks) * `skills/meta/installing-skills/install.sh` (0 hunks) * `skills/meta/setting-up-personal-superpowers/SKILL.md` (1 hunks) * `skills/meta/sharing-skills/SKILL.md` (1 hunks) * `skills/meta/writing-skills/SKILL.md` (3 hunks) * `skills/testing/INDEX.md` (0 hunks) </details> <details> <summary>💤 Files with no reviewable changes (10)</summary> * skills/meta/installing-skills/CLAUDE_MD_PREAMBLE.md * skills/getting-started/skills-search * skills/debugging/INDEX.md * skills/INDEX.md * skills/meta/INDEX.md * skills/getting-started/list-skills * skills/meta/installing-skills/install.sh * skills/testing/INDEX.md * skills/collaboration/INDEX.md * skills/meta/installing-skills/SKILL.md </details> <details> <summary>🧰 Additional context used</summary> <details> <summary>🧬 Code graph analysis (2)</summary> <details> <summary>skills/collaboration/remembering-conversations/tool/src/indexer.ts (2)</summary><blockquote> <details> <summary>skills/collaboration/remembering-conversations/tool/src/paths.ts (2)</summary> * `getExcludeConfigPath` (54-56) * `getArchiveDir` (28-35) </details> <details> <summary>skills/collaboration/remembering-conversations/tool/src/db.ts (1)</summary> * `initDatabase` (21-70) </details> </blockquote></details> <details> <summary>skills/collaboration/remembering-conversations/tool/src/index-cli.ts (2)</summary><blockquote> <details> <summary>skills/collaboration/remembering-conversations/tool/src/indexer.ts (3)</summary> * `indexSession` (199-267) * `indexUnprocessed` (269-374) * `indexConversations` (58-197) </details> <details> <summary>skills/collaboration/remembering-conversations/tool/src/paths.ts (2)</summary> * `getDbPath` (47-49) * `getArchiveDir` (28-35) </details> </blockquote></details> </details><details> <summary>🪛 Biome (2.1.2)</summary> <details> <summary>skills/collaboration/remembering-conversations/tool/src/index-cli.ts</summary> [error] 83-84: Other switch clauses can erroneously access this declaration. Wrap the declaration in a block to restrict its access to the switch clause. The declaration is defined in this switch clause: Safe fix: Wrap the declaration in a block. (lint/correctness/noSwitchDeclarations) </details> </details> <details> <summary>🪛 markdownlint-cli2 (0.18.1)</summary> <details> <summary>skills/meta/sharing-skills/SKILL.md</summary> 192-192: Emphasis used instead of a heading (MD036, no-emphasis-as-heading) --- 197-197: Emphasis used instead of a heading (MD036, no-emphasis-as-heading) --- 209-209: Emphasis used instead of a heading (MD036, no-emphasis-as-heading) --- 210-210: Bare URL used (MD034, no-bare-urls) --- 213-213: Emphasis used instead of a heading (MD036, no-emphasis-as-heading) --- 215-215: Bare URL used (MD034, no-bare-urls) --- 217-217: Emphasis used instead of a heading (MD036, no-emphasis-as-heading) --- 221-221: Emphasis used instead of a heading (MD036, no-emphasis-as-heading) </details> <details> <summary>skills/meta/writing-skills/SKILL.md</summary> 76-76: Fenced code blocks should have a language specified (MD040, fenced-code-language) </details> <details> <summary>README.md</summary> 177-177: Fenced code blocks should have a language specified (MD040, fenced-code-language) </details> <details> <summary>skills/getting-started/SKILL.md</summary> 190-190: Bare URL used (MD034, no-bare-urls) </details> </details> <details> <summary>🪛 Shellcheck (0.11.0)</summary> <details> <summary>skills/collaboration/remembering-conversations/tool/migrate-to-config.sh</summary> [warning] 108-108: old_size appears unused. Verify use (or export if used externally). (SC2034) </details> </details> </details> <details> <summary>🔇 Additional comments (32)</summary><blockquote> <details> <summary>.gitignore (1)</summary><blockquote> `1-2`: **LGTM!** The ignore patterns for `.worktrees/` and `.private-journal/` are appropriate additions for the personal superpowers workspace, keeping development artifacts and personal notes out of version control. </blockquote></details> <details> <summary>skills/collaboration/remembering-conversations/INDEXING.md (1)</summary><blockquote> `28-28`: **LGTM!** Path references consistently updated from `~/.clank` to `~/.config/superpowers/` throughout the documentation, aligning with the new personal superpowers directory structure. Also applies to: 92-92, 104-104, 118-121 </blockquote></details> <details> <summary>skills/meta/setting-up-personal-superpowers/SKILL.md (1)</summary><blockquote> `1-162`: **LGTM!** Comprehensive and well-structured documentation for the personal superpowers setup. The coverage of automatic setup, GitHub integration, customization options, and troubleshooting provides a complete reference for users. </blockquote></details> <details> <summary>skills/collaboration/remembering-conversations/tool/index-conversations (1)</summary><blockquote> `25-36`: **LGTM!** The `--no-summaries` flag is well-documented in the help text with clear explanation of its purpose (skip AI summary generation for free, fast indexing) and a practical usage example. </blockquote></details> <details> <summary>skills/collaboration/remembering-conversations/DEPLOYMENT.md (1)</summary><blockquote> `80-80`: **LGTM!** Path references consistently updated from `~/.clank` to `~/.config/superpowers/` throughout the deployment documentation, maintaining alignment with the new directory structure. Also applies to: 83-83, 193-193, 200-200, 224-224, 303-309 </blockquote></details> <details> <summary>skills/collaboration/remembering-conversations/tool/src/db.ts (1)</summary><blockquote> `6-6`: **LGTM!** Refactoring to use centralized `getDbPath()` from the shared paths module improves maintainability and follows the DRY principle. The behavior remains unchanged while eliminating duplicate path resolution logic. Also applies to: 22-22 </blockquote></details> <details> <summary>skills/meta/writing-skills/SKILL.md (2)</summary><blockquote> `2-2`: **LGTM!** The rename from "Creating Skills" to "Writing Skills", version bump to 5.0.0, and explicit documentation of the personal skills location at `~/.config/superpowers/skills/` correctly reflect the new two-tier skills model introduced in this PR. Also applies to: 5-5, 15-15 --- `574-577`: **LGTM!** The deployment section correctly references git operations in `~/.config/superpowers/`, and the discovery workflow appropriately updates to use the `find-skills` tool, both aligning with the new personal superpowers overlay system. Also applies to: 584-584 </blockquote></details> <details> <summary>scripts/find-skills (1)</summary><blockquote> `1-142`: **LGTM! Well-designed skill discovery system.** The implementation correctly handles: - Personal-first shadowing with proper collision detection - Dual-mode operation (list all vs. pattern filtering) - Cross-platform compatibility (Bash 3.2+) - Search logging for gap tracking - Clear user feedback with descriptions The pattern matching strategy searching both content and paths provides comprehensive discovery. </blockquote></details> <details> <summary>hooks/setup-personal-superpowers.sh (1)</summary><blockquote> `1-52`: **LGTM! Clean setup script with proper idempotency.** The implementation correctly: - Checks for existing setup before proceeding - Creates a proper git structure with appropriate .gitignore patterns - Provides clear output for downstream consumption (github_cli_available) - Uses consistent path resolution with other scripts The git initialization is well-structured for personal skill tracking and optional sharing. </blockquote></details> <details> <summary>skills/collaboration/remembering-conversations/tool/src/verify.ts (1)</summary><blockquote> `5-5`: **LGTM! Clean migration to centralized path utilities.** The refactoring correctly consolidates path resolution logic by importing `getArchiveDir` from the shared `paths.ts` module instead of maintaining a local implementation. This improves maintainability and ensures consistent path handling across the toolset. Also applies to: 22-22, 135-135 </blockquote></details> <details> <summary>hooks/session-start.sh (2)</summary><blockquote> `4-27`: **LGTM! Robust setup and GitHub integration flow.** The implementation correctly: - Runs per-user setup with error capture - Conditionally offers GitHub integration only when appropriate (CLI available, no remote exists) - Handles setup failures gracefully with clear user guidance - Maintains consistency with setup script's path resolution The conditional logic properly avoids recommending GitHub when a remote already exists or setup failed. --- `29-37`: **LGTM! Context injection properly structured.** The JSON output correctly provides: - Tool paths using `CLAUDE_PLUGIN_ROOT` for proper resolution - Conditional GitHub recommendation based on setup outcome - Clear directive to read getting-started documentation The dynamic context appropriately guides the session initialization. </blockquote></details> <details> <summary>scripts/skill-run (1)</summary><blockquote> `1-54`: **LGTM! Clean runner with proper exec usage.** The implementation correctly: - Provides clear usage guidance - Implements personal-first shadowing with proper fallback - Uses `exec` for efficient process replacement (no wrapper process) - Reports searched locations on failure for debugging The script properly supports the two-tier skills model with transparent execution. </blockquote></details> <details> <summary>README.md (1)</summary><blockquote> `1-208`: **LGTM! Comprehensive documentation of the personal superpowers system.** The README clearly explains: - The two-tier skills model (personal + core) - Setup and configuration with environment variables - Skill discovery and execution workflows - Directory structure and git integration - Contributing patterns (personal → shared) The documentation provides excellent guidance for users adopting the new personal superpowers workflow. </blockquote></details> <details> <summary>skills/collaboration/remembering-conversations/tool/src/index-cli.ts (2)</summary><blockquote> `21-27`: **LGTM! Clean --no-summaries flag implementation.** The flag is properly: - Parsed from command-line arguments - Propagated to all indexing entry points (indexSession, indexUnprocessed, indexConversations) - Consistent with the concurrency flag pattern This enables faster indexing when summaries aren't needed. Also applies to: 38-38, 42-42, 107-107, 112-112 --- `5-5`: **LGTM! Migration to centralized path utilities.** The switch to `getDbPath()` and `getArchiveDir()` from the shared paths module ensures consistent path resolution across the conversation tooling. Also applies to: 83-90 </blockquote></details> <details> <summary>skills/collaboration/remembering-conversations/tool/src/paths.ts (3)</summary><blockquote> `12-23`: **LGTM! Well-structured path resolution.** The three-tier precedence (PERSONAL_SUPERPOWERS_DIR → XDG_CONFIG_HOME/superpowers → ~/.config/superpowers) is logical and well-documented. The implementation correctly handles each case. --- `28-35`: **LGTM! Good test override pattern.** The TEST_ARCHIVE_DIR override is a clean pattern for testing without affecting user data. The path construction is correct. --- `40-56`: **LGTM! Clean path construction.** All three functions (`getIndexDir`, `getDbPath`, `getExcludeConfigPath`) are straightforward and correctly build paths relative to the superpowers directory. Good separation of concerns. </blockquote></details> <details> <summary>skills/getting-started/SKILL.md (2)</summary><blockquote> `1-14`: **LGTM! Clear introduction to the two-library system.** The version bump to 3.0.0 is appropriate for the personal skills feature. The explanation of core vs personal skills and shadowing behavior is clear and concise. --- `16-76`: **LGTM! Workflow updates are clear and consistent.** The updated workflows correctly reference the find-skills script and consistently explain the personal-first, then core lookup order. All path references are accurate. </blockquote></details> <details> <summary>skills/collaboration/remembering-conversations/tool/src/indexer.ts (10)</summary><blockquote> `9-9`: **LGTM! Centralized path imports.** Correctly imports the centralized path utilities from the new paths module. --- `31-31`: **LGTM! Using centralized exclude config path.** Correctly uses `getExcludeConfigPath()` from the centralized paths module instead of hard-coded path construction. --- `58-72`: **LGTM! Well-integrated noSummaries parameter.** The `noSummaries` parameter is correctly added with a sensible default (`false`), and the early logging provides clear feedback when running in no-summaries mode. --- `76-76`: **LGTM! Using centralized archive directory.** Correctly uses `getArchiveDir()` from the centralized paths module. The inline comment is helpful for reviewers. --- `147-169`: **LGTM! Correct conditional summary generation.** The conditional logic correctly skips summary generation when `noSummaries` is `true` and provides clear logging in both cases. The parallel batch processing for summaries (when enabled) is maintained. --- `199-204`: **LGTM! Consistent parameter addition.** The `noSummaries` parameter is consistently added to `indexSession`, and the centralized path function is correctly used. --- `239-245`: **LGTM! Correct conditional logic for session indexing.** The conditional correctly checks both `!noSummaries` and `!fs.existsSync(summaryPath)` to avoid regenerating existing summaries and to respect the noSummaries flag. --- `269-278`: **LGTM! Consistent implementation across indexing functions.** The `noSummaries` parameter, logging, and centralized path function usage are consistent with the other indexing functions. --- `308-312`: **LGTM! Good optimization with database check.** Checking if a conversation is already indexed in the database before processing is a sensible optimization that prevents redundant work. --- `337-358`: **LGTM! Consistent conditional summary generation.** The conditional logic for batch processing summaries matches the pattern in `indexConversations`, correctly skipping when `noSummaries` is `true` and providing clear logging. </blockquote></details> </blockquote></details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
| ``` | ||
| ~/.config/superpowers/ # (or your custom location) | ||
| ├── .git/ # Git repository | ||
| ├── .gitignore # Ignores logs and indexes | ||
| ├── README.md # About your personal superpowers | ||
| ├── skills/ # Your personal skills | ||
| │ └── your-skill/ | ||
| │ └── SKILL.md | ||
| ├── search-log.jsonl # Failed skill searches (not tracked) | ||
| └── conversation-index/ # Indexed conversations (not tracked) | ||
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add language specifier to code block.
The code block at line 177 is missing a language specifier for proper syntax highlighting.
Apply this diff:
-```
+```text
~/.config/superpowers/ # (or your custom location)
├── .git/ # Git repository
├── .gitignore # Ignores logs and indexesBased on static analysis hints.
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)
177-177: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
In README.md around lines 177 to 187, the shown code block lacks a language
specifier; update the opening code fence from ``` to ```text so the block begins
with ```text and the rest of the snippet remains unchanged, ensuring proper
syntax/highlight rendering.
| if [[ -f "$OLD_INDEX/db.sqlite" ]]; then | ||
| old_size=$(stat -f%z "$OLD_INDEX/db.sqlite" 2>/dev/null || stat --format=%s "$OLD_INDEX/db.sqlite" 2>/dev/null) | ||
| new_size=$(stat -f%z "$NEW_INDEX/db.sqlite" 2>/dev/null || stat --format=%s "$NEW_INDEX/db.sqlite" 2>/dev/null) | ||
| echo " ✓ Database migrated (${new_size} bytes)" | ||
| fi |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove unused variable or add size comparison.
old_size is assigned but never used. Either remove it or enhance the verification by comparing old and new database sizes.
Apply this diff to remove the unused variable:
if [[ -f "$OLD_INDEX/db.sqlite" ]]; then
- old_size=$(stat -f%z "$OLD_INDEX/db.sqlite" 2>/dev/null || stat --format=%s "$OLD_INDEX/db.sqlite" 2>/dev/null)
new_size=$(stat -f%z "$NEW_INDEX/db.sqlite" 2>/dev/null || stat --format=%s "$NEW_INDEX/db.sqlite" 2>/dev/null)
echo " ✓ Database migrated (${new_size} bytes)"
fiOr add a comparison:
if [[ -f "$OLD_INDEX/db.sqlite" ]]; then
old_size=$(stat -f%z "$OLD_INDEX/db.sqlite" 2>/dev/null || stat --format=%s "$OLD_INDEX/db.sqlite" 2>/dev/null)
new_size=$(stat -f%z "$NEW_INDEX/db.sqlite" 2>/dev/null || stat --format=%s "$NEW_INDEX/db.sqlite" 2>/dev/null)
- echo " ✓ Database migrated (${new_size} bytes)"
+ if [[ "$old_size" -eq "$new_size" ]]; then
+ echo " ✓ Database migrated (${new_size} bytes)"
+ else
+ echo " ⚠️ Database size mismatch: old=$old_size, new=$new_size"
+ exit 1
+ fi
fiBased on static analysis hints.
🧰 Tools
🪛 Shellcheck (0.11.0)
[warning] 108-108: old_size appears unused. Verify use (or export if used externally).
(SC2034)
🤖 Prompt for AI Agents
In skills/collaboration/remembering-conversations/tool/migrate-to-config.sh
around lines 107 to 111, the variable old_size is assigned but never used;
remove the old_size assignment and any related unused code, leaving only the
new_size computation and the echo reporting the migrated database size (or, if
you prefer verification, replace the unused assignment with a size comparison
check that verifies new_size differs from old_size and fail/warn if not).
| Want a skill that doesn't exist? Edit skills/REQUESTS.md (at ${CLAUDE_PLUGIN_ROOT}/skills/REQUESTS.md) | ||
| **Want a skill that doesn't exist?** | ||
| - Write it yourself (see skills/meta/writing-skills) and share it! | ||
| - Or open an issue at https://github.com/obra/superpowers/issues |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix bare URL formatting.
The bare URL should be wrapped in angle brackets or converted to a proper markdown link for better readability and compliance with markdown best practices.
Apply this diff:
-- Or open an issue at https://github.com/obra/superpowers/issues
+- Or open an issue at <https://github.com/obra/superpowers/issues>Alternatively, you can use a markdown link:
-- Or open an issue at https://github.com/obra/superpowers/issues
+- Or [open an issue](https://github.com/obra/superpowers/issues)📝 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.
| - Or open an issue at https://github.com/obra/superpowers/issues | |
| - Or open an issue at <https://github.com/obra/superpowers/issues> |
| - Or open an issue at https://github.com/obra/superpowers/issues | |
| - Or [open an issue](https://github.com/obra/superpowers/issues) |
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)
190-190: Bare URL used
(MD034, no-bare-urls)
🤖 Prompt for AI Agents
In skills/getting-started/SKILL.md around line 190, the bare URL
"https://github.com/obra/superpowers/issues" should be formatted; replace the
plain URL with either an angle-bracketed URL like
<https://github.com/obra/superpowers/issues> or convert it to a markdown link
such as [open an issue](https://github.com/obra/superpowers/issues) so the line
reads e.g. "Or open an issue at <https://github.com/obra/superpowers/issues>" or
"Or open an issue at [open an
issue](https://github.com/obra/superpowers/issues)".
Documents all changes since v1.0.0: - Skills repository separation (breaking change) - New problem-solving and research skills (PR #1) - Personal superpowers system (PR #2, later replaced) - Auto-update functionality - Skills improvements (using-skills v4.0.0, sharing-skills v2.0.0) - Tools improvements (find-skills, skill-run) - Plugin infrastructure changes - Migration guide for existing users
Add personal superpowers overlay system
Documents all changes since v1.0.0: - Skills repository separation (breaking change) - New problem-solving and research skills (PR obra#1) - Personal superpowers system (PR obra#2, later replaced) - Auto-update functionality - Skills improvements (using-skills v4.0.0, sharing-skills v2.0.0) - Tools improvements (find-skills, skill-run) - Plugin infrastructure changes - Migration guide for existing users
Summary
Enables users to write and manage their own skills alongside core superpowers, with automatic setup and GitHub integration.
Key Features
~/.config/superpowers/as git repoPERSONAL_SUPERPOWERS_DIR,XDG_CONFIG_HOMEfind-skills(discovery),skill-run(generic runner)Architecture
Changes
Core System:
Skills:
creating-skills→writing-skillssetting-up-personal-superpowers- documents auto-setupsharing-skills- workflow for contributing to coreinstalling-skills(obsolete ~/.clank system)Tools:
scripts/find-skills- Show all skills with descriptions, or filter by patternscripts/skill-run- Generic runner for any skill script (searches personal then core)list-skills,skills-searchfrom getting-startedConversation Search:
~/.clank/to~/.config/superpowers/--no-summariesflag for cost-free indexingsrc/paths.tsCleanup:
Testing
Tested in container with:
~/.config/superpowers/with git repofind-skillsshows all skills with descriptionsfind-skills testfilters by patternskill-runexecutes skill scripts from both personal and coreMigration
Users with existing
~/.clank/data can run:~/.claude/plugins/cache/superpowers/skills/collaboration/remembering-conversations/tool/migrate-to-config.shThis preserves old data for safety while copying to new location.
Summary by CodeRabbit
New Features
Documentation
Chores