@openhands/extensions 0.23.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/.agents/skills/custom-codereview-guide.md +14 -12
  2. package/.claude-plugin/marketplace.json +14 -0
  3. package/.codex-plugin/marketplace.json +14 -0
  4. package/.github/workflows/check-extensions.yml +6 -6
  5. package/.github/workflows/deprecation-check.yml +1 -1
  6. package/.github/workflows/issue-readiness-check.yml +37 -106
  7. package/.github/workflows/npm-publish.yml +2 -2
  8. package/.github/workflows/pr-description-check.yml +1 -1
  9. package/.github/workflows/pypi-publish.yml +3 -3
  10. package/.github/workflows/tests.yml +2 -2
  11. package/.plugin/marketplace.json +14 -0
  12. package/.release-please-manifest.json +1 -1
  13. package/AGENTS.md +10 -1
  14. package/README.md +3 -2
  15. package/automations/bundle-index.js +2 -2
  16. package/automations/catalog/github-pr-reviewer/manifest.json +4 -4
  17. package/integrations/catalog/granola.json +38 -0
  18. package/integrations/catalog-index.js +16 -14
  19. package/marketplaces/openhands-extensions.json +14 -0
  20. package/package.json +1 -1
  21. package/pyproject.toml +2 -2
  22. package/python/openhands_extensions/_version.py +1 -1
  23. package/skills/add-skill/SKILL.md +5 -2
  24. package/skills/canvas-extension-api/.claude-plugin/plugin.json +19 -0
  25. package/skills/canvas-extension-api/.codex-plugin/plugin.json +19 -0
  26. package/skills/canvas-extension-api/.plugin/plugin.json +19 -0
  27. package/skills/canvas-extension-api/README.md +33 -0
  28. package/skills/canvas-extension-api/SKILL.md +254 -0
  29. package/skills/canvas-extension-api/references/acceptance-checklist.md +20 -0
  30. package/skills/canvas-extension-api/references/backend-safety.md +9 -0
  31. package/skills/canvas-extension-api/references/connections.md +126 -0
  32. package/skills/canvas-extension-api/references/packaging-recipes.md +43 -0
  33. package/skills/canvas-extension-api/references/sidecar-pattern.md +49 -0
  34. package/skills/canvas-extension-api/references/testing-and-installation.md +286 -0
  35. package/skills/canvas-extension-api/references/v1-contract.md +250 -0
  36. package/skills/canvas-extension-api/scripts/validate-extension.mjs +92 -0
  37. package/skills/canvas-extension-api/scripts/validate-extension.test.mjs +60 -0
  38. package/skills/github-pr-reviewer/README.md +6 -1
  39. package/skills/github-pr-reviewer/SKILL.md +24 -1
  40. package/skills/github-pr-reviewer/scripts/main.py +40 -11
  41. package/skills/github-pr-reviewer/scripts/worker.py +12 -3
  42. package/skills/github-pr-reviewer/tests/test_main.py +69 -0
  43. package/skills/index.js +11 -3
  44. package/tests/fixtures/automations/github-pr-reviewer.json +9 -9
  45. package/tests/test_github_reviewer_delivery.py +128 -1
  46. package/.github/scripts/check_issue_readiness.py +0 -272
  47. package/.github/scripts/post-readiness-comment.mjs +0 -184
  48. package/tests/test_check_issue_readiness.py +0 -135
@@ -12,18 +12,20 @@ current head when it has no material correctness, security, compatibility, or
12
12
  acceptance-criterion defect. Comment only on concrete failures; do not withhold
13
13
  approval for optional refactors, tone, style, or speculative improvements.
14
14
 
15
- ## Repository ownership and scope
16
-
17
- This repository owns reusable skills, plugins, automation bundles, and integration
18
- catalogs. Agent Server behavior, endpoints, and browser client code belong in
19
- `OpenHands/software-agent-sdk`; Canvas UI belongs in `OpenHands/OpenHands`; and
20
- scheduling, dispatch, run history, and sandbox lifecycle belong in
21
- `OpenHands/automation`.
22
-
23
- A content PR should remain focused on one extension or one shared mechanism that
24
- multiple extensions actually use. Flag unrelated edits to another skill, plugin,
25
- or automation. Shared runtime machinery belongs in the owning product repository,
26
- not copied into extension content.
15
+ ## Repository scope
16
+
17
+ This repository owns reusable extensions: skills, plugins, and automation
18
+ bundles that use existing public host and runtime interfaces. Out of scope here,
19
+ because another repository owns the contract or machinery:
20
+
21
+ - SDK, agent-server, and client contracts — `OpenHands/software-agent-sdk`;
22
+ - generic automation scheduling, state, dispatch, and profile machinery —
23
+ `OpenHands/automation`;
24
+ - Canvas product and UI integration — `OpenHands/OpenHands`.
25
+
26
+ Cross-repository work is acceptable when this PR contains only the
27
+ extensions-owned portion and relies on public interfaces from the owning
28
+ repository.
27
29
 
28
30
  ## Blocking checkpoints
29
31
 
@@ -106,6 +106,20 @@
106
106
  "delegation"
107
107
  ]
108
108
  },
109
+ {
110
+ "name": "canvas-extension-api",
111
+ "source": "./skills/canvas-extension-api",
112
+ "description": "Build and validate Apps for Agent Canvas using the supported Canvas Extensions API v1 routed-page contract.",
113
+ "category": "agent-authoring",
114
+ "defaultEnabled": true,
115
+ "keywords": [
116
+ "agent-canvas",
117
+ "canvas-app",
118
+ "canvas-extension",
119
+ "register-page",
120
+ "app-development"
121
+ ]
122
+ },
109
123
  {
110
124
  "name": "openhands-sdk",
111
125
  "source": "./skills/openhands-sdk",
@@ -106,6 +106,20 @@
106
106
  "delegation"
107
107
  ]
108
108
  },
109
+ {
110
+ "name": "canvas-extension-api",
111
+ "source": "./skills/canvas-extension-api",
112
+ "description": "Build and validate Apps for Agent Canvas using the supported Canvas Extensions API v1 routed-page contract.",
113
+ "category": "agent-authoring",
114
+ "defaultEnabled": true,
115
+ "keywords": [
116
+ "agent-canvas",
117
+ "canvas-app",
118
+ "canvas-extension",
119
+ "register-page",
120
+ "app-development"
121
+ ]
122
+ },
109
123
  {
110
124
  "name": "openhands-sdk",
111
125
  "source": "./skills/openhands-sdk",
@@ -11,10 +11,10 @@ jobs:
11
11
  runs-on: ubuntu-latest
12
12
  steps:
13
13
  - name: Checkout repository
14
- uses: actions/checkout@v4
14
+ uses: actions/checkout@v7
15
15
 
16
16
  - name: Setup Node.js
17
- uses: actions/setup-node@v4
17
+ uses: actions/setup-node@v7
18
18
  with:
19
19
  node-version: "20"
20
20
 
@@ -44,10 +44,10 @@ jobs:
44
44
  runs-on: ubuntu-latest
45
45
  steps:
46
46
  - name: Checkout repository
47
- uses: actions/checkout@v4
47
+ uses: actions/checkout@v7
48
48
 
49
49
  - name: Setup Python
50
- uses: actions/setup-python@v5
50
+ uses: actions/setup-python@v7
51
51
  with:
52
52
  python-version: "3.12"
53
53
 
@@ -63,10 +63,10 @@ jobs:
63
63
  runs-on: ubuntu-latest
64
64
  steps:
65
65
  - name: Checkout repository
66
- uses: actions/checkout@v4
66
+ uses: actions/checkout@v7
67
67
 
68
68
  - name: Setup Python
69
- uses: actions/setup-python@v5
69
+ uses: actions/setup-python@v7
70
70
  with:
71
71
  python-version: "3.12"
72
72
 
@@ -13,7 +13,7 @@ jobs:
13
13
  runs-on: ubuntu-latest
14
14
  steps:
15
15
  - name: Checkout repository
16
- uses: actions/checkout@v4
16
+ uses: actions/checkout@v7
17
17
 
18
18
  - name: Install uv
19
19
  uses: astral-sh/setup-uv@v7
@@ -1,131 +1,62 @@
1
1
  ---
2
- name: Issue Readiness Check
2
+ name: Ready-for-dev Label Policy
3
3
 
4
- # Manages the `ready-for-dev` label based on type-specific readiness criteria
5
- # tailored to extension contributions (skills, plugins, integrations,
6
- # automations).
7
- #
8
- # Bug reports (label `bug`): the Actual Behavior section must reference a
9
- # reproducible command (`uv run pytest`, `pytest`, `python`, `pip`, `npm run`,
10
- # or `node`), plus an Acceptance Criteria section with at least one checklist
11
- # item.
12
- #
13
- # Enhancements (label `enhancement`): the body must contain Desired Behavior and
14
- # Acceptance Criteria sections, the latter with at least one checklist item.
15
- #
16
- # When criteria are met the label is added (idempotently); when they are not the
17
- # label is removed. A feedback comment is posted (or updated) in three cases:
18
- # 1. The issue is first opened or reopened - always comment so the author
19
- # knows whether their issue is ready or what is missing.
20
- # 2. The label is being added (issue became ready) - comment celebrating it.
21
- # 3. The label is being removed (issue was ready but is no longer) - comment
22
- # explaining what changed.
23
- # Edits that do not change the label state do not produce a new comment. All
24
- # comments are upserted by a hidden marker so there is at most one per issue.
25
- #
26
- # The readiness step uses `--json`, which always exits 0, so a not-ready result
27
- # never aborts the workflow under `set -euo pipefail`; label and comment steps
28
- # run for both outcomes.
4
+ # The issue-triage automation and repository writers may grant ready-for-dev.
5
+ # Labels from any other actor are removed.
29
6
 
30
7
  on:
31
8
  issues:
32
- types: [opened, edited, reopened, labeled, unlabeled]
33
-
34
- permissions:
35
- issues: write
36
- pull-requests: read
37
- contents: read
9
+ types: [labeled, unlabeled]
38
10
 
39
11
  concurrency:
40
- group: issue-readiness-${{ github.event.issue.number }}
12
+ group: ready-for-dev-policy-${{ github.event.issue.number }}
41
13
  cancel-in-progress: false
42
14
 
43
15
  jobs:
44
- check:
45
- if: github.event.issue.state == 'open' && github.event.issue.pull_request == null
16
+ enforce-label-policy:
17
+ name: Enforce ready-for-dev label policy
18
+ if: >-
19
+ github.event.issue.state == 'open'
20
+ && github.event.issue.pull_request == null
21
+ && github.event.label.name == 'ready-for-dev'
46
22
  runs-on: ubuntu-latest
47
23
  timeout-minutes: 5
24
+ permissions:
25
+ issues: write
26
+ outputs:
27
+ refresh-linked-prs: ${{ steps.policy.outputs.refresh-linked-prs }}
48
28
  steps:
49
- - name: Checkout trusted workflow scripts
50
- uses: actions/checkout@v4
51
-
52
- - name: Evaluate issue readiness
53
- id: readiness
54
- env:
55
- GITHUB_EVENT_PATH: ${{ github.event_path }}
56
- run: |
57
- set -euo pipefail
58
- python .github/scripts/check_issue_readiness.py --json > /tmp/result.json
59
- echo "ready=$(jq -r '.ready' /tmp/result.json)" >> "$GITHUB_OUTPUT"
60
- # Write reasons to a file so the comment step can read them
61
- # without shell-escaping multiline text.
62
- jq -r '.reasons[]?' /tmp/result.json > /tmp/reasons.txt || true
63
- echo "reasons_file=/tmp/reasons.txt" >> "$GITHUB_OUTPUT"
64
-
65
- - name: Add ready-for-dev label
66
- if: steps.readiness.outputs.ready == 'true'
29
+ - name: Check label actor
30
+ id: policy
67
31
  env:
68
32
  GH_TOKEN: ${{ github.token }}
33
+ ACTION: ${{ github.event.action }}
34
+ ACTOR: ${{ github.event.sender.login }}
35
+ REPOSITORY: ${{ github.repository }}
36
+ ISSUE_NUMBER: ${{ github.event.issue.number }}
69
37
  run: |
70
38
  set -euo pipefail
71
- # Capture stderr — tolerate "label already present" (exit 0
72
- # from gh) but surface unexpected errors to the step summary.
73
- if ! gh issue edit "${{ github.event.issue.number }}" \
74
- --repo "${{ github.repository }}" \
75
- --add-label "ready-for-dev" 2>/tmp/gh-err.txt; then
76
- echo "::warning::Failed to add ready-for-dev label:" >> "$GITHUB_STEP_SUMMARY"
77
- cat /tmp/gh-err.txt >> "$GITHUB_STEP_SUMMARY"
78
- fi
79
39
 
80
- - name: Remove ready-for-dev label
81
- if: steps.readiness.outputs.ready != 'true' && contains(github.event.issue.labels.*.name, 'ready-for-dev')
82
- env:
83
- GH_TOKEN: ${{ github.token }}
84
- run: |
85
- set -euo pipefail
86
- # Capture stderr — tolerate "label already removed" but
87
- # surface unexpected errors.
88
- if ! gh issue edit "${{ github.event.issue.number }}" \
89
- --repo "${{ github.repository }}" \
90
- --remove-label "ready-for-dev" 2>/tmp/gh-err.txt; then
91
- echo "::warning::Failed to remove ready-for-dev label:" >> "$GITHUB_STEP_SUMMARY"
92
- cat /tmp/gh-err.txt >> "$GITHUB_STEP_SUMMARY"
40
+ if [ "$ACTION" = "unlabeled" ]; then
41
+ echo "refresh-linked-prs=true" >> "$GITHUB_OUTPUT"
42
+ exit 0
93
43
  fi
94
44
 
95
- - name: Post feedback comment
96
- if: >-
97
- github.event.action == 'opened'
98
- || github.event.action == 'reopened'
99
- || (steps.readiness.outputs.ready == 'true' && !contains(github.event.issue.labels.*.name, 'ready-for-dev'))
100
- || (steps.readiness.outputs.ready != 'true' && contains(github.event.issue.labels.*.name, 'ready-for-dev'))
101
- env:
102
- GH_TOKEN: ${{ github.token }}
103
- run: |
104
- set -euo pipefail
105
- if [ "${{ steps.readiness.outputs.ready }}" = "true" ]; then
106
- node .github/scripts/post-readiness-comment.mjs \
107
- --issue-number "${{ github.event.issue.number }}" \
108
- --repo "${{ github.repository }}" \
109
- --ready
110
- else
111
- node .github/scripts/post-readiness-comment.mjs \
112
- --issue-number "${{ github.event.issue.number }}" \
113
- --repo "${{ github.repository }}" \
114
- --reasons-file "${{ steps.readiness.outputs.reasons_file }}"
115
- fi
45
+ permission="$(gh api "repos/$REPOSITORY/collaborators/$ACTOR/permission" --jq .permission 2>/dev/null || true)"
46
+ case "$permission" in
47
+ write|maintain|admin)
48
+ echo "refresh-linked-prs=true" >> "$GITHUB_OUTPUT"
49
+ ;;
50
+ *)
51
+ gh issue edit "$ISSUE_NUMBER" --repo "$REPOSITORY" --remove-label ready-for-dev
52
+ echo "refresh-linked-prs=false" >> "$GITHUB_OUTPUT"
53
+ ;;
54
+ esac
116
55
 
117
- # When the ready-for-dev label is added or removed, re-run the PR
118
- # description check for every open PR that links this issue, so the
119
- # `ready-for-dev` gate does not go stale between PR events. Runs after
120
- # `check` so the label reflects the settled readiness state.
121
56
  refresh-linked-pr-gates:
122
57
  name: Refresh PR gates for linked issues
123
- needs: check
124
- if: >-
125
- github.event.issue.state == 'open'
126
- && github.event.issue.pull_request == null
127
- && (github.event.action == 'labeled' || github.event.action == 'unlabeled')
128
- && github.event.label.name == 'ready-for-dev'
58
+ needs: enforce-label-policy
59
+ if: needs.enforce-label-policy.outputs.refresh-linked-prs == 'true'
129
60
  runs-on: ubuntu-latest
130
61
  timeout-minutes: 10
131
62
  permissions:
@@ -134,7 +65,7 @@ jobs:
134
65
  actions: write
135
66
  steps:
136
67
  - name: Checkout trusted workflow scripts
137
- uses: actions/checkout@v4
68
+ uses: actions/checkout@v7
138
69
 
139
70
  - name: Re-run PR description checks for linked open PRs
140
71
  env:
@@ -31,14 +31,14 @@ jobs:
31
31
 
32
32
  steps:
33
33
  - name: Check out repository
34
- uses: actions/checkout@v6
34
+ uses: actions/checkout@v7
35
35
  with:
36
36
  ref: ${{ inputs.tag || github.ref }}
37
37
 
38
38
  # Trusted publishing requires Node 22.14.0+ and npm 11.5.1+
39
39
  # See: https://docs.npmjs.com/trusted-publishers/
40
40
  - name: Set up Node.js for npm trusted publishing
41
- uses: actions/setup-node@v6
41
+ uses: actions/setup-node@v7
42
42
  with:
43
43
  node-version: '24'
44
44
  registry-url: https://registry.npmjs.org
@@ -29,7 +29,7 @@ jobs:
29
29
  runs-on: ubuntu-latest
30
30
  steps:
31
31
  - name: Checkout trusted workflow scripts
32
- uses: actions/checkout@v4
32
+ uses: actions/checkout@v7
33
33
  with:
34
34
  ref: ${{ github.event.pull_request.base.sha }}
35
35
 
@@ -20,7 +20,7 @@ jobs:
20
20
 
21
21
  steps:
22
22
  - name: Check out repository
23
- uses: actions/checkout@v6
23
+ uses: actions/checkout@v7
24
24
 
25
25
  - name: Extract version
26
26
  id: extract_version
@@ -72,7 +72,7 @@ jobs:
72
72
  run: uv build
73
73
 
74
74
  - name: Upload distributions
75
- uses: actions/upload-artifact@v6
75
+ uses: actions/upload-artifact@v7
76
76
  with:
77
77
  name: python-package-distributions
78
78
  path: dist/
@@ -95,7 +95,7 @@ jobs:
95
95
 
96
96
  steps:
97
97
  - name: Download distributions
98
- uses: actions/download-artifact@v6
98
+ uses: actions/download-artifact@v8
99
99
  with:
100
100
  name: python-package-distributions
101
101
  path: dist/
@@ -12,7 +12,7 @@ jobs:
12
12
  runs-on: ubuntu-latest
13
13
  steps:
14
14
  - name: Checkout repository
15
- uses: actions/checkout@v4
15
+ uses: actions/checkout@v7
16
16
 
17
17
  - name: Install uv
18
18
  uses: astral-sh/setup-uv@v7
@@ -21,7 +21,7 @@ jobs:
21
21
  python-version: "3.12"
22
22
 
23
23
  - name: Setup Node.js
24
- uses: actions/setup-node@v4
24
+ uses: actions/setup-node@v7
25
25
  with:
26
26
  node-version: "20"
27
27
 
@@ -106,6 +106,20 @@
106
106
  "delegation"
107
107
  ]
108
108
  },
109
+ {
110
+ "name": "canvas-extension-api",
111
+ "source": "./skills/canvas-extension-api",
112
+ "description": "Build and validate Apps for Agent Canvas using the supported Canvas Extensions API v1 routed-page contract.",
113
+ "category": "agent-authoring",
114
+ "defaultEnabled": true,
115
+ "keywords": [
116
+ "agent-canvas",
117
+ "canvas-app",
118
+ "canvas-extension",
119
+ "register-page",
120
+ "app-development"
121
+ ]
122
+ },
109
123
  {
110
124
  "name": "openhands-sdk",
111
125
  "source": "./skills/openhands-sdk",
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "0.23.0"
2
+ ".": "0.24.0"
3
3
  }
package/AGENTS.md CHANGED
@@ -169,7 +169,16 @@ Important notes:
169
169
  - `scripts/sync_extensions.py` keeps generated artifacts in sync: Claude Code command files, README catalog section, coverage checks, and vendor symlinks. Run `python scripts/sync_extensions.py --check` (or just push — CI runs it) to verify everything is consistent. Run without `--check` to auto-fix. The "Quick Start" section in `README.md` (OpenHands SDK, Claude Code, and Codex setup instructions) is **manually maintained** above the auto-generated catalog markers and is intentionally not generated by the sync script.
170
170
  - The sync script uses PyYAML to parse SKILL.md frontmatter. If you add a skill with a slash trigger (e.g., `triggers: ["/mycommand"]`), the script auto-generates `commands/mycommand.md`. **Note:** Slash triggers in SKILL.md frontmatter are deprecated — prefer adding a `commands/command-name.md` file to the plugin's `commands/` directory instead. Keyword triggers (non-slash) remain the recommended way to activate skills by topic.
171
171
 
172
- - The `ready-for-dev` gates live in `.github/workflows/issue-readiness-check.yml` and `.github/workflows/pr-description-check.yml`, backed by `.github/scripts/check_issue_readiness.py`, `check_pr_description.py`, `refresh_linked_pr_checks.py`, and `post-readiness-comment.mjs`. Issues labeled `bug` or `enhancement` must meet type-specific readiness criteria (reproducible command plus Acceptance Criteria checklist for bugs; Desired Behavior plus Acceptance Criteria checklist for enhancements) to receive the `ready-for-dev` label. Non-draft PRs must keep the `## Why`, `## Summary`, and `## How to Test` template sections filled, and any issue linked via a closing keyword or the `## Issue Number` section must carry `ready-for-dev` unless it predates the 2026-08-25 rollout. Label transitions on an issue re-run the PR Description Check for linked open PRs. Tests live in `tests/test_check_issue_readiness.py`, `tests/test_check_pr_description.py`, and `tests/test_refresh_linked_pr_checks.py`.
172
+ - The GitHub issue-triage automation and repository writers may grant
173
+ `ready-for-dev`.
174
+ `.github/workflows/issue-readiness-check.yml` removes a newly applied label
175
+ unless a user with `write`, `maintain`, or `admin` permission applied it. An
176
+ `unlabeled` event then lets triage reassess the issue.
177
+ `.github/workflows/pr-description-check.yml` still requires linked issues to
178
+ be ready, and label transitions refresh that check through
179
+ `.github/scripts/refresh_linked_pr_checks.py`. Tests for the PR gates live in
180
+ `tests/test_check_pr_description.py` and
181
+ `tests/test_refresh_linked_pr_checks.py`.
173
182
 
174
183
  ## OpenHands SDK documentation policy
175
184
 
package/README.md CHANGED
@@ -96,7 +96,7 @@ The JS and Python versions are kept in lock-step by `release-please` and guarded
96
96
  ## Extensions Catalog
97
97
 
98
98
  <!-- BEGIN AUTO-GENERATED CATALOG -->
99
- This repository contains **2 marketplace(s)** with **72 extensions** (62 skills, 10 plugins).
99
+ This repository contains **2 marketplace(s)** with **73 extensions** (63 skills, 10 plugins).
100
100
 
101
101
  ### large-codebase
102
102
 
@@ -115,7 +115,7 @@ OpenHands skills for interacting, improving, and refactoring large codebases
115
115
 
116
116
  Official skills and plugins for OpenHands — the open-source AI software engineer.
117
117
 
118
- **68 extensions** (60 skills, 8 plugins)
118
+ **69 extensions** (61 skills, 8 plugins)
119
119
 
120
120
  | Name | Type | Description | Commands |
121
121
  |------|------|-------------|----------|
@@ -128,6 +128,7 @@ Official skills and plugins for OpenHands — the open-source AI software engine
128
128
  | bitbucket | skill | Bitbucket integration hub. Detects whether the repository is on Bitbucket Cloud or Bitbucket Data Center and directs ... | — |
129
129
  | bitbucket-cloud | skill | Bitbucket Cloud (bitbucket.org) specifics — authenticate with BITBUCKET_TOKEN, use the REST API v2, workspace/repo_sl... | — |
130
130
  | bitbucket-data-center | skill | Bitbucket Data Center (self-hosted Bitbucket Server) specifics — authenticate with BITBUCKET_DATA_CENTER_TOKEN, use t... | — |
131
+ | canvas-extension-api | skill | Build and validate Apps for Agent Canvas using the supported Canvas Extensions API v1 routed-page contract. | — |
131
132
  | city-weather | plugin | Get current weather, time, and precipitation forecast for any city using the free Open-Meteo API. Provides slash comm... | — |
132
133
  | code-review | skill | Rigorous code review focusing on data structures, simplicity, security, pragmatism, and risk/safety evaluation. Provi... | `/codereview`, `/codereview-roasted` |
133
134
  | code-simplifier | skill | Simplifies and refines code across three dimensions - code reuse, code quality, and efficiency - while preserving all... | `/simplify` |