@openhands/extensions 0.0.1-alpha → 0.2.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.
- package/.agents/skills/custom-codereview-guide.md +25 -0
- package/.github/pull_request_template.md +38 -0
- package/.github/release.yml +14 -0
- package/.github/workflows/check-extensions.yml +72 -0
- package/.github/workflows/npm-publish.yml +89 -0
- package/.github/workflows/pr.yml +30 -0
- package/.github/workflows/release.yml +24 -0
- package/.github/workflows/tests.yml +25 -0
- package/.github/workflows/vulnerability-scan.yml +87 -0
- package/.release-please-manifest.json +3 -0
- package/AGENTS.md +132 -0
- package/README.md +10 -0
- package/analysis_results.md +162 -0
- package/marketplaces/large-codebase.json +66 -0
- package/marketplaces/openhands-extensions.json +682 -0
- package/package.json +4 -10
- package/plugins/README.md +30 -0
- package/plugins/city-weather/.plugin/plugin.json +13 -0
- package/plugins/city-weather/README.md +145 -0
- package/plugins/city-weather/commands/now.md +56 -0
- package/plugins/cobol-modernization/.plugin/plugin.json +19 -0
- package/plugins/cobol-modernization/README.md +201 -0
- package/plugins/cobol-modernization/references/troubleshooting.md +18 -0
- package/plugins/cobol-modernization/skills/build-setup/SKILL.md +78 -0
- package/plugins/cobol-modernization/skills/build-setup/scripts/install-gnucobol.sh +32 -0
- package/plugins/cobol-modernization/skills/cobol-modernization-overview/SKILL.md +113 -0
- package/plugins/cobol-modernization/skills/mainfraime-removal/SKILL.md +62 -0
- package/plugins/cobol-modernization/skills/mainfraime-removal/references/cics-transformation-examples.md +45 -0
- package/plugins/cobol-modernization/skills/mainframe-planning/SKILL.md +78 -0
- package/plugins/cobol-modernization/skills/to-java-migration/SKILL.md +59 -0
- package/plugins/cobol-modernization/skills/to-java-migration/references/cobol-to-java-example.md +58 -0
- package/plugins/cobol-modernization/skills/to-java-migration/references/datatype-mappings.md +19 -0
- package/plugins/issue-duplicate-checker/.plugin/plugin.json +13 -0
- package/plugins/issue-duplicate-checker/README.md +51 -0
- package/plugins/issue-duplicate-checker/action.yml +349 -0
- package/plugins/issue-duplicate-checker/scripts/auto_close_duplicate_issues.py +569 -0
- package/plugins/issue-duplicate-checker/scripts/issue_duplicate_check_openhands.py +681 -0
- package/plugins/issue-duplicate-checker/scripts/post_duplicate_notice.js +220 -0
- package/plugins/issue-duplicate-checker/scripts/remove_duplicate_candidate_label.js +27 -0
- package/plugins/magic-test/.plugin/plugin.json +13 -0
- package/plugins/magic-test/skills/magic-word/SKILL.md +33 -0
- package/plugins/migration-scoring/.plugin/plugin.json +19 -0
- package/plugins/migration-scoring/README.md +244 -0
- package/plugins/migration-scoring/skills/migration-mapping/SKILL.md +72 -0
- package/plugins/migration-scoring/skills/migration-report/SKILL.md +118 -0
- package/plugins/migration-scoring/skills/migration-scoring-overview/SKILL.md +126 -0
- package/plugins/migration-scoring/skills/score-quality/SKILL.md +54 -0
- package/plugins/migration-scoring/skills/score-quality/references/scoring-criteria.md +30 -0
- package/plugins/migration-scoring/skills/score-style/SKILL.md +106 -0
- package/plugins/onboarding/.plugin/plugin.json +20 -0
- package/plugins/onboarding/README.md +30 -0
- package/plugins/onboarding/references/criteria.md +144 -0
- package/plugins/onboarding/skills/agent-readiness-report/README.md +23 -0
- package/plugins/onboarding/skills/agent-readiness-report/SKILL.md +122 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_agent_instructions.sh +88 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_build_env.sh +114 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_feedback_loops.sh +133 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_policy.sh +113 -0
- package/plugins/onboarding/skills/agent-readiness-report/scripts/scan_workflows.sh +127 -0
- package/plugins/onboarding/skills/improve-agent-readiness/README.md +19 -0
- package/plugins/onboarding/skills/improve-agent-readiness/SKILL.md +167 -0
- package/plugins/onboarding/skills/setup-agents-md/README.md +15 -0
- package/plugins/onboarding/skills/setup-agents-md/SKILL.md +150 -0
- package/plugins/onboarding/skills/setup-openhands/README.md +20 -0
- package/plugins/onboarding/skills/setup-openhands/SKILL.md +56 -0
- package/plugins/onboarding/skills/setup-pr-review/README.md +23 -0
- package/plugins/onboarding/skills/setup-pr-review/SKILL.md +72 -0
- package/plugins/openhands/.plugin/plugin.json +13 -0
- package/plugins/openhands/README.md +52 -0
- package/plugins/openhands/SKILL.md +61 -0
- package/plugins/openhands/commands/create.md +55 -0
- package/plugins/openhands/commands/openhands-cloud.md +8 -0
- package/plugins/openhands/scripts/run.sh +69 -0
- package/plugins/pr-review/.plugin/plugin.json +13 -0
- package/plugins/pr-review/README.md +393 -0
- package/plugins/pr-review/action.yml +298 -0
- package/plugins/pr-review/scripts/agent_script.py +1282 -0
- package/plugins/pr-review/scripts/evaluate_review.py +655 -0
- package/plugins/pr-review/scripts/prompt.py +260 -0
- package/plugins/pr-review/workflows/pr-review-by-openhands.yml +51 -0
- package/plugins/pr-review/workflows/pr-review-evaluation.yml +85 -0
- package/plugins/qa-changes/.plugin/plugin.json +11 -0
- package/plugins/qa-changes/README.md +185 -0
- package/plugins/qa-changes/action.yml +181 -0
- package/plugins/qa-changes/scripts/agent_script.py +406 -0
- package/plugins/qa-changes/scripts/evaluate_qa_changes.py +385 -0
- package/plugins/qa-changes/scripts/prompt.py +174 -0
- package/plugins/qa-changes/workflows/qa-changes-by-openhands.yml +50 -0
- package/plugins/qa-changes/workflows/qa-changes-evaluation.yml +85 -0
- package/plugins/release-notes/.plugin/plugin.json +19 -0
- package/plugins/release-notes/README.md +283 -0
- package/plugins/release-notes/SKILL.md +83 -0
- package/plugins/release-notes/action.yml +117 -0
- package/plugins/release-notes/commands/release-notes.md +8 -0
- package/plugins/release-notes/scripts/agent_script.py +292 -0
- package/plugins/release-notes/scripts/generate_release_notes.py +733 -0
- package/plugins/release-notes/scripts/prompt.py +90 -0
- package/plugins/release-notes/scripts/validate_release_notes.py +328 -0
- package/plugins/release-notes/workflows/release-notes.yml +76 -0
- package/plugins/vulnerability-remediation/.plugin/plugin.json +19 -0
- package/plugins/vulnerability-remediation/README.md +217 -0
- package/plugins/vulnerability-remediation/action.yml +187 -0
- package/plugins/vulnerability-remediation/scripts/scan_and_remediate.py +561 -0
- package/plugins/vulnerability-remediation/workflows/vulnerability-scan.yml +87 -0
- package/pyproject.toml +12 -0
- package/release-please-config.json +16 -0
- package/scripts/sync_extensions.py +494 -0
- package/scripts/sync_openhands_sdk_skill.py +264 -0
- package/skills/README.md +159 -0
- package/skills/add-javadoc/.plugin/plugin.json +18 -0
- package/skills/add-javadoc/README.md +40 -0
- package/skills/add-javadoc/SKILL.md +35 -0
- package/skills/add-javadoc/references/example.md +32 -0
- package/skills/add-skill/.plugin/plugin.json +18 -0
- package/skills/add-skill/README.md +67 -0
- package/skills/add-skill/SKILL.md +47 -0
- package/skills/add-skill/scripts/fetch_skill.py +259 -0
- package/skills/agent-creator/.plugin/plugin.json +20 -0
- package/skills/agent-creator/README.md +104 -0
- package/skills/agent-creator/SKILL.md +190 -0
- package/skills/agent-creator/commands/agent-creator.md +8 -0
- package/skills/agent-creator/references/fallback.md +117 -0
- package/skills/agent-memory/.plugin/plugin.json +18 -0
- package/skills/agent-memory/README.md +35 -0
- package/skills/agent-memory/SKILL.md +30 -0
- package/skills/agent-memory/commands/remember.md +8 -0
- package/skills/agent-sdk-builder/.plugin/plugin.json +18 -0
- package/skills/agent-sdk-builder/README.md +40 -0
- package/skills/agent-sdk-builder/SKILL.md +37 -0
- package/skills/agent-sdk-builder/commands/agent-builder.md +8 -0
- package/skills/azure-devops/.plugin/plugin.json +18 -0
- package/skills/azure-devops/README.md +55 -0
- package/skills/azure-devops/SKILL.md +50 -0
- package/skills/bitbucket/.plugin/plugin.json +17 -0
- package/skills/bitbucket/README.md +50 -0
- package/skills/bitbucket/SKILL.md +45 -0
- package/skills/code-review/.plugin/plugin.json +19 -0
- package/skills/code-review/README.md +18 -0
- package/skills/code-review/SKILL.md +208 -0
- package/skills/code-review/commands/codereview-roasted.md +8 -0
- package/skills/code-review/commands/codereview.md +8 -0
- package/skills/code-review/references/risk-evaluation.md +41 -0
- package/skills/code-review/references/supply-chain-security.md +31 -0
- package/skills/code-simplifier/.plugin/plugin.json +21 -0
- package/skills/code-simplifier/README.md +30 -0
- package/skills/code-simplifier/SKILL.md +91 -0
- package/skills/code-simplifier/commands/simplify.md +8 -0
- package/skills/code-simplifier/references/code-quality-review.md +86 -0
- package/skills/code-simplifier/references/code-reuse-review.md +63 -0
- package/skills/code-simplifier/references/efficiency-review.md +81 -0
- package/skills/datadog/.plugin/plugin.json +19 -0
- package/skills/datadog/README.md +100 -0
- package/skills/datadog/SKILL.md +95 -0
- package/skills/deno/.plugin/plugin.json +18 -0
- package/skills/deno/README.md +5 -0
- package/skills/deno/SKILL.md +99 -0
- package/skills/deno/references/README.md +6 -0
- package/skills/discord/.plugin/plugin.json +18 -0
- package/skills/discord/README.md +31 -0
- package/skills/discord/SKILL.md +109 -0
- package/skills/discord/__init__.py +0 -0
- package/skills/discord/references/REFERENCE.md +78 -0
- package/skills/discord/scripts/__init__.py +0 -0
- package/skills/discord/scripts/_http.py +127 -0
- package/skills/discord/scripts/post_webhook.py +106 -0
- package/skills/discord/scripts/send_message.py +102 -0
- package/skills/docker/.plugin/plugin.json +17 -0
- package/skills/docker/README.md +34 -0
- package/skills/docker/SKILL.md +29 -0
- package/skills/evidence-based-citations/.plugin/plugin.json +20 -0
- package/skills/evidence-based-citations/README.md +31 -0
- package/skills/evidence-based-citations/SKILL.md +59 -0
- package/skills/flarglebargle/.plugin/plugin.json +16 -0
- package/skills/flarglebargle/README.md +14 -0
- package/skills/flarglebargle/SKILL.md +9 -0
- package/skills/frontend-design/.plugin/plugin.json +21 -0
- package/skills/frontend-design/LICENSE.txt +177 -0
- package/skills/frontend-design/README.md +42 -0
- package/skills/frontend-design/SKILL.md +42 -0
- package/skills/github/.plugin/plugin.json +19 -0
- package/skills/github/README.md +42 -0
- package/skills/github/SKILL.md +106 -0
- package/skills/github-pr-review/.plugin/plugin.json +18 -0
- package/skills/github-pr-review/README.md +145 -0
- package/skills/github-pr-review/SKILL.md +148 -0
- package/skills/github-pr-review/commands/github-pr-review.md +8 -0
- package/skills/github-pr-reviewer/.plugin/plugin.json +20 -0
- package/skills/github-pr-reviewer/README.md +34 -0
- package/skills/github-pr-reviewer/SKILL.md +89 -0
- package/skills/github-pr-reviewer/commands/pr-reviewer:setup.md +8 -0
- package/skills/github-repo-monitor/.plugin/plugin.json +22 -0
- package/skills/github-repo-monitor/README.md +70 -0
- package/skills/github-repo-monitor/SKILL.md +316 -0
- package/skills/github-repo-monitor/commands/github-monitor:poll.md +8 -0
- package/skills/github-repo-monitor/references/github-api.md +241 -0
- package/skills/github-repo-monitor/references/state-schema.md +160 -0
- package/skills/github-repo-monitor/scripts/main.py +915 -0
- package/skills/github-repo-monitor/tests/test_main.py +400 -0
- package/skills/gitlab/.plugin/plugin.json +17 -0
- package/skills/gitlab/README.md +37 -0
- package/skills/gitlab/SKILL.md +32 -0
- package/skills/incident-retrospective/.plugin/plugin.json +21 -0
- package/skills/incident-retrospective/README.md +34 -0
- package/skills/incident-retrospective/SKILL.md +98 -0
- package/skills/incident-retrospective/commands/incident-retro:setup.md +8 -0
- package/skills/iterate/.plugin/plugin.json +13 -0
- package/skills/iterate/README.md +25 -0
- package/skills/iterate/SKILL.md +399 -0
- package/skills/iterate/commands/babysit.md +8 -0
- package/skills/iterate/commands/iterate.md +8 -0
- package/skills/iterate/commands/verify.md +8 -0
- package/skills/iterate/references/heuristics.md +58 -0
- package/skills/iterate/references/verification.md +96 -0
- package/skills/jupyter/.plugin/plugin.json +18 -0
- package/skills/jupyter/README.md +55 -0
- package/skills/jupyter/SKILL.md +50 -0
- package/skills/kubernetes/.plugin/plugin.json +18 -0
- package/skills/kubernetes/README.md +53 -0
- package/skills/kubernetes/SKILL.md +48 -0
- package/skills/learn-from-code-review/.plugin/plugin.json +19 -0
- package/skills/learn-from-code-review/README.md +64 -0
- package/skills/learn-from-code-review/SKILL.md +186 -0
- package/skills/learn-from-code-review/commands/learn-from-reviews.md +8 -0
- package/skills/linear/.plugin/plugin.json +19 -0
- package/skills/linear/README.md +58 -0
- package/skills/linear/SKILL.md +213 -0
- package/skills/linear-triage/.plugin/plugin.json +21 -0
- package/skills/linear-triage/README.md +34 -0
- package/skills/linear-triage/SKILL.md +91 -0
- package/skills/linear-triage/commands/linear-triage:setup.md +8 -0
- package/skills/notion/.plugin/plugin.json +17 -0
- package/skills/notion/README.md +114 -0
- package/skills/notion/SKILL.md +109 -0
- package/skills/npm/.plugin/plugin.json +17 -0
- package/skills/npm/README.md +14 -0
- package/skills/npm/SKILL.md +9 -0
- package/skills/openhands-api/.plugin/plugin.json +22 -0
- package/skills/openhands-api/README.md +48 -0
- package/skills/openhands-api/SKILL.md +399 -0
- package/skills/openhands-api/references/README.md +33 -0
- package/skills/openhands-api/references/TROUBLESHOOTING.md +81 -0
- package/skills/openhands-api/references/example_prompt.md +12 -0
- package/skills/openhands-api/scripts/openhands_api.py +606 -0
- package/skills/openhands-api/scripts/openhands_api.ts +252 -0
- package/skills/openhands-automation/.plugin/plugin.json +19 -0
- package/skills/openhands-automation/README.md +89 -0
- package/skills/openhands-automation/SKILL.md +875 -0
- package/skills/openhands-automation/commands/automation:create.md +8 -0
- package/skills/openhands-automation/references/ab-testing.md +185 -0
- package/skills/openhands-automation/references/custom-automation.md +644 -0
- package/skills/openhands-sdk/.plugin/plugin.json +20 -0
- package/skills/openhands-sdk/README.md +22 -0
- package/skills/openhands-sdk/SKILL.md +229 -0
- package/skills/openhands-sdk/commands/sdk.md +8 -0
- package/skills/pdflatex/.plugin/plugin.json +18 -0
- package/skills/pdflatex/README.md +39 -0
- package/skills/pdflatex/SKILL.md +34 -0
- package/skills/prd/.plugin/plugin.json +19 -0
- package/skills/prd/README.md +28 -0
- package/skills/prd/SKILL.md +237 -0
- package/skills/prd/commands/prd.md +8 -0
- package/skills/qa-changes/README.md +18 -0
- package/skills/qa-changes/SKILL.md +229 -0
- package/skills/qa-changes/commands/qa-changes.md +8 -0
- package/skills/release-notes/README.md +24 -0
- package/skills/release-notes/SKILL.md +19 -0
- package/skills/release-notes/commands/release-notes.md +8 -0
- package/skills/research-brief/.plugin/plugin.json +20 -0
- package/skills/research-brief/README.md +34 -0
- package/skills/research-brief/SKILL.md +99 -0
- package/skills/research-brief/commands/research-brief:setup.md +8 -0
- package/skills/security/.plugin/plugin.json +18 -0
- package/skills/security/README.md +38 -0
- package/skills/security/SKILL.md +33 -0
- package/skills/skill-creator/.plugin/plugin.json +17 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/README.md +182 -0
- package/skills/skill-creator/SKILL.md +545 -0
- package/skills/skill-creator/references/output-patterns.md +82 -0
- package/skills/skill-creator/references/workflows.md +28 -0
- package/skills/skill-creator/scripts/init_skill.py +303 -0
- package/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/skills/slack-channel-monitor/.plugin/plugin.json +21 -0
- package/skills/slack-channel-monitor/README.md +91 -0
- package/skills/slack-channel-monitor/SKILL.md +276 -0
- package/skills/slack-channel-monitor/commands/slack-monitor:poll.md +8 -0
- package/skills/slack-channel-monitor/references/slack-api.md +207 -0
- package/skills/slack-channel-monitor/references/state-schema.md +180 -0
- package/skills/slack-channel-monitor/scripts/main.py +962 -0
- package/skills/slack-standup-digest/.plugin/plugin.json +21 -0
- package/skills/slack-standup-digest/README.md +34 -0
- package/skills/slack-standup-digest/SKILL.md +92 -0
- package/skills/slack-standup-digest/commands/standup-digest:setup.md +8 -0
- package/skills/spark-version-upgrade/.plugin/plugin.json +20 -0
- package/skills/spark-version-upgrade/README.md +54 -0
- package/skills/spark-version-upgrade/SKILL.md +233 -0
- package/skills/ssh/.plugin/plugin.json +18 -0
- package/skills/ssh/README.md +140 -0
- package/skills/ssh/SKILL.md +135 -0
- package/skills/swift-linux/.plugin/plugin.json +17 -0
- package/skills/swift-linux/README.md +86 -0
- package/skills/swift-linux/SKILL.md +81 -0
- package/skills/theme-factory/.plugin/plugin.json +19 -0
- package/skills/theme-factory/LICENSE.txt +202 -0
- package/skills/theme-factory/README.md +58 -0
- package/skills/theme-factory/SKILL.md +59 -0
- package/skills/theme-factory/theme-showcase.pdf +0 -0
- package/skills/theme-factory/themes/arctic-frost.md +19 -0
- package/skills/theme-factory/themes/botanical-garden.md +19 -0
- package/skills/theme-factory/themes/desert-rose.md +19 -0
- package/skills/theme-factory/themes/forest-canopy.md +19 -0
- package/skills/theme-factory/themes/golden-hour.md +19 -0
- package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
- package/skills/theme-factory/themes/modern-minimalist.md +19 -0
- package/skills/theme-factory/themes/ocean-depths.md +19 -0
- package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
- package/skills/theme-factory/themes/tech-innovation.md +19 -0
- package/skills/uv/.plugin/plugin.json +18 -0
- package/skills/uv/README.md +5 -0
- package/skills/uv/SKILL.md +95 -0
- package/skills/uv/references/README.md +5 -0
- package/skills/vercel/.plugin/plugin.json +18 -0
- package/skills/vercel/README.md +108 -0
- package/skills/vercel/SKILL.md +103 -0
- package/tests/test_add_skill_installs_to_agents_dir.py +42 -0
- package/tests/test_catalogs.py +109 -0
- package/tests/test_code_review_risk_evaluation.py +94 -0
- package/tests/test_issue_duplicate_checker.py +240 -0
- package/tests/test_openhands_api_python.py +152 -0
- package/tests/test_plugin_manifest.py +83 -0
- package/tests/test_pr_review_diff_payload.py +202 -0
- package/tests/test_pr_review_feedback.py +263 -0
- package/tests/test_pr_review_prompt.py +152 -0
- package/tests/test_pr_review_review_context.py +253 -0
- package/tests/test_qa_changes.py +232 -0
- package/tests/test_qa_changes_evaluation.py +259 -0
- package/tests/test_release_notes_generator.py +990 -0
- package/tests/test_sdk_loading.py +150 -0
- package/tests/test_skill_plugin_loading.py +149 -0
- package/tests/test_skills_have_readme.py +66 -0
- package/tests/test_sync_extensions.py +292 -0
- package/tests/test_workflow_sync.py +46 -0
- package/utils/analysis/README.md +7 -0
- package/utils/analysis/laminar_signals/README.md +211 -0
- package/utils/analysis/laminar_signals/analyze.py +780 -0
- package/utils/analysis/laminar_signals/templates/default.j2 +49 -0
- package/utils/analysis/laminar_signals/templates/pr_review.j2 +61 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: linear
|
|
3
|
+
description: Interact with Linear project management - query issues, update status, create tickets, and manage workflows using the Linear GraphQL API. Use when working with Linear tickets, sprints, or project tracking.
|
|
4
|
+
triggers:
|
|
5
|
+
- linear
|
|
6
|
+
- ticket
|
|
7
|
+
- issue tracking
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Linear
|
|
11
|
+
|
|
12
|
+
<IMPORTANT>
|
|
13
|
+
Before performing any Linear operations, check if the required environment variable is set:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
[ -n "$LINEAR_API_KEY" ] && echo "LINEAR_API_KEY is set" || echo "LINEAR_API_KEY is NOT set"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
If LINEAR_API_KEY is missing, ask the user to provide it before proceeding.
|
|
20
|
+
</IMPORTANT>
|
|
21
|
+
|
|
22
|
+
## Understanding Linear Identifiers
|
|
23
|
+
|
|
24
|
+
Linear uses two types of identifiers for issues:
|
|
25
|
+
|
|
26
|
+
- **Human-readable identifier** (e.g., `ALL-1234`): Displayed to users, used in search queries. This is the team key + number.
|
|
27
|
+
- **UUID** (e.g., `a1b2c3d4-e5f6-7890-abcd-ef1234567890`): Required for all mutations (update, comment, etc.). Returned as `id` in query results.
|
|
28
|
+
|
|
29
|
+
**Important workflow**: When working with issues, you must:
|
|
30
|
+
1. Search or query using the human-readable identifier
|
|
31
|
+
2. Extract the `id` (UUID) from the query result
|
|
32
|
+
3. Use the UUID in any mutation operations
|
|
33
|
+
|
|
34
|
+
## Authentication
|
|
35
|
+
|
|
36
|
+
All Linear API requests use GraphQL with the API key in the Authorization header:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
40
|
+
-H "Content-Type: application/json" \
|
|
41
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
42
|
+
-d '{"query": "YOUR_GRAPHQL_QUERY"}'
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Common Queries
|
|
46
|
+
|
|
47
|
+
### Get Assigned Issues (Open)
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
51
|
+
-H "Content-Type: application/json" \
|
|
52
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
53
|
+
-d '{
|
|
54
|
+
"query": "query { viewer { assignedIssues(first: 50, filter: { state: { type: { nin: [\"completed\", \"canceled\"] } } }) { nodes { id identifier title priority priorityLabel state { name type } description createdAt updatedAt } } } }"
|
|
55
|
+
}' | jq '.data.viewer.assignedIssues.nodes'
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Get Issues by Priority
|
|
59
|
+
|
|
60
|
+
Priority values: 0 = No priority, 1 = Urgent, 2 = High, 3 = Medium, 4 = Low
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
64
|
+
-H "Content-Type: application/json" \
|
|
65
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
66
|
+
-d '{
|
|
67
|
+
"query": "query { viewer { assignedIssues(first: 50, filter: { priority: { lte: 2 }, state: { type: { nin: [\"completed\", \"canceled\"] } } }) { nodes { id identifier title priority priorityLabel state { name } } } } }"
|
|
68
|
+
}' | jq '.data.viewer.assignedIssues.nodes'
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Get Issue Details
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
75
|
+
-H "Content-Type: application/json" \
|
|
76
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
77
|
+
-d '{
|
|
78
|
+
"query": "query { issue(id: \"ISSUE_UUID\") { id identifier title description state { name } priority assignee { name email } labels { nodes { name } } comments { nodes { body createdAt user { name } } } } }"
|
|
79
|
+
}' | jq '.data.issue'
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Search Issues by Identifier
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
86
|
+
-H "Content-Type: application/json" \
|
|
87
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
88
|
+
-d '{
|
|
89
|
+
"query": "query { issueSearch(query: \"ALL-1234\", first: 5) { nodes { id identifier title state { name } } } }"
|
|
90
|
+
}' | jq '.data.issueSearch.nodes'
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Common Mutations
|
|
94
|
+
|
|
95
|
+
### Update Issue State
|
|
96
|
+
|
|
97
|
+
First, get available workflow states:
|
|
98
|
+
```bash
|
|
99
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
100
|
+
-H "Content-Type: application/json" \
|
|
101
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
102
|
+
-d '{
|
|
103
|
+
"query": "query { workflowStates { nodes { id name type } } }"
|
|
104
|
+
}' | jq '.data.workflowStates.nodes'
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Then update the issue:
|
|
108
|
+
```bash
|
|
109
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
110
|
+
-H "Content-Type: application/json" \
|
|
111
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
112
|
+
-d '{
|
|
113
|
+
"query": "mutation { issueUpdate(id: \"ISSUE_UUID\", input: { stateId: \"STATE_UUID\" }) { success issue { identifier state { name } } } }"
|
|
114
|
+
}' | jq '.data.issueUpdate'
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Add Comment to Issue
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
121
|
+
-H "Content-Type: application/json" \
|
|
122
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
123
|
+
-d '{
|
|
124
|
+
"query": "mutation { commentCreate(input: { issueId: \"ISSUE_UUID\", body: \"Your comment here\" }) { success comment { id body } } }"
|
|
125
|
+
}' | jq '.data.commentCreate'
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Create New Issue
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
132
|
+
-H "Content-Type: application/json" \
|
|
133
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
134
|
+
-d '{
|
|
135
|
+
"query": "mutation { issueCreate(input: { teamId: \"TEAM_UUID\", title: \"Issue Title\", description: \"Issue description\", priority: 2 }) { success issue { identifier title url } } }"
|
|
136
|
+
}' | jq '.data.issueCreate'
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## End-to-End Workflow: Move Issue to "In Progress"
|
|
140
|
+
|
|
141
|
+
This example shows the complete flow to change an issue's state using its human-readable identifier:
|
|
142
|
+
|
|
143
|
+
### Step 1: Search for the issue to get its UUID
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# Search for issue ALL-1234 and extract its UUID
|
|
147
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
148
|
+
-H "Content-Type: application/json" \
|
|
149
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
150
|
+
-d '{
|
|
151
|
+
"query": "query { issueSearch(query: \"ALL-1234\", first: 1) { nodes { id identifier title state { name } } } }"
|
|
152
|
+
}' | jq '.data.issueSearch.nodes[0]'
|
|
153
|
+
# Save the "id" value (UUID) from the response
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Step 2: Get available workflow states
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# List all workflow states to find the "In Progress" state UUID
|
|
160
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
161
|
+
-H "Content-Type: application/json" \
|
|
162
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
163
|
+
-d '{
|
|
164
|
+
"query": "query { workflowStates { nodes { id name type } } }"
|
|
165
|
+
}' | jq '.data.workflowStates.nodes[] | select(.name == "In Progress")'
|
|
166
|
+
# Save the "id" value of the desired state
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Step 3: Update the issue state
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
# Use the issue UUID and state UUID from previous steps
|
|
173
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
174
|
+
-H "Content-Type: application/json" \
|
|
175
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
176
|
+
-d '{
|
|
177
|
+
"query": "mutation { issueUpdate(id: \"ISSUE_UUID_FROM_STEP_1\", input: { stateId: \"STATE_UUID_FROM_STEP_2\" }) { success issue { identifier state { name } } } }"
|
|
178
|
+
}' | jq '.data.issueUpdate'
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Get Team Information
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
curl -s -X POST https://api.linear.app/graphql \
|
|
185
|
+
-H "Content-Type: application/json" \
|
|
186
|
+
-H "Authorization: $LINEAR_API_KEY" \
|
|
187
|
+
-d '{
|
|
188
|
+
"query": "query { teams { nodes { id name key } } }"
|
|
189
|
+
}' | jq '.data.teams.nodes'
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Priority Levels
|
|
193
|
+
|
|
194
|
+
| Priority | Label | Recommended Action |
|
|
195
|
+
|----------|-------|-------------------|
|
|
196
|
+
| 1 | Urgent | Work on immediately |
|
|
197
|
+
| 2 | High | Work on first |
|
|
198
|
+
| 3 | Medium | Normal priority |
|
|
199
|
+
| 4 | Low | When time permits |
|
|
200
|
+
| 0 | None | Backlog |
|
|
201
|
+
|
|
202
|
+
## State Types
|
|
203
|
+
|
|
204
|
+
- `backlog` - Not yet started
|
|
205
|
+
- `unstarted` - Todo
|
|
206
|
+
- `started` - In Progress
|
|
207
|
+
- `completed` - Done
|
|
208
|
+
- `canceled` - Won't do
|
|
209
|
+
|
|
210
|
+
## Documentation
|
|
211
|
+
|
|
212
|
+
- [Linear API Documentation](https://developers.linear.app/docs/graphql/working-with-the-graphql-api)
|
|
213
|
+
- [GraphQL Schema Reference](https://studio.apollographql.com/public/Linear-API/variant/current/schema/reference)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "linear-triage",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Create an automation that triages new Linear issues by inspecting title, description, team, and recent related issues. Suggests labels, priority, likely owner, and potential duplicates, then posts a clarifying comment.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "OpenHands",
|
|
7
|
+
"email": "contact@all-hands.dev"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/OpenHands/extensions",
|
|
10
|
+
"repository": "https://github.com/OpenHands/extensions",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"linear",
|
|
14
|
+
"triage",
|
|
15
|
+
"issues",
|
|
16
|
+
"labels",
|
|
17
|
+
"priority",
|
|
18
|
+
"automation",
|
|
19
|
+
"integration"
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Linear Issue Triage
|
|
2
|
+
|
|
3
|
+
Create an automation that triages new Linear issues with labels, priority, and owner suggestions.
|
|
4
|
+
|
|
5
|
+
## Triggers
|
|
6
|
+
|
|
7
|
+
This skill is activated by keywords:
|
|
8
|
+
|
|
9
|
+
- `triage Linear issues`
|
|
10
|
+
- `auto-label Linear`
|
|
11
|
+
- `Linear triage automation`
|
|
12
|
+
|
|
13
|
+
## Features
|
|
14
|
+
|
|
15
|
+
- **Inspects issue title, description, team, and customer context**
|
|
16
|
+
- **Suggests labels, priority, and likely owner**
|
|
17
|
+
- **Detects potential duplicate issues**
|
|
18
|
+
- **Posts a triage comment with rationale**
|
|
19
|
+
- **Configurable**: auto-apply changes or suggest for approval
|
|
20
|
+
|
|
21
|
+
## Prerequisites
|
|
22
|
+
|
|
23
|
+
Linear MCP installed in Settings → MCP
|
|
24
|
+
|
|
25
|
+
## Quick Start
|
|
26
|
+
|
|
27
|
+
Ask OpenHands:
|
|
28
|
+
|
|
29
|
+
> "Set up a triage automation for the Engineering team in Linear that
|
|
30
|
+
> suggests labels and priority for new issues"
|
|
31
|
+
|
|
32
|
+
## See Also
|
|
33
|
+
|
|
34
|
+
- [SKILL.md](SKILL.md) — Full setup workflow reference
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: linear-triage
|
|
3
|
+
description: >
|
|
4
|
+
Create an automation that triages new Linear issues. Inspects the issue
|
|
5
|
+
title, description, team, customer, priority, and recent related issues via
|
|
6
|
+
Linear MCP. Suggests labels, priority, likely owner, duplicates, and posts
|
|
7
|
+
a clarifying comment.
|
|
8
|
+
triggers:
|
|
9
|
+
- /linear-triage:setup
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Linear Issue Triage Automation
|
|
13
|
+
|
|
14
|
+
Set up an automation that triages new Linear issues — classifying, labeling,
|
|
15
|
+
and suggesting owners automatically.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Prerequisites
|
|
20
|
+
|
|
21
|
+
### Required integration
|
|
22
|
+
|
|
23
|
+
- **Linear MCP** must be installed in Settings → MCP.
|
|
24
|
+
|
|
25
|
+
### Information to collect
|
|
26
|
+
|
|
27
|
+
Ask the user for:
|
|
28
|
+
|
|
29
|
+
1. **Teams/projects** — which Linear teams or projects should be triaged (e.g. `Engineering`, `Support`)
|
|
30
|
+
2. **Label taxonomy** — what labels are used for classification? (e.g. `bug`, `feature`, `support`, `chore`)
|
|
31
|
+
3. **Priority conventions** — how does the team use priority levels? Any mapping rules?
|
|
32
|
+
4. **Auto-apply or suggest** — should the automation apply labels/priority/assignee directly, or post a triage comment with suggestions for human approval?
|
|
33
|
+
5. **Duplicate detection** — should it search for and flag potential duplicate issues?
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Setup Workflow
|
|
38
|
+
|
|
39
|
+
### Step 1 — Verify Linear MCP access
|
|
40
|
+
|
|
41
|
+
Confirm the Linear MCP integration is working:
|
|
42
|
+
```
|
|
43
|
+
Use the Linear MCP to list recent issues for one of the target teams.
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
If it fails, tell the user to install the Linear MCP integration first.
|
|
47
|
+
|
|
48
|
+
### Step 2 — Determine trigger type
|
|
49
|
+
|
|
50
|
+
**Event-based (recommended if publicly reachable):**
|
|
51
|
+
Check `<RUNTIME_SERVICES>` for deployment reachability. If public, recommend an event trigger on Linear `Issue` create events.
|
|
52
|
+
|
|
53
|
+
**Cron-based (local/private deployments):**
|
|
54
|
+
Poll for recently created issues on a schedule (e.g. every 5 minutes).
|
|
55
|
+
|
|
56
|
+
### Step 3 — Build the triage prompt
|
|
57
|
+
|
|
58
|
+
Construct a prompt that includes:
|
|
59
|
+
- Target teams/projects
|
|
60
|
+
- Label taxonomy and classification rules
|
|
61
|
+
- Priority mapping conventions
|
|
62
|
+
- Whether to auto-apply or suggest
|
|
63
|
+
- Duplicate detection preference
|
|
64
|
+
|
|
65
|
+
### Step 4 — Create the automation
|
|
66
|
+
|
|
67
|
+
Read the Automation backend URL and auth from `<RUNTIME_SERVICES>`:
|
|
68
|
+
- Use the **Automation backend** `url_from_agent` as `OPENHANDS_HOST`
|
|
69
|
+
- Auth: `X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY`
|
|
70
|
+
|
|
71
|
+
Use the **prompt preset** endpoint:
|
|
72
|
+
```bash
|
|
73
|
+
curl -s -X POST "${OPENHANDS_HOST}/api/automation/v1/preset/prompt" \
|
|
74
|
+
-H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" \
|
|
75
|
+
-H "Content-Type: application/json" \
|
|
76
|
+
-d '{
|
|
77
|
+
"name": "Linear Issue Triage",
|
|
78
|
+
"prompt": "<constructed triage prompt>",
|
|
79
|
+
"trigger": <trigger config from step 2>
|
|
80
|
+
}'
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Step 5 — Confirm
|
|
84
|
+
|
|
85
|
+
Tell the user:
|
|
86
|
+
> ✅ **Linear Issue Triage** is running!
|
|
87
|
+
>
|
|
88
|
+
> - Automation ID: `{id}`
|
|
89
|
+
> - Teams: `{team list}`
|
|
90
|
+
> - Mode: `{auto-apply or suggest}`
|
|
91
|
+
> - Trigger: `{trigger description}`
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
# auto-generated by sync_extensions.py
|
|
3
|
+
description: Create an automation that triages new Linear issues. Inspects the issue title, description, team, customer, priority, and recent related issues via Linear MCP. Suggests labels, priority, likely owner, duplicates, and posts a clarifying comment.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Read and follow the complete instructions in the SKILL.md file located in this skill's directory.
|
|
7
|
+
|
|
8
|
+
$ARGUMENTS
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "notion",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Create, search, and update Notion pages/databases using the Notion API. Use for documenting work, generating runbooks, and automating knowledge base updates.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "OpenHands",
|
|
7
|
+
"email": "contact@all-hands.dev"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/OpenHands/extensions",
|
|
10
|
+
"repository": "https://github.com/OpenHands/extensions",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"notion",
|
|
14
|
+
"documentation",
|
|
15
|
+
"knowledge-base"
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Notion
|
|
2
|
+
|
|
3
|
+
Create, search, and update Notion pages/databases using the Notion API. Use for documenting work, generating runbooks, and automating knowledge base updates.
|
|
4
|
+
|
|
5
|
+
## Triggers
|
|
6
|
+
|
|
7
|
+
This skill is activated by the following keywords:
|
|
8
|
+
|
|
9
|
+
- `notion`
|
|
10
|
+
|
|
11
|
+
## Details
|
|
12
|
+
|
|
13
|
+
# Notion
|
|
14
|
+
|
|
15
|
+
<IMPORTANT>
|
|
16
|
+
If authenticated Notion MCP tools are available in the environment, use them first. MCP tools do not require passing `NOTION_INTEGRATION_KEY` as a tool argument; authentication is handled by the configured MCP integration.
|
|
17
|
+
|
|
18
|
+
Use the direct Notion REST API examples below only when MCP is unavailable or when you explicitly need raw API/curl access. For that direct-API path, first check whether the required environment variable is set:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
[ -n "$NOTION_INTEGRATION_KEY" ] && echo "NOTION_INTEGRATION_KEY is set" || echo "NOTION_INTEGRATION_KEY is NOT set"
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
If it’s missing and you need the direct API path, ask the user to provide it (or connect a Notion integration) before proceeding:
|
|
25
|
+
- **NOTION_INTEGRATION_KEY**: Notion integration secret (starts with `ntn_...`)
|
|
26
|
+
|
|
27
|
+
Whether you use MCP or the direct API, also confirm the configured integration has been **shared** with the target page/database in Notion.
|
|
28
|
+
</IMPORTANT>
|
|
29
|
+
|
|
30
|
+
## Base headers for direct API calls
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
-H "Authorization: Bearer ${NOTION_INTEGRATION_KEY}" \
|
|
34
|
+
-H "Notion-Version: 2022-06-28" \
|
|
35
|
+
-H "Content-Type: application/json"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Find a page (search)
|
|
39
|
+
|
|
40
|
+
Use Notion’s search endpoint to find a page by title.
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
curl -s https://api.notion.com/v1/search \
|
|
44
|
+
-H "Authorization: Bearer ${NOTION_INTEGRATION_KEY}" \
|
|
45
|
+
-H "Notion-Version: 2022-06-28" \
|
|
46
|
+
-H "Content-Type: application/json" \
|
|
47
|
+
-d '{
|
|
48
|
+
"query": "OpenHands Wiki",
|
|
49
|
+
"page_size": 10
|
|
50
|
+
}' | jq .
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Create a page under a parent page
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
PARENT_PAGE_ID="<parent_page_id>"
|
|
57
|
+
|
|
58
|
+
curl -s https://api.notion.com/v1/pages \
|
|
59
|
+
-H "Authorization: Bearer ${NOTION_INTEGRATION_KEY}" \
|
|
60
|
+
-H "Notion-Version: 2022-06-28" \
|
|
61
|
+
-H "Content-Type: application/json" \
|
|
62
|
+
-d '{
|
|
63
|
+
"parent": {"type": "page_id", "page_id": "'"${PARENT_PAGE_ID}"'"},
|
|
64
|
+
"properties": {
|
|
65
|
+
"title": {
|
|
66
|
+
"title": [{"type": "text", "text": {"content": "My new page"}}]
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"children": [
|
|
70
|
+
{
|
|
71
|
+
"object": "block",
|
|
72
|
+
"type": "paragraph",
|
|
73
|
+
"paragraph": {
|
|
74
|
+
"rich_text": [{"type": "text", "text": {"content": "Hello from OpenHands."}}]
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
}' | jq .
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Append blocks to an existing page
|
|
82
|
+
|
|
83
|
+
Use the page’s block id (same as page id) to append children.
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
PAGE_ID="<page_id>"
|
|
87
|
+
|
|
88
|
+
curl -s -X PATCH "https://api.notion.com/v1/blocks/${PAGE_ID}/children" \
|
|
89
|
+
-H "Authorization: Bearer ${NOTION_INTEGRATION_KEY}" \
|
|
90
|
+
-H "Notion-Version: 2022-06-28" \
|
|
91
|
+
-H "Content-Type: application/json" \
|
|
92
|
+
-d '{
|
|
93
|
+
"children": [
|
|
94
|
+
{
|
|
95
|
+
"object": "block",
|
|
96
|
+
"type": "heading_2",
|
|
97
|
+
"heading_2": {"rich_text": [{"type": "text", "text": {"content": "Appended section"}}]}
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}' | jq .
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Tips / gotchas
|
|
104
|
+
|
|
105
|
+
- **Sharing is required**: even with a valid key, the integration can’t see a page/database until it has been shared with the integration in the Notion UI.
|
|
106
|
+
- **Rate limits**: keep requests small; for large pages, create the page first and then append blocks in batches.
|
|
107
|
+
- **IDs format**: Notion IDs may be returned with dashes; both dashed and non-dashed forms typically work in API calls.
|
|
108
|
+
|
|
109
|
+
## Documentation
|
|
110
|
+
|
|
111
|
+
- Notion API: https://developers.notion.com/reference/intro
|
|
112
|
+
- Search: https://developers.notion.com/reference/post-search
|
|
113
|
+
- Create a page: https://developers.notion.com/reference/post-page
|
|
114
|
+
- Append block children: https://developers.notion.com/reference/patch-block-children
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: notion
|
|
3
|
+
description: Create, search, and update Notion pages/databases using the Notion API. Use for documenting work, generating runbooks, and automating knowledge base updates.
|
|
4
|
+
triggers:
|
|
5
|
+
- notion
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Notion
|
|
9
|
+
|
|
10
|
+
<IMPORTANT>
|
|
11
|
+
If authenticated Notion MCP tools are available in the environment, use them first. MCP tools do not require passing `NOTION_INTEGRATION_KEY` as a tool argument; authentication is handled by the configured MCP integration.
|
|
12
|
+
|
|
13
|
+
Use the direct Notion REST API examples below only when MCP is unavailable or when you explicitly need raw API/curl access. For that direct-API path, first check whether the required environment variable is set:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
[ -n "$NOTION_INTEGRATION_KEY" ] && echo "NOTION_INTEGRATION_KEY is set" || echo "NOTION_INTEGRATION_KEY is NOT set"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
If it’s missing and you need the direct API path, ask the user to provide it (or connect a Notion integration) before proceeding:
|
|
20
|
+
- **NOTION_INTEGRATION_KEY**: Notion integration secret (starts with `ntn_...`)
|
|
21
|
+
|
|
22
|
+
Whether you use MCP or the direct API, also confirm the configured integration has been **shared** with the target page/database in Notion.
|
|
23
|
+
</IMPORTANT>
|
|
24
|
+
|
|
25
|
+
## Base headers for direct API calls
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
-H "Authorization: Bearer ${NOTION_INTEGRATION_KEY}" \
|
|
29
|
+
-H "Notion-Version: 2022-06-28" \
|
|
30
|
+
-H "Content-Type: application/json"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Find a page (search)
|
|
34
|
+
|
|
35
|
+
Use Notion’s search endpoint to find a page by title.
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
curl -s https://api.notion.com/v1/search \
|
|
39
|
+
-H "Authorization: Bearer ${NOTION_INTEGRATION_KEY}" \
|
|
40
|
+
-H "Notion-Version: 2022-06-28" \
|
|
41
|
+
-H "Content-Type: application/json" \
|
|
42
|
+
-d '{
|
|
43
|
+
"query": "OpenHands Wiki",
|
|
44
|
+
"page_size": 10
|
|
45
|
+
}' | jq .
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Create a page under a parent page
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
PARENT_PAGE_ID="<parent_page_id>"
|
|
52
|
+
|
|
53
|
+
curl -s https://api.notion.com/v1/pages \
|
|
54
|
+
-H "Authorization: Bearer ${NOTION_INTEGRATION_KEY}" \
|
|
55
|
+
-H "Notion-Version: 2022-06-28" \
|
|
56
|
+
-H "Content-Type: application/json" \
|
|
57
|
+
-d '{
|
|
58
|
+
"parent": {"type": "page_id", "page_id": "'"${PARENT_PAGE_ID}"'"},
|
|
59
|
+
"properties": {
|
|
60
|
+
"title": {
|
|
61
|
+
"title": [{"type": "text", "text": {"content": "My new page"}}]
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"children": [
|
|
65
|
+
{
|
|
66
|
+
"object": "block",
|
|
67
|
+
"type": "paragraph",
|
|
68
|
+
"paragraph": {
|
|
69
|
+
"rich_text": [{"type": "text", "text": {"content": "Hello from OpenHands."}}]
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
}' | jq .
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Append blocks to an existing page
|
|
77
|
+
|
|
78
|
+
Use the page’s block id (same as page id) to append children.
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
PAGE_ID="<page_id>"
|
|
82
|
+
|
|
83
|
+
curl -s -X PATCH "https://api.notion.com/v1/blocks/${PAGE_ID}/children" \
|
|
84
|
+
-H "Authorization: Bearer ${NOTION_INTEGRATION_KEY}" \
|
|
85
|
+
-H "Notion-Version: 2022-06-28" \
|
|
86
|
+
-H "Content-Type: application/json" \
|
|
87
|
+
-d '{
|
|
88
|
+
"children": [
|
|
89
|
+
{
|
|
90
|
+
"object": "block",
|
|
91
|
+
"type": "heading_2",
|
|
92
|
+
"heading_2": {"rich_text": [{"type": "text", "text": {"content": "Appended section"}}]}
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
}' | jq .
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Tips / gotchas
|
|
99
|
+
|
|
100
|
+
- **Sharing is required**: even with a valid key, the integration can’t see a page/database until it has been shared with the integration in the Notion UI.
|
|
101
|
+
- **Rate limits**: keep requests small; for large pages, create the page first and then append blocks in batches.
|
|
102
|
+
- **IDs format**: Notion IDs may be returned with dashes; both dashed and non-dashed forms typically work in API calls.
|
|
103
|
+
|
|
104
|
+
## Documentation
|
|
105
|
+
|
|
106
|
+
- Notion API: https://developers.notion.com/reference/intro
|
|
107
|
+
- Search: https://developers.notion.com/reference/post-search
|
|
108
|
+
- Create a page: https://developers.notion.com/reference/post-page
|
|
109
|
+
- Append block children: https://developers.notion.com/reference/patch-block-children
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "npm",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Handle npm package installation in non-interactive environments by piping confirmations. Use when installing Node.js packages that require user confirmation prompts.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "OpenHands",
|
|
7
|
+
"email": "contact@all-hands.dev"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/OpenHands/extensions",
|
|
10
|
+
"repository": "https://github.com/OpenHands/extensions",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"npm",
|
|
14
|
+
"nodejs",
|
|
15
|
+
"packages"
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Npm
|
|
2
|
+
|
|
3
|
+
Handle npm package installation in non-interactive environments by piping confirmations. Use when installing Node.js packages that require user confirmation prompts.
|
|
4
|
+
|
|
5
|
+
## Triggers
|
|
6
|
+
|
|
7
|
+
This skill is activated by the following keywords:
|
|
8
|
+
|
|
9
|
+
- `npm`
|
|
10
|
+
|
|
11
|
+
## Details
|
|
12
|
+
|
|
13
|
+
When using npm to install packages, you will not be able to use an interactive shell, and it may be hard to confirm your actions.
|
|
14
|
+
As an alternative, you can pipe in the output of the unix "yes" command to confirm your actions.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: npm
|
|
3
|
+
description: Handle npm package installation in non-interactive environments by piping confirmations. Use when installing Node.js packages that require user confirmation prompts.
|
|
4
|
+
triggers:
|
|
5
|
+
- npm
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
When using npm to install packages, you will not be able to use an interactive shell, and it may be hard to confirm your actions.
|
|
9
|
+
As an alternative, you can pipe in the output of the unix "yes" command to confirm your actions.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "openhands-api",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Use the OpenHands Cloud REST API (V1) to create and manage app conversations, including multi-conversation delegation workflows, and to access sandbox agent-server endpoints. Includes minimal Pytho...",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "OpenHands",
|
|
7
|
+
"email": "contact@all-hands.dev"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/OpenHands/extensions",
|
|
10
|
+
"repository": "https://github.com/OpenHands/extensions",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"openhands",
|
|
14
|
+
"api",
|
|
15
|
+
"cloud",
|
|
16
|
+
"automation",
|
|
17
|
+
"delegation",
|
|
18
|
+
"agent-server",
|
|
19
|
+
"sandbox",
|
|
20
|
+
"conversations"
|
|
21
|
+
]
|
|
22
|
+
}
|