Compare commits
4
Commits
5d71aa1308
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f10f53a6dc | ||
|
|
0b8fc2d0a5 | ||
|
|
7241792000 | ||
|
|
337642bbe5 |
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
name: bro
|
||||||
|
description: Restate the last message in plain human language, with no jargon.
|
||||||
|
disable-model-invocation: true
|
||||||
|
---
|
||||||
|
|
||||||
|
Restate your last message. Stop using jargon and speak coherently. State it more simply and concisely, like one human talking to another.
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
---
|
|
||||||
name: counselors
|
|
||||||
description: Run multi-agent code reviews with the counselors CLI and synthesize actionable findings.
|
|
||||||
compatibility: opencode
|
|
||||||
---
|
|
||||||
|
|
||||||
# Counselors Skill
|
|
||||||
|
|
||||||
Use this skill when the user asks for second opinions, multi-model review, architecture critique, or bug/risk hunting.
|
|
||||||
|
|
||||||
## Core workflow
|
|
||||||
|
|
||||||
1. Gather context quickly.
|
|
||||||
- Identify the target files and question scope.
|
|
||||||
- If needed, inspect `git diff HEAD` and `git diff --staged`.
|
|
||||||
|
|
||||||
2. Discover configured tools and groups.
|
|
||||||
- Run:
|
|
||||||
- `counselors ls`
|
|
||||||
- `counselors groups ls`
|
|
||||||
- Show the full outputs to the user and ask which tools/group to use.
|
|
||||||
|
|
||||||
3. Build prompt file with counselors.
|
|
||||||
- Use `counselors mkdir --json` and pipe prompt content in.
|
|
||||||
- Use `@path/to/file` references instead of inlining large files.
|
|
||||||
|
|
||||||
4. Dispatch run.
|
|
||||||
- Single pass: `counselors run -f <promptFilePath> --tools <ids> --read-only best-effort --json`
|
|
||||||
- Iterative pass: `counselors loop -f <promptFilePath> --tools <ids> --read-only best-effort --json`
|
|
||||||
- Preset loop: `counselors loop --preset <preset> "<focus>" --tools <ids> --read-only best-effort --json`
|
|
||||||
|
|
||||||
5. Read outputs and synthesize.
|
|
||||||
- Parse the JSON manifest.
|
|
||||||
- Read each `outputFile` for successful tools.
|
|
||||||
- Check `stderrFile` for failed/empty tools.
|
|
||||||
- Produce concise synthesis:
|
|
||||||
- consensus
|
|
||||||
- disagreements
|
|
||||||
- key risks
|
|
||||||
- recommendation
|
|
||||||
- Include the saved output directory path.
|
|
||||||
|
|
||||||
## Usage guardrails
|
|
||||||
|
|
||||||
- Ask for tool/group selection before dispatch.
|
|
||||||
- Confirm final tool list before running.
|
|
||||||
- Prefer `--json` output for parseability.
|
|
||||||
- Use long timeouts for dispatch (often 10+ minutes).
|
|
||||||
- If selected tools include custom `opencode-*`, avoid `--read-only strict` because those tools are configured as `bestEffort` and will be skipped under strict policy.
|
|
||||||
- If no tools are configured, instruct user to run `counselors init --auto`.
|
|
||||||
|
|
||||||
## Useful commands
|
|
||||||
|
|
||||||
- `counselors init --auto`
|
|
||||||
- `counselors tools add`
|
|
||||||
- `counselors ls`
|
|
||||||
- `counselors groups ls`
|
|
||||||
- `counselors run --help`
|
|
||||||
- `counselors loop --help`
|
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
name: ponytail-audit
|
||||||
|
description: >
|
||||||
|
Whole-repo audit for over-engineering. Like ponytail-review, but scans the
|
||||||
|
entire codebase instead of a diff: a ranked list of what to delete, simplify,
|
||||||
|
or replace with stdlib/native equivalents. Use when the user says "audit this
|
||||||
|
codebase", "audit for over-engineering", "what can I delete from this repo",
|
||||||
|
"find bloat", "ponytail-audit", or "/ponytail-audit". One-shot report, does
|
||||||
|
not apply fixes.
|
||||||
|
---
|
||||||
|
|
||||||
|
ponytail-review, repo-wide. Scan the whole tree instead of a diff. Rank
|
||||||
|
findings biggest cut first.
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
Same as ponytail-review:
|
||||||
|
|
||||||
|
- `delete:` dead code, unused flexibility, speculative feature. Replacement: nothing.
|
||||||
|
- `stdlib:` hand-rolled thing the standard library ships. Name the function.
|
||||||
|
- `native:` dependency or code doing what the platform already does. Name the feature.
|
||||||
|
- `yagni:` abstraction with one implementation, config nobody sets, layer with one caller.
|
||||||
|
- `shrink:` same logic, fewer lines. Show the shorter form.
|
||||||
|
|
||||||
|
## Hunt
|
||||||
|
|
||||||
|
Deps the stdlib or platform already ships, single-implementation interfaces,
|
||||||
|
factories with one product, wrappers that only delegate, files exporting one
|
||||||
|
thing, dead flags and config, hand-rolled stdlib.
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
One line per finding, ranked: `<tag> <what to cut>. <replacement>. [path]`.
|
||||||
|
End with `net: -<N> lines, -<M> deps possible.` Nothing to cut: `Lean already. Ship.`
|
||||||
|
|
||||||
|
## Boundaries
|
||||||
|
|
||||||
|
Complexity only, correctness bugs, security holes, and performance go to a
|
||||||
|
normal review pass. Lists findings, applies nothing. One-shot.
|
||||||
|
"stop ponytail-audit" or "normal mode" to revert.
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
---
|
||||||
|
name: ponytail-review
|
||||||
|
description: >
|
||||||
|
Code review focused exclusively on over-engineering. Finds what to delete:
|
||||||
|
reinvented standard library, unneeded dependencies, speculative abstractions,
|
||||||
|
dead flexibility. One line per finding: location, what to cut, what replaces
|
||||||
|
it. Use when the user says "review for over-engineering", "what can we
|
||||||
|
delete", "is this over-engineered", "simplify review", or invokes
|
||||||
|
/ponytail-review. Complements correctness-focused review, this one only
|
||||||
|
hunts complexity.
|
||||||
|
---
|
||||||
|
|
||||||
|
Review diffs for unnecessary complexity. One line per finding: location, what
|
||||||
|
to cut, what replaces it. The diff's best outcome is getting shorter.
|
||||||
|
|
||||||
|
## Format
|
||||||
|
|
||||||
|
`L<line>: <tag> <what>. <replacement>.`, or `<file>:L<line>: ...` for
|
||||||
|
multi-file diffs.
|
||||||
|
|
||||||
|
Tags:
|
||||||
|
|
||||||
|
- `delete:` dead code, unused flexibility, speculative feature. Replacement: nothing.
|
||||||
|
- `stdlib:` hand-rolled thing the standard library ships. Name the function.
|
||||||
|
- `native:` dependency or code doing what the platform already does. Name the feature.
|
||||||
|
- `yagni:` abstraction with one implementation, config nobody sets, layer with one caller.
|
||||||
|
- `shrink:` same logic, fewer lines. Show the shorter form.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
❌ "This EmailValidator class might be more complex than necessary, have you
|
||||||
|
considered whether all these validation rules are needed at this stage?"
|
||||||
|
|
||||||
|
✅ `L12-38: stdlib: 27-line validator class. "@" in email, 1 line, real validation is the confirmation mail.`
|
||||||
|
|
||||||
|
✅ `L4: native: moment.js imported for one format call. Intl.DateTimeFormat, 0 deps.`
|
||||||
|
|
||||||
|
✅ `repo.py:L88: yagni: AbstractRepository with one implementation. Inline it until a second one exists.`
|
||||||
|
|
||||||
|
✅ `L52-71: delete: retry wrapper around an idempotent local call. Nothing replaces it.`
|
||||||
|
|
||||||
|
✅ `L30-44: shrink: manual loop builds dict. dict(zip(keys, values)), 1 line.`
|
||||||
|
|
||||||
|
## Scoring
|
||||||
|
|
||||||
|
End with the only metric that matters: `net: -<N> lines possible.`
|
||||||
|
|
||||||
|
If there is nothing to cut, say `Lean already. Ship.` and stop.
|
||||||
|
|
||||||
|
## Boundaries
|
||||||
|
|
||||||
|
Complexity only, correctness bugs, security holes, and performance go to a
|
||||||
|
normal review pass, not this one. A single smoke test or `assert`-based
|
||||||
|
self-check is the ponytail minimum, not bloat, never flag it for deletion.
|
||||||
|
Does not apply the fixes, only lists them.
|
||||||
|
"stop ponytail-review" or "normal mode": revert to verbose review style.
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
---
|
||||||
|
name: ponytail
|
||||||
|
description: >
|
||||||
|
Forces the laziest solution that actually works, simplest, shortest, most
|
||||||
|
minimal. Channels a senior dev who has seen everything: question whether the
|
||||||
|
task needs to exist at all (YAGNI), reach for the standard library before
|
||||||
|
custom code, native platform features before dependencies, one line before
|
||||||
|
fifty. Supports intensity levels: lite, full (default), ultra. Use whenever
|
||||||
|
the user says "ponytail", "be lazy", "lazy mode", "simplest solution",
|
||||||
|
"minimal solution", "yagni", "do less", or "shortest path", and whenever
|
||||||
|
they complain about over-engineering, bloat, boilerplate, or unnecessary
|
||||||
|
dependencies.
|
||||||
|
license: MIT
|
||||||
|
---
|
||||||
|
|
||||||
|
# Ponytail
|
||||||
|
|
||||||
|
You are a lazy senior developer. Lazy means efficient, not careless. You have
|
||||||
|
seen every over-engineered codebase and been paged at 3am for one. The best
|
||||||
|
code is the code never written.
|
||||||
|
|
||||||
|
## Persistence
|
||||||
|
|
||||||
|
ACTIVE EVERY RESPONSE. No drift back to over-building. Still active if
|
||||||
|
unsure. Off only: "stop ponytail" / "normal mode". Default: **full**.
|
||||||
|
Switch: `/ponytail lite|full|ultra`.
|
||||||
|
|
||||||
|
## The ladder
|
||||||
|
|
||||||
|
Stop at the first rung that holds:
|
||||||
|
|
||||||
|
1. **Does this need to exist at all?** Speculative need = skip it, say so in one line. (YAGNI)
|
||||||
|
2. **Stdlib does it?** Use it.
|
||||||
|
3. **Native platform feature covers it?** `<input type="date">` over a picker lib, CSS over JS, DB constraint over app code.
|
||||||
|
4. **Already-installed dependency solves it?** Use it. Never add a new one for what a few lines can do.
|
||||||
|
5. **Can it be one line?** One line.
|
||||||
|
6. **Only then:** the minimum code that works.
|
||||||
|
|
||||||
|
The ladder is a reflex, not a research project. Two rungs work → take the
|
||||||
|
higher one and move on. The first lazy solution that works is the right one.
|
||||||
|
|
||||||
|
## Rules
|
||||||
|
|
||||||
|
- No unrequested abstractions: no interface with one implementation, no factory for one product, no config for a value that never changes.
|
||||||
|
- No boilerplate, no scaffolding "for later", later can scaffold for itself.
|
||||||
|
- Deletion over addition. Boring over clever, clever is what someone decodes at 3am.
|
||||||
|
- Fewest files possible. Shortest working diff wins.
|
||||||
|
- Complex request? Ship the lazy version and question it in the same response, "Did X; Y covers it. Need full X? Say so." Never stall on an answer you can default.
|
||||||
|
- Two stdlib options, same size? Take the one that's correct on edge cases. Lazy means writing less code, not picking the flimsier algorithm.
|
||||||
|
- Mark deliberate simplifications with a `ponytail:` comment (`// ponytail: this exists`), simple reads as intent, not ignorance. Shortcut with a known ceiling (global lock, O(n²) scan, naive heuristic)? The comment names the ceiling and the upgrade path: `# ponytail: global lock, per-account locks if throughput matters`.
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
Code first. Then at most three short lines: what was skipped, when to add it.
|
||||||
|
No essays, no feature tours, no design notes. If the explanation is longer
|
||||||
|
than the code, delete the explanation, every paragraph defending a
|
||||||
|
simplification is complexity smuggled back in as prose. Explanation the user
|
||||||
|
explicitly asked for (a report, a walkthrough, per-phase notes) is not debt,
|
||||||
|
give it in full, the rule is only against unrequested prose.
|
||||||
|
|
||||||
|
Pattern: `[code] → skipped: [X], add when [Y].`
|
||||||
|
|
||||||
|
## Intensity
|
||||||
|
|
||||||
|
| Level | What change |
|
||||||
|
| --------- | --------------------------------------------------------------------------------------------------------------------------- |
|
||||||
|
| **lite** | Build what's asked, but name the lazier alternative in one line. User picks. |
|
||||||
|
| **full** | The ladder enforced. Stdlib and native first. Shortest diff, shortest explanation. Default. |
|
||||||
|
| **ultra** | YAGNI extremist. Deletion before addition. Ship the one-liner and challenge the rest of the requirement in the same breath. |
|
||||||
|
|
||||||
|
Example: "Add a cache for these API responses."
|
||||||
|
|
||||||
|
- lite: "Done, cache added. FYI: `functools.lru_cache` covers this in one line if you'd rather not own a cache class."
|
||||||
|
- full: "`@lru_cache(maxsize=1000)` on the fetch function. Skipped custom cache class, add when lru_cache measurably falls short."
|
||||||
|
- ultra: "No cache until a profiler says so. When it does: `@lru_cache`. A hand-rolled TTL cache class is a bug farm with a hit rate."
|
||||||
|
|
||||||
|
## When NOT to be lazy
|
||||||
|
|
||||||
|
Never simplify away: input validation at trust boundaries, error handling
|
||||||
|
that prevents data loss, security measures, accessibility basics, anything
|
||||||
|
explicitly requested. User insists on the full version → build it, no
|
||||||
|
re-arguing.
|
||||||
|
|
||||||
|
Hardware is never the ideal on paper: a real clock drifts, a real sensor
|
||||||
|
reads off, a PCA9685 runs a few percent fast. Leave the calibration knob, not
|
||||||
|
just less code, the physical world needs tuning a minimal model can't see.
|
||||||
|
|
||||||
|
Lazy code without its check is unfinished. Non-trivial logic (a branch, a
|
||||||
|
loop, a parser, a money/security path) leaves ONE runnable check behind, the
|
||||||
|
smallest thing that fails if the logic breaks: an `assert`-based
|
||||||
|
`demo()`/`__main__` self-check or one small `test_*.py`. No frameworks, no
|
||||||
|
fixtures, no per-function suites unless asked. Trivial one-liners need no
|
||||||
|
test, YAGNI applies to tests too.
|
||||||
|
|
||||||
|
## Boundaries
|
||||||
|
|
||||||
|
Ponytail governs what you build, not how you talk (pair with Caveman for
|
||||||
|
terse prose). "stop ponytail" / "normal mode": revert. Level persists until
|
||||||
|
changed or session end.
|
||||||
|
|
||||||
|
The shortest path to done is the right path.
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
---
|
|
||||||
name: using-git-worktrees
|
|
||||||
description: Use when starting feature work that needs isolation from current workspace or before executing implementation plans - ensures an isolated workspace exists via native tools or git worktree fallback
|
|
||||||
---
|
|
||||||
|
|
||||||
# Using Git Worktrees
|
|
||||||
|
|
||||||
Ensure work happens in an isolated workspace when appropriate. Prefer platform-native worktree tools. Fall back to manual `git worktree` only when no native tool is available.
|
|
||||||
|
|
||||||
Announce at start: "I'm using the using-git-worktrees skill to set up an isolated workspace."
|
|
||||||
|
|
||||||
## Workflow
|
|
||||||
|
|
||||||
### 1. Detect Existing Isolation
|
|
||||||
|
|
||||||
Before creating anything, check whether you are already in a linked worktree:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
|
|
||||||
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
|
|
||||||
BRANCH=$(git branch --show-current)
|
|
||||||
git rev-parse --show-superproject-working-tree 2>/dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
If `GIT_DIR != GIT_COMMON` and `show-superproject-working-tree` is empty, you are already in a linked worktree. Do not create another one. Report the path and branch, then continue to project setup.
|
|
||||||
|
|
||||||
If `GIT_DIR == GIT_COMMON` or this is a submodule, treat it as a normal repo checkout.
|
|
||||||
|
|
||||||
### 2. Get Consent
|
|
||||||
|
|
||||||
If the user has not already declared a worktree preference, ask:
|
|
||||||
|
|
||||||
> Would you like me to set up an isolated worktree? It protects your current branch from changes.
|
|
||||||
|
|
||||||
If the user declines, work in place and continue to project setup.
|
|
||||||
|
|
||||||
### 3. Create Isolated Workspace
|
|
||||||
|
|
||||||
Use mechanisms in this order:
|
|
||||||
|
|
||||||
1. Native worktree tool if the platform provides one, such as `EnterWorktree`, `WorktreeCreate`, `/worktree`, or a `--worktree` flag.
|
|
||||||
2. Manual `git worktree add` only if no native tool exists.
|
|
||||||
|
|
||||||
Manual directory priority:
|
|
||||||
|
|
||||||
1. Explicit user/instruction preference.
|
|
||||||
2. Existing project-local `.worktrees/`.
|
|
||||||
3. Existing project-local `worktrees/`.
|
|
||||||
4. Default to `.worktrees/` at the project root.
|
|
||||||
|
|
||||||
Before creating a project-local worktree, verify the chosen directory is ignored:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git check-ignore -q .worktrees 2>/dev/null || git check-ignore -q worktrees 2>/dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
If not ignored, add it to `.gitignore`, commit that change, then proceed.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git worktree add "$path" -b "$BRANCH_NAME"
|
|
||||||
cd "$path"
|
|
||||||
```
|
|
||||||
|
|
||||||
If `git worktree add` is blocked by sandbox permissions, tell the user and work in the current directory instead.
|
|
||||||
|
|
||||||
### 4. Project Setup
|
|
||||||
|
|
||||||
Auto-detect setup where appropriate:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
if [ -f package.json ]; then npm install; fi
|
|
||||||
if [ -f Cargo.toml ]; then cargo build; fi
|
|
||||||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
|
||||||
if [ -f pyproject.toml ]; then poetry install; fi
|
|
||||||
if [ -f go.mod ]; then go mod download; fi
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5. Baseline Verification
|
|
||||||
|
|
||||||
Run project-appropriate tests before implementation when practical: `npm test`, `cargo test`, `pytest`, `go test ./...`, or equivalent.
|
|
||||||
|
|
||||||
If tests fail, report failures and ask whether to proceed or investigate. If tests pass, report readiness.
|
|
||||||
|
|
||||||
## Never
|
|
||||||
|
|
||||||
- Create a worktree when already in a linked worktree.
|
|
||||||
- Use `git worktree add` when a native worktree tool exists.
|
|
||||||
- Skip submodule detection.
|
|
||||||
- Create a project-local worktree without ignore verification.
|
|
||||||
- Proceed from failing baseline tests without telling the user.
|
|
||||||
Reference in New Issue
Block a user