Good First Issues¶
Curated list of approachable tasks for new contributors. Each one is self-contained and can be completed without deep knowledge of the full system.
| # | Title | Difficulty | Relevant Files | Description | Suggested Approach |
|---|---|---|---|---|---|
| 1 | Add docstrings to AuditLog class and its methods |
Easy | superpowers/audit.py |
The AuditLog class and all 4 public methods (log, tail, search, path) lack docstrings. The coding standard requires Google-style docstrings on all public APIs. |
Read the method signatures and the existing tests in tests/test_audit.py to understand behavior, then add docstrings. |
| 2 | Add docstrings to BrowserEngine class (16 methods) |
Medium | superpowers/browser/engine.py |
BrowserEngine and all its public methods (start, stop, goto, screenshot, extract_text, fill_form, etc.) are missing docstrings. |
Each method is short. Read the code and add a one-liner plus Args/Returns where applicable. |
| 3 | Add docstrings to CredentialRotationChecker and related dataclasses |
Easy | superpowers/credential_rotation.py |
Four classes (AlertStatus, CredentialAlert, RotationPolicy, CredentialRotationChecker) and 5 methods missing docstrings. |
Dataclasses just need a class-level docstring explaining their purpose. |
| 4 | Add docstrings to memory subsystem | Easy | superpowers/memory/store.py, superpowers/memory/base.py, superpowers/memory/context.py |
The MemoryStore methods (remember, recall, search, forget, list_memories, decay, stats) and base dataclasses lack docstrings. |
Check tests/test_memory_store.py for usage patterns. |
| 5 | Add docstrings to WatcherEngine class |
Easy | superpowers/watcher/engine.py |
WatcherEngine and 5 public methods (start, stop, list_rules, get_rule, on_any_event) need docstrings. |
Short class, each method is straightforward. |
| 6 | Add docstrings to ProfileManager and browser dataclasses |
Easy | superpowers/browser/profiles.py, superpowers/browser/base.py |
ProfileManager (3 methods) and 3 dataclasses (BrowserConfig, PageResult, ElementData) lack docstrings. |
Small file, quick task. |
| 7 | Write tests for config.py |
Medium | superpowers/config.py, tests/ |
The config loader module has no dedicated test file. It handles .env loading and default paths. |
Create tests/test_config.py with tests for default paths, env var overrides, and missing .env handling. |
| 8 | Write tests for telegram_notify.py |
Medium | superpowers/telegram_notify.py, tests/ |
The Telegram notification helper has no test file. It wraps HTTP calls to the Telegram Bot API. | Create tests/test_telegram_notify.py, mock HTTP calls with unittest.mock.patch, test success and error paths. |
| 9 | Write tests for skill_loader.py |
Medium | superpowers/skill_loader.py, tests/ |
The skill loader (discovers and runs skills) has no dedicated test file despite being a core component. | Create tests/test_skill_loader.py. Test skill discovery, YAML parsing, sandboxed execution. Mock subprocess calls. |
| 10 | Replace except BaseException with specific exceptions in atomic-write patterns |
Easy | superpowers/cron_engine.py:444, superpowers/ssh_fabric/health.py:123, superpowers/vault.py:165 |
Three files use except BaseException: in their atomic-write cleanup blocks. These should catch BaseException intentionally (to clean up temp files) but should be annotated with # noqa comments explaining why, or narrowed where possible. |
Add # noqa: BLE001 -- cleanup temp file on any failure comments, or refactor to use contextlib.suppress / finally blocks. |
| 11 | Add --help descriptions to CLI subcommands missing them |
Easy | superpowers/cli_cron.py, superpowers/cli_ssh.py, superpowers/cli_vault.py |
Several Click command groups and subcommands lack help= strings, so claw <cmd> --help shows no description. |
Search for @click.command() and @click.group() calls without help= parameter and add concise descriptions. |
| 12 | Add extended descriptions to skill.yaml manifests | Easy | skills/*/skill.yaml |
Most skill manifests have only a single description: line. Adding a long_description: or multi-line description would improve claw skill list --verbose output. |
Pick 3-5 skills, read their run.py/run.sh, and expand the YAML description with usage examples and what the skill checks. |
| 13 | Add .env.example completeness check |
Easy | .env.example, superpowers/config.py |
The .env.example documents some variables but may drift from what the code actually reads. A test or script that ensures every os.getenv() / os.environ[] call in the codebase has a corresponding entry in .env.example would prevent configuration drift. |
Grep for os.getenv and os.environ across the codebase, compare keys to .env.example, write a test that fails on missing entries. |
| 14 | Create a claw doctor diagnostic command |
Medium | superpowers/cli.py |
There is no single command to check that the environment is healthy (Python version, venv active, Redis reachable, Docker running, age installed). A claw doctor command would help new users troubleshoot setup. |
Add a doctor subcommand that checks prerequisites and prints a pass/fail table. See skills/heartbeat/ for a similar pattern. |
| 15 | Add retry logic to skill_creator.py template generation |
Easy | superpowers/skill_creator.py |
The skill creator has 3 TODO comments (# TODO: implement skill logic, # TODO: add arguments, # TODO: implement skill logic) in its generated template code. These should be replaced with more helpful scaffold code or at minimum better placeholder comments. |
Replace the TODOs with meaningful placeholder implementations (e.g., argparse boilerplate, a sample main() body, example print statements). |
| 16 | Add type hints to SkillHub class |
Easy | superpowers/skillhub.py |
The SkillHub class and SyncResult dataclass are missing docstrings. Several methods could benefit from more precise type annotations (e.g., return types on sync methods). |
Add docstrings and verify/add return type hints to all public methods. |
| 17 | Write a smoke test for each skill | Medium | skills/*/run.py, skills/*/run.sh, tests/ |
Most skills lack even a basic "does it import / parse args without crashing" test. A parametrized pytest that discovers all skills and runs --help (or imports the module) would catch import errors early. |
Create tests/test_skills_smoke.py that globs skills/*/skill.yaml, imports or invokes each skill's entry point with --help, and asserts exit code 0. |