Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions .github/workflows/format.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
name: Format

on:
pull_request:

permissions:
contents: write

concurrency:
group: format-${{ github.head_ref }}
cancel-in-progress: true

jobs:
prettier:
runs-on: ubuntu-latest
env:
# Fork PRs get a read-only token, so they are verified instead of fixed.
IS_FORK:
${{ github.event.pull_request.head.repo.full_name != github.repository
}}
steps:
- name: Checkout PR branch
uses: actions/checkout@v4
with:
# A fork's branch does not exist here; fall back to the merge ref.
ref: ${{ env.IS_FORK != 'true' && github.head_ref || '' }}
persist-credentials: true
token: ${{ secrets.GITHUB_TOKEN }}

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm

- name: Install dependencies
run: npm ci

- name: Check formatting
if: env.IS_FORK == 'true'
run: npm run format:check

- name: Run Prettier
if: env.IS_FORK != 'true'
run: npm run format

- name: Commit formatting
if: env.IS_FORK != 'true'
env:
BRANCH: ${{ github.head_ref }}
run: |
if git diff --quiet; then
echo "Already formatted; nothing to commit."
exit 0
fi
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git commit -am "style: format with prettier"
if git push; then
exit 0
fi
remote=$(git ls-remote origin "refs/heads/$BRANCH" | cut -f1)
if [ "$remote" != "$(git rev-parse HEAD~1)" ]; then
echo "Branch advanced during formatting; the newer run will format it."
exit 0
fi
exit 1
4 changes: 4 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules/
package-lock.json
CHANGELOG.md
**/CHANGELOG.md
4 changes: 4 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"printWidth": 80,
"proseWrap": "always"
}
71 changes: 46 additions & 25 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Claude Code Marketplace Repository

This repo is a Claude Code plugin marketplace. It follows the marketplace spec used by Claude Code's built-in plugin system.
This repo is a Claude Code plugin marketplace. It follows the marketplace spec
used by Claude Code's built-in plugin system.

## Repository Structure

Expand All @@ -21,10 +22,13 @@ This repo is a Claude Code plugin marketplace. It follows the marketplace spec u

## Key Rules

- **marketplace.json** is the source of truth. Every plugin must be registered in `.claude-plugin/marketplace.json` under the `plugins` array.
- **marketplace.json** is the source of truth. Every plugin must be registered
in `.claude-plugin/marketplace.json` under the `plugins` array.
- **Plugin directories** live at the repo root (not nested in subdirectories).
- **plugin.json** in each plugin's `.claude-plugin/` directory must include: `name`, `version`, `description`, and `author`.
- **Source paths** in marketplace.json are relative, e.g. `"source": "./<plugin-name>"`.
- **plugin.json** in each plugin's `.claude-plugin/` directory must include:
`name`, `version`, `description`, and `author`.
- **Source paths** in marketplace.json are relative, e.g.
`"source": "./<plugin-name>"`.

## Adding a New Plugin

Expand All @@ -33,36 +37,53 @@ This repo is a Claude Code plugin marketplace. It follows the marketplace spec u
3. Add skills, commands, agents, or MCP config as needed.
4. Register the plugin in `.claude-plugin/marketplace.json`:

```json
{
"name": "plugin-name",
"source": "./plugin-name",
"description": "What the plugin does",
"version": "0.0.0",
"author": {
"name": "Ben Everly"
},
"category": "development"
}
```

5. Add a `.release-it.json` to the plugin directory (see "Releases" — a plugin without one is silently skipped by CI and never releases).
```json
{
"name": "plugin-name",
"source": "./plugin-name",
"description": "What the plugin does",
"version": "0.0.0",
"author": {
"name": "Ben Everly"
},
"category": "development"
}
```

5. Add a `.release-it.json` to the plugin directory (see "Releases" — a plugin
without one is silently skipped by CI and never releases).

6. Update the "Available Plugins" section in README.md.

## Releases

Plugins are released automatically by release-it, which derives each plugin's version bump from the Conventional Commits made since its last tag. You should NEVER manually edit plugin versions except to set the initial version, which should always be `0.0.0`.

**Every plugin MUST have its own `.release-it.json`.** The CI workflow loops over each plugin in `marketplace.json` and runs `release-it` inside it; a plugin without a config is silently skipped (release-it can't determine a tag prefix or compute a bump, so it prints "No new version to release" and exits 0). Copy an existing plugin's `.release-it.json` and replace every `<plugin-name>-v` tag prefix, `commitMessage`, `releaseName`, and the `sync-marketplace.js` argument with the new plugin's name. When adding a plugin, verify a matching config exists before merging.

**Pull requests are squash-merged, so the PR title becomes the commit message release-it reads.** A non-conventional title (e.g. "Add new plugin") collapses to a typeless commit, so release-it falls back to a patch bump and any intended minor bump is lost. PR titles MUST follow [Conventional Commits](https://www.conventionalcommits.org/):
Plugins are released automatically by release-it, which derives each plugin's
version bump from the Conventional Commits made since its last tag. You should
NEVER manually edit plugin versions except to set the initial version, which
should always be `0.0.0`.

**Every plugin MUST have its own `.release-it.json`.** The CI workflow loops
over each plugin in `marketplace.json` and runs `release-it` inside it; a plugin
without a config is silently skipped (release-it can't determine a tag prefix or
compute a bump, so it prints "No new version to release" and exits 0). Copy an
existing plugin's `.release-it.json` and replace every `<plugin-name>-v` tag
prefix, `commitMessage`, `releaseName`, and the `sync-marketplace.js` argument
with the new plugin's name. When adding a plugin, verify a matching config
exists before merging.

**Pull requests are squash-merged, so the PR title becomes the commit message
release-it reads.** A non-conventional title (e.g. "Add new plugin") collapses
to a typeless commit, so release-it falls back to a patch bump and any intended
minor bump is lost. PR titles MUST follow
[Conventional Commits](https://www.conventionalcommits.org/):

- `feat:` / `feat(scope):` — new capability → **minor**
- `fix:` — bug fix → **patch**
- `feat!:` or a `BREAKING CHANGE:` footer — breaking change → **major**
- `docs:`, `chore:`, `refactor:`, `ci:`, `test:`, `build:` — patch / no release as appropriate
- `docs:`, `chore:`, `style:`, `refactor:`, `ci:`, `test:`, `build:` — patch /
no release as appropriate

## Categories

Use one of: `development`, `productivity`, `security`, `testing`, `learning`, `design`, `database`, `monitoring`, `deployment`.
Use one of: `development`, `productivity`, `security`, `testing`, `learning`,
`design`, `database`, `monitoring`, `deployment`.
27 changes: 15 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# ben-everly Claude Code Plugins

A marketplace of Claude Code plugins — skills, commands, and agents for development workflows.
A marketplace of Claude Code plugins — skills, commands, and agents for
development workflows.

## Installation

Expand All @@ -26,19 +27,20 @@ Install a plugin:

## Available Plugins

| Plugin | Description | Install |
| ------------------------- | --------------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
| **development-workflow** | A structured development workflow covering planning, design, implementation, review, and delivery | `/plugin install development-workflow@ben-everly` |
| **intelephense** | PHP language server (Intelephense) with optimized file exclusions to reduce RAM usage | `/plugin install intelephense@ben-everly` |
| **conventional-branches** | Name git branches following the Conventional Branch spec (type-first prefixes) | `/plugin install conventional-branches@ben-everly` |
| **ticket-branches** | Name git branches after their ticket/issue id (ticket-first, slash-namespaced) for trunk-based dev | `/plugin install ticket-branches@ben-everly` |
| **git-flow** | Name branches and point PRs following the git flow model (git-flow CLI / Atlassian) | `/plugin install git-flow@ben-everly` |
| **product-discovery** | Product-discovery skills — a Working Backwards (PR/FAQ) document drafter | `/plugin install product-discovery@ben-everly` |
| **brainpower** | A toolkit of named thinking techniques — deliberate cognitive moves to test and expand thinking | `/plugin install brainpower@ben-everly` |
| Plugin | Description | Install |
| ------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
| **development-workflow** | A structured development workflow covering planning, design, implementation, review, and delivery | `/plugin install development-workflow@ben-everly` |
| **intelephense** | PHP language server (Intelephense) with optimized file exclusions to reduce RAM usage | `/plugin install intelephense@ben-everly` |
| **conventional-branches** | Name git branches following the Conventional Branch spec (type-first prefixes) | `/plugin install conventional-branches@ben-everly` |
| **ticket-branches** | Name git branches after their ticket/issue id (ticket-first, slash-namespaced) for trunk-based dev | `/plugin install ticket-branches@ben-everly` |
| **git-flow** | Name branches and point PRs following the git flow model (git-flow CLI / Atlassian) | `/plugin install git-flow@ben-everly` |
| **product-discovery** | Product-discovery skills — a Working Backwards (PR/FAQ) document drafter | `/plugin install product-discovery@ben-everly` |
| **brainpower** | A toolkit of named thinking techniques — deliberate cognitive moves to test and expand thinking | `/plugin install brainpower@ben-everly` |

## Creating a Plugin

Each plugin lives in its own directory at the repo root with the following structure:
Each plugin lives in its own directory at the repo root with the following
structure:

```
plugin-name/
Expand All @@ -54,7 +56,8 @@ plugin-name/
└── .mcp.json # MCP server config (optional)
```

After adding a plugin directory, register it in `.claude-plugin/marketplace.json` under the `plugins` array.
After adding a plugin directory, register it in
`.claude-plugin/marketplace.json` under the `plugins` array.

## License

Expand Down
2 changes: 1 addition & 1 deletion brainpower/skills/convergent-thinking/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
name: convergent-thinking
description:
Narrows a set of candidate options down through explicit, stated criteria.
Narrows a set of candidate options down through explicit, stated criteria.
disable-model-invocation: true
---

Expand Down
68 changes: 51 additions & 17 deletions brainpower/skills/divergent-thinking/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,50 +1,84 @@
---
name: divergent-thinking
description: Generates many materially distinct options for a problem, with judgment deferred.
description:
Generates many materially distinct options for a problem, with judgment
deferred.
disable-model-invocation: true
---

# Divergent Thinking

## Overview

Produce a wide spread of materially distinct options for a problem or idea in one shot, with judgment deferred. A named thinking technique: the deliberate opposite of convergent questioning — instead of narrowing toward one understanding, it fans out to many possibilities before any of them is judged.
Produce a wide spread of materially distinct options for a problem or idea in
one shot, with judgment deferred. A named thinking technique: the deliberate
opposite of convergent questioning — instead of narrowing toward one
understanding, it fans out to many possibilities before any of them is judged.

## Input

The problem or idea to generate options for — drawn from the conversation, or stated at invocation. This is one-shot: there is no multi-question intake.
The problem or idea to generate options for — drawn from the conversation, or
stated at invocation. This is one-shot: there is no multi-question intake.

If it is unclear what options are being generated *for*, state a one-line working interpretation and generate against it, so a wrong guess is visible and cheap to correct. Ask a single clarifying question only when the target is too ambiguous to interpret at all. Never block waiting for an answer when an interpretation is available.
If it is unclear what options are being generated _for_, state a one-line
working interpretation and generate against it, so a wrong guess is visible and
cheap to correct. Ask a single clarifying question only when the target is too
ambiguous to interpret at all. Never block waiting for an answer when an
interpretation is available.

## Generative lenses

Options are generated from deliberately different starting points so they don't collapse into one theme. Work the orthogonal core set of seven:
Options are generated from deliberately different starting points so they don't
collapse into one theme. Work the orthogonal core set of seven:

1. **Invert** — pursue the opposite goal / solve the reverse problem.
2. **Borrow** — import a solution from an unrelated domain by analogy, or bend an existing tool, asset, or byproduct to this goal.
3. **Change the constraints** — drop an assumed-fixed limit (budget, time, a rule), *or* force an arbitrary one (must cost $0, must work offline, must ship this week).
4. **Push to an extreme** — the 10x maximal version *and* the near-nothing minimal version.
2. **Borrow** — import a solution from an unrelated domain by analogy, or bend
an existing tool, asset, or byproduct to this goal.
3. **Change the constraints** — drop an assumed-fixed limit (budget, time, a
rule), _or_ force an arbitrary one (must cost $0, must work offline, must
ship this week).
4. **Push to an extreme** — the 10x maximal version _and_ the near-nothing
minimal version.
5. **Combine** — mash two existing elements or ideas together.
6. **Shift the actor** — change who does it or who it is for.
7. **Question the premise** — challenge why the problem is framed this way at all, including removing the element everyone treats as essential.
7. **Question the premise** — challenge why the problem is framed this way at
all, including removing the element everyone treats as essential.

Set apart from the core, one high-variance optional lens:

- **Random stimulus** *(optional, swing-for-the-fences)* — pick an unrelated word or object and force a connection; reaches the most non-obvious ideas and misses most often.
- **Random stimulus** _(optional, swing-for-the-fences)_ — pick an unrelated
word or object and force a connection; reaches the most non-obvious ideas and
misses most often.

## Discipline

- **Attempt every core lens honestly**, including the uncomfortable ones (Invert, Question the premise) — those hide the non-obvious options. Do not pre-decide a lens "won't fit"; a lens contributes nothing only after an honest attempt yields nothing, and its empty result is simply dropped.
- **Generate as many materially distinct options as each lens genuinely supports.**
- **Judgment is deferred throughout:** no ranking, no scoring, no recommendation.
- **There is no option quota.** Distinctness is the sole hard constraint; the total count is a consequence, never a target.
- **Attempt every core lens honestly**, including the uncomfortable ones
(Invert, Question the premise) — those hide the non-obvious options. Do not
pre-decide a lens "won't fit"; a lens contributes nothing only after an honest
attempt yields nothing, and its empty result is simply dropped.
- **Generate as many materially distinct options as each lens genuinely
supports.**
- **Judgment is deferred throughout:** no ranking, no scoring, no
recommendation.
- **There is no option quota.** Distinctness is the sole hard constraint; the
total count is a consequence, never a target.

## Distinctness check

Before presenting, audit the full set and collapse near-duplicates by merging or dropping them — never by backfilling a manufactured substitute to keep the set large. If collapsing leaves only a few genuinely distinct options, present the smaller set honestly and note that the problem space appears to support limited variety.
Before presenting, audit the full set and collapse near-duplicates by merging or
dropping them — never by backfilling a manufactured substitute to keep the set
large. If collapsing leaves only a few genuinely distinct options, present the
smaller set honestly and note that the problem space appears to support limited
variety.

## Output

Every option carries its generative source as a visible annotation — by default a lightweight inline tag naming the lens, with lens-grouped section headers as an alternative rendering. The rendering is the only latitude; the provenance itself is not optional, since it is what makes the generative spread inspectable. The one hard constraint: annotating by generative source must never become clustering by theme or merit.
Every option carries its generative source as a visible annotation — by default
a lightweight inline tag naming the lens, with lens-grouped section headers as
an alternative rendering. The rendering is the only latitude; the provenance
itself is not optional, since it is what makes the generative spread
inspectable. The one hard constraint: annotating by generative source must never
become clustering by theme or merit.

The skill stops at the presented set: it offers no follow-up step and makes no claim about re-invocation.
The skill stops at the presented set: it offers no follow-up step and makes no
claim about re-invocation.
Loading
Loading