@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.
- package/.agents/skills/custom-codereview-guide.md +14 -12
- package/.claude-plugin/marketplace.json +14 -0
- package/.codex-plugin/marketplace.json +14 -0
- package/.github/workflows/check-extensions.yml +6 -6
- package/.github/workflows/deprecation-check.yml +1 -1
- package/.github/workflows/issue-readiness-check.yml +37 -106
- package/.github/workflows/npm-publish.yml +2 -2
- package/.github/workflows/pr-description-check.yml +1 -1
- package/.github/workflows/pypi-publish.yml +3 -3
- package/.github/workflows/tests.yml +2 -2
- package/.plugin/marketplace.json +14 -0
- package/.release-please-manifest.json +1 -1
- package/AGENTS.md +10 -1
- package/README.md +3 -2
- package/automations/bundle-index.js +2 -2
- package/automations/catalog/github-pr-reviewer/manifest.json +4 -4
- package/integrations/catalog/granola.json +38 -0
- package/integrations/catalog-index.js +16 -14
- package/marketplaces/openhands-extensions.json +14 -0
- package/package.json +1 -1
- package/pyproject.toml +2 -2
- package/python/openhands_extensions/_version.py +1 -1
- package/skills/add-skill/SKILL.md +5 -2
- package/skills/canvas-extension-api/.claude-plugin/plugin.json +19 -0
- package/skills/canvas-extension-api/.codex-plugin/plugin.json +19 -0
- package/skills/canvas-extension-api/.plugin/plugin.json +19 -0
- package/skills/canvas-extension-api/README.md +33 -0
- package/skills/canvas-extension-api/SKILL.md +254 -0
- package/skills/canvas-extension-api/references/acceptance-checklist.md +20 -0
- package/skills/canvas-extension-api/references/backend-safety.md +9 -0
- package/skills/canvas-extension-api/references/connections.md +126 -0
- package/skills/canvas-extension-api/references/packaging-recipes.md +43 -0
- package/skills/canvas-extension-api/references/sidecar-pattern.md +49 -0
- package/skills/canvas-extension-api/references/testing-and-installation.md +286 -0
- package/skills/canvas-extension-api/references/v1-contract.md +250 -0
- package/skills/canvas-extension-api/scripts/validate-extension.mjs +92 -0
- package/skills/canvas-extension-api/scripts/validate-extension.test.mjs +60 -0
- package/skills/github-pr-reviewer/README.md +6 -1
- package/skills/github-pr-reviewer/SKILL.md +24 -1
- package/skills/github-pr-reviewer/scripts/main.py +40 -11
- package/skills/github-pr-reviewer/scripts/worker.py +12 -3
- package/skills/github-pr-reviewer/tests/test_main.py +69 -0
- package/skills/index.js +11 -3
- package/tests/fixtures/automations/github-pr-reviewer.json +9 -9
- package/tests/test_github_reviewer_delivery.py +128 -1
- package/.github/scripts/check_issue_readiness.py +0 -272
- package/.github/scripts/post-readiness-comment.mjs +0 -184
- package/tests/test_check_issue_readiness.py +0 -135
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import importlib.util
|
|
4
|
-
import sys
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def _load_prod_module():
|
|
9
|
-
repo_root = Path(__file__).resolve().parents[1]
|
|
10
|
-
script_path = repo_root / ".github" / "scripts" / "check_issue_readiness.py"
|
|
11
|
-
name = "check_issue_readiness"
|
|
12
|
-
spec = importlib.util.spec_from_file_location(name, script_path)
|
|
13
|
-
assert spec and spec.loader
|
|
14
|
-
mod = importlib.util.module_from_spec(spec)
|
|
15
|
-
sys.modules[name] = mod
|
|
16
|
-
spec.loader.exec_module(mod)
|
|
17
|
-
return mod
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
_prod = _load_prod_module()
|
|
21
|
-
evaluate_readiness = _prod.evaluate_readiness
|
|
22
|
-
extract_sections = _prod.extract_sections
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
ENHANCEMENT_READY = """### Problem or Use Case
|
|
26
|
-
|
|
27
|
-
The integration catalog lacks a Linear entry.
|
|
28
|
-
|
|
29
|
-
### Desired Behavior
|
|
30
|
-
|
|
31
|
-
`integrations/catalog/linear.json` describes the Linear MCP server so the
|
|
32
|
-
catalog build picks it up.
|
|
33
|
-
|
|
34
|
-
### Acceptance Criteria
|
|
35
|
-
|
|
36
|
-
- [ ] `npm run build:integrations` succeeds with the new entry
|
|
37
|
-
- [ ] `getIntegrationCatalogEntry("linear")` returns the Linear catalog model
|
|
38
|
-
"""
|
|
39
|
-
|
|
40
|
-
BUG_READY = """### Actual Behavior
|
|
41
|
-
|
|
42
|
-
Running `uv run --group test pytest tests/` fails in
|
|
43
|
-
`test_skills_catalog.py` with a KeyError when a skill is missing from the
|
|
44
|
-
marketplace.
|
|
45
|
-
|
|
46
|
-
### Acceptance Criteria
|
|
47
|
-
|
|
48
|
-
- [ ] `uv run --group test pytest tests/` passes with a clear error message
|
|
49
|
-
"""
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def test_extract_sections_splits_on_headings():
|
|
53
|
-
sections = extract_sections("### Alpha\n\ntext\n\n### Beta\n\nmore\n")
|
|
54
|
-
assert sections["alpha"] == "\ntext\n\n"
|
|
55
|
-
assert sections["beta"] == "\nmore\n"
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def test_enhancement_ready_passes():
|
|
59
|
-
result = evaluate_readiness(ENHANCEMENT_READY, ["enhancement"])
|
|
60
|
-
assert result.ready is True
|
|
61
|
-
assert result.reasons == []
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def test_enhancement_missing_acceptance_criteria_fails():
|
|
65
|
-
body = "### Desired Behavior\n\nSome desired change.\n"
|
|
66
|
-
result = evaluate_readiness(body, ["enhancement"])
|
|
67
|
-
assert result.ready is False
|
|
68
|
-
assert any("Acceptance Criteria" in r for r in result.reasons)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
def test_enhancement_missing_desired_behavior_fails():
|
|
72
|
-
body = ENHANCEMENT_READY.replace(
|
|
73
|
-
"### Desired Behavior\n\n"
|
|
74
|
-
"`integrations/catalog/linear.json` describes the Linear MCP server so the\n"
|
|
75
|
-
"catalog build picks it up.\n\n",
|
|
76
|
-
"",
|
|
77
|
-
)
|
|
78
|
-
result = evaluate_readiness(body, ["enhancement"])
|
|
79
|
-
assert result.ready is False
|
|
80
|
-
assert any("Desired Behavior" in r for r in result.reasons)
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
def test_bug_ready_passes():
|
|
84
|
-
result = evaluate_readiness(BUG_READY, ["bug"])
|
|
85
|
-
assert result.ready is True
|
|
86
|
-
assert result.reasons == []
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
def test_bug_missing_run_method_fails():
|
|
90
|
-
body = BUG_READY.replace(
|
|
91
|
-
"Running `uv run --group test pytest tests/` fails",
|
|
92
|
-
"Running the test suite fails",
|
|
93
|
-
)
|
|
94
|
-
result = evaluate_readiness(body, ["bug"])
|
|
95
|
-
assert result.ready is False
|
|
96
|
-
assert any("reproducible command" in r for r in result.reasons)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def test_bug_npm_build_command_is_a_valid_run_method():
|
|
100
|
-
body = BUG_READY.replace(
|
|
101
|
-
"Running `uv run --group test pytest tests/` fails in\n"
|
|
102
|
-
"`test_skills_catalog.py` with a KeyError when a skill is missing from the\n"
|
|
103
|
-
"marketplace.",
|
|
104
|
-
"Running `npm run build:skills` fails with a schema error.",
|
|
105
|
-
)
|
|
106
|
-
result = evaluate_readiness(body, ["bug"])
|
|
107
|
-
assert result.ready is True
|
|
108
|
-
assert result.reasons == []
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
def test_bug_acceptance_needs_checklist_item():
|
|
112
|
-
body = BUG_READY.replace(
|
|
113
|
-
"- [ ] `uv run --group test pytest tests/` passes with a clear error message",
|
|
114
|
-
"Make the test error message clearer",
|
|
115
|
-
)
|
|
116
|
-
result = evaluate_readiness(body, ["bug"])
|
|
117
|
-
assert result.ready is False
|
|
118
|
-
assert any("checklist item" in r for r in result.reasons)
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
def test_no_response_field_counts_as_empty():
|
|
122
|
-
body = BUG_READY.replace(
|
|
123
|
-
"### Acceptance Criteria\n\n- [ ] `uv run --group test pytest tests/` "
|
|
124
|
-
"passes with a clear error message\n",
|
|
125
|
-
"### Acceptance Criteria\n\n_No response_\n",
|
|
126
|
-
)
|
|
127
|
-
result = evaluate_readiness(body, ["bug"])
|
|
128
|
-
assert result.ready is False
|
|
129
|
-
assert any("Acceptance Criteria" in r for r in result.reasons)
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
def test_no_bug_or_enhancement_label_not_ready():
|
|
133
|
-
result = evaluate_readiness(ENHANCEMENT_READY, [])
|
|
134
|
-
assert result.ready is False
|
|
135
|
-
assert any("bug" in r and "enhancement" in r for r in result.reasons)
|