skillware 0.4.2__tar.gz → 0.4.3__tar.gz
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.
- {skillware-0.4.2/skillware.egg-info → skillware-0.4.3}/PKG-INFO +1 -1
- {skillware-0.4.2 → skillware-0.4.3}/pyproject.toml +1 -1
- {skillware-0.4.2 → skillware-0.4.3}/skillware/core/loader.py +45 -28
- {skillware-0.4.2 → skillware-0.4.3/skillware.egg-info}/PKG-INFO +1 -1
- {skillware-0.4.2 → skillware-0.4.3}/skillware.egg-info/SOURCES.txt +1 -0
- skillware-0.4.3/tests/test_github_labels.py +64 -0
- {skillware-0.4.2 → skillware-0.4.3}/tests/test_loader.py +19 -4
- {skillware-0.4.2 → skillware-0.4.3}/tests/test_registry_docs.py +34 -0
- {skillware-0.4.2 → skillware-0.4.3}/tests/test_version_policy.py +1 -1
- {skillware-0.4.2 → skillware-0.4.3}/LICENSE +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/MANIFEST.in +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/README.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/setup.cfg +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/mica_module/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/mica_module/card.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/mica_module/instructions.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/mica_module/manifest.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/mica_module/mica_corpus.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/mica_module/skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/mica_module/test_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/pii_masker/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/pii_masker/card.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/pii_masker/instructions.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/pii_masker/manifest.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/pii_masker/skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/pii_masker/test_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/tos_evaluator/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/tos_evaluator/card.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/tos_evaluator/instructions.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/tos_evaluator/manifest.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/tos_evaluator/skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/compliance/tos_evaluator/test_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/novelty_extractor/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/novelty_extractor/card.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/novelty_extractor/instructions.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/novelty_extractor/manifest.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/novelty_extractor/skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/novelty_extractor/test_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/synthetic_generator/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/synthetic_generator/card.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/synthetic_generator/instructions.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/synthetic_generator/manifest.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/synthetic_generator/skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/synthetic_generator/test_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/defi/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/defi/evm_tx_handler/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/defi/evm_tx_handler/abis.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/defi/evm_tx_handler/card.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/defi/evm_tx_handler/config.yaml.example +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/defi/evm_tx_handler/data/addressbook.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/defi/evm_tx_handler/data/chains.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/defi/evm_tx_handler/data/tokens.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/defi/evm_tx_handler/instructions.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/defi/evm_tx_handler/manifest.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/defi/evm_tx_handler/skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/defi/evm_tx_handler/test_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/dev_tools/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/dev_tools/issue_resolver/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/dev_tools/issue_resolver/card.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/dev_tools/issue_resolver/instructions.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/dev_tools/issue_resolver/manifest.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/dev_tools/issue_resolver/skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/dev_tools/issue_resolver/test_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/dev_tools/issue_resolver/workflow.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/uk_companies_house_handler/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/uk_companies_house_handler/card.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/uk_companies_house_handler/data/api_index.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/uk_companies_house_handler/data/terminology_map.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/uk_companies_house_handler/instructions.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/uk_companies_house_handler/manifest.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/uk_companies_house_handler/skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/uk_companies_house_handler/test_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/card.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/data/entities.ftm.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/data/malicious_scs_2025.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/data/normalized_fbi_lazarus_20250722_180019.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/data/normalized_israel_nbctf_20250722_180019.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/data/normalized_uniswap_trm.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/instructions.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/maintenance/normalization_tool.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/maintenance/normalize_uniswap_trm.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/manifest.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/test_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/monitoring/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/monitoring/token_limiter/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/monitoring/token_limiter/budget.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/monitoring/token_limiter/card.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/monitoring/token_limiter/data/model_pricing.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/monitoring/token_limiter/instructions.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/monitoring/token_limiter/manifest.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/monitoring/token_limiter/skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/monitoring/token_limiter/test_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/office/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/office/pdf_form_filler/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/office/pdf_form_filler/card.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/office/pdf_form_filler/instructions.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/office/pdf_form_filler/manifest.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/office/pdf_form_filler/skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/office/pdf_form_filler/test_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/office/pdf_form_filler/utils.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/optimization/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/optimization/prompt_rewriter/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/optimization/prompt_rewriter/card.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/optimization/prompt_rewriter/instructions.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/optimization/prompt_rewriter/manifest.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/optimization/prompt_rewriter/skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/optimization/prompt_rewriter/test_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/mental_coach/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/mental_coach/card.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/mental_coach/constraints.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/mental_coach/crisis_gate.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/mental_coach/instructions.md +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/mental_coach/kb/corpus.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/mental_coach/kb/crisis_resources.json +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/mental_coach/kb/hard_constraints.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/mental_coach/kb_provider.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/mental_coach/manifest.yaml +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/mental_coach/resources.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/mental_coach/skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skills/wellness/mental_coach/test_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skillware/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skillware/__main__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skillware/cli.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skillware/core/__init__.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skillware/core/base_skill.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skillware/core/env.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skillware/version_policy.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skillware.egg-info/dependency_links.txt +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skillware.egg-info/entry_points.txt +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skillware.egg-info/requires.txt +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/skillware.egg-info/top_level.txt +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/tests/test_cli.py +0 -0
- {skillware-0.4.2 → skillware-0.4.3}/tests/test_skill_issuer.py +0 -0
|
@@ -291,34 +291,6 @@ class SkillLoader:
|
|
|
291
291
|
}
|
|
292
292
|
return {}
|
|
293
293
|
|
|
294
|
-
@staticmethod
|
|
295
|
-
def to_gemini_tool(skill_bundle: Dict[str, Any]) -> Dict[str, Any]:
|
|
296
|
-
"""
|
|
297
|
-
Converts a skill manifest to a Gemini function declaration.
|
|
298
|
-
Handles type conversion (lowercase to UPPERCASE) for Gemini Protobuf compatibility.
|
|
299
|
-
"""
|
|
300
|
-
manifest = skill_bundle.get("manifest", {})
|
|
301
|
-
name = manifest.get("name", "unknown_tool")
|
|
302
|
-
description = manifest.get("description", "")
|
|
303
|
-
parameters = manifest.get("parameters", {})
|
|
304
|
-
|
|
305
|
-
# Helper to recursively upper-case 'type' fields
|
|
306
|
-
def sanitize_schema(schema):
|
|
307
|
-
new_schema = schema.copy()
|
|
308
|
-
if "type" in new_schema:
|
|
309
|
-
new_schema["type"] = new_schema["type"].upper()
|
|
310
|
-
if "properties" in new_schema:
|
|
311
|
-
new_schema["properties"] = {
|
|
312
|
-
k: sanitize_schema(v) for k, v in new_schema["properties"].items()
|
|
313
|
-
}
|
|
314
|
-
return new_schema
|
|
315
|
-
|
|
316
|
-
return {
|
|
317
|
-
"name": name,
|
|
318
|
-
"description": description,
|
|
319
|
-
"parameters": sanitize_schema(parameters),
|
|
320
|
-
}
|
|
321
|
-
|
|
322
294
|
@staticmethod
|
|
323
295
|
def to_claude_tool(skill_bundle: Dict[str, Any]) -> Dict[str, Any]:
|
|
324
296
|
"""
|
|
@@ -345,6 +317,10 @@ class SkillLoader:
|
|
|
345
317
|
return "unknown_tool"
|
|
346
318
|
return safe[:64]
|
|
347
319
|
|
|
320
|
+
@staticmethod
|
|
321
|
+
def _sanitize_gemini_tool_name(name: str) -> str:
|
|
322
|
+
return SkillLoader._sanitize_function_tool_name(name)
|
|
323
|
+
|
|
348
324
|
@staticmethod
|
|
349
325
|
def _sanitize_openai_tool_name(name: str) -> str:
|
|
350
326
|
return SkillLoader._sanitize_function_tool_name(name)
|
|
@@ -353,6 +329,47 @@ class SkillLoader:
|
|
|
353
329
|
def _sanitize_deepseek_tool_name(name: str) -> str:
|
|
354
330
|
return SkillLoader._sanitize_function_tool_name(name)
|
|
355
331
|
|
|
332
|
+
@staticmethod
|
|
333
|
+
def to_gemini_tool(skill_bundle: Dict[str, Any]) -> Any:
|
|
334
|
+
"""
|
|
335
|
+
Converts a skill manifest to a Gemini function declaration.
|
|
336
|
+
Handles type conversion (lowercase to UPPERCASE) for Gemini Protobuf compatibility.
|
|
337
|
+
See: https://ai.google.dev/gemini-api/docs/generate-content/function-calling#how-it-works
|
|
338
|
+
"""
|
|
339
|
+
try:
|
|
340
|
+
from google.genai import types
|
|
341
|
+
except ImportError:
|
|
342
|
+
raise ImportError(
|
|
343
|
+
"google-genai is required for to_gemini_tool. Install with: pip install google-genai"
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
manifest = skill_bundle.get("manifest", {})
|
|
347
|
+
raw_name = manifest.get("name", "unknown_tool")
|
|
348
|
+
name = SkillLoader._sanitize_gemini_tool_name(raw_name)
|
|
349
|
+
description = manifest.get("description", "")
|
|
350
|
+
parameters = manifest.get("parameters", {})
|
|
351
|
+
|
|
352
|
+
# Helper to recursively upper-case 'type' fields
|
|
353
|
+
def sanitize_schema(schema):
|
|
354
|
+
new_schema = schema.copy()
|
|
355
|
+
if "type" in new_schema:
|
|
356
|
+
new_schema["type"] = new_schema["type"].upper()
|
|
357
|
+
if "properties" in new_schema:
|
|
358
|
+
new_schema["properties"] = {
|
|
359
|
+
k: sanitize_schema(v) for k, v in new_schema["properties"].items()
|
|
360
|
+
}
|
|
361
|
+
return new_schema
|
|
362
|
+
|
|
363
|
+
return types.Tool(
|
|
364
|
+
function_declarations=[
|
|
365
|
+
{
|
|
366
|
+
"name": name,
|
|
367
|
+
"description": description,
|
|
368
|
+
"parameters": sanitize_schema(parameters),
|
|
369
|
+
}
|
|
370
|
+
]
|
|
371
|
+
)
|
|
372
|
+
|
|
356
373
|
@staticmethod
|
|
357
374
|
def to_openai_tool(skill_bundle: Dict[str, Any]) -> Dict[str, Any]:
|
|
358
375
|
"""
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""Validate .github/labels.json matches repository label policy."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import re
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
LABELS_PATH = Path(__file__).resolve().parent.parent / ".github" / "labels.json"
|
|
8
|
+
HEX_COLOR = re.compile(r"^[0-9A-Fa-f]{6}$")
|
|
9
|
+
|
|
10
|
+
REQUIRED_LABELS = {
|
|
11
|
+
"bug",
|
|
12
|
+
"documentation",
|
|
13
|
+
"enhancement",
|
|
14
|
+
"good first issue",
|
|
15
|
+
"help wanted",
|
|
16
|
+
"skill request",
|
|
17
|
+
"skill upgrade",
|
|
18
|
+
"core framework",
|
|
19
|
+
"cli",
|
|
20
|
+
"examples",
|
|
21
|
+
"testing",
|
|
22
|
+
"packaging",
|
|
23
|
+
"ci",
|
|
24
|
+
"security",
|
|
25
|
+
"discussion",
|
|
26
|
+
"question",
|
|
27
|
+
"wontfix",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _load_labels() -> list[dict]:
|
|
32
|
+
return json.loads(LABELS_PATH.read_text(encoding="utf-8"))
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_labels_json_exists_and_is_array():
|
|
36
|
+
labels = _load_labels()
|
|
37
|
+
assert isinstance(labels, list)
|
|
38
|
+
assert len(labels) >= len(REQUIRED_LABELS)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_required_labels_present():
|
|
42
|
+
names = {entry["name"] for entry in _load_labels()}
|
|
43
|
+
missing = REQUIRED_LABELS - names
|
|
44
|
+
assert not missing, f"Missing labels in labels.json: {sorted(missing)}"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def test_label_entries_well_formed():
|
|
48
|
+
names: set[str] = set()
|
|
49
|
+
for entry in _load_labels():
|
|
50
|
+
name = entry.get("name")
|
|
51
|
+
color = entry.get("color", "")
|
|
52
|
+
description = entry.get("description", "")
|
|
53
|
+
assert name and isinstance(name, str)
|
|
54
|
+
assert name not in names, f"Duplicate label: {name}"
|
|
55
|
+
names.add(name)
|
|
56
|
+
assert HEX_COLOR.match(color), f"Bad color for {name}: {color!r}"
|
|
57
|
+
assert description and isinstance(description, str)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def test_rfc_template_labels_exist():
|
|
61
|
+
"""Issue template 05_rfc.yml references discussion and core framework."""
|
|
62
|
+
names = {entry["name"] for entry in _load_labels()}
|
|
63
|
+
assert "discussion" in names
|
|
64
|
+
assert "core framework" in names
|
|
@@ -316,7 +316,7 @@ def test_to_ollama_prompt():
|
|
|
316
316
|
def test_to_gemini_tool():
|
|
317
317
|
dummy_bundle = {
|
|
318
318
|
"manifest": {
|
|
319
|
-
"name": "
|
|
319
|
+
"name": "finance/wallet_screening",
|
|
320
320
|
"parameters": {
|
|
321
321
|
"type": "object",
|
|
322
322
|
"properties": {"param1": {"type": "string"}},
|
|
@@ -324,10 +324,25 @@ def test_to_gemini_tool():
|
|
|
324
324
|
}
|
|
325
325
|
}
|
|
326
326
|
tool = SkillLoader.to_gemini_tool(dummy_bundle)
|
|
327
|
-
|
|
327
|
+
decl = tool.function_declarations[0]
|
|
328
|
+
assert decl.name == "finance_wallet_screening"
|
|
329
|
+
assert type(tool).__name__ == "Tool"
|
|
328
330
|
# Gemini requires UPPERCASE types for Protobufs
|
|
329
|
-
assert
|
|
330
|
-
assert
|
|
331
|
+
assert decl.parameters.type.name == "OBJECT"
|
|
332
|
+
assert decl.parameters.properties["param1"].type.name == "STRING"
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
def test_sanitize_gemini_tool_name():
|
|
336
|
+
assert (
|
|
337
|
+
SkillLoader._sanitize_gemini_tool_name("compliance/tos_evaluator")
|
|
338
|
+
== "compliance_tos_evaluator"
|
|
339
|
+
)
|
|
340
|
+
assert (
|
|
341
|
+
SkillLoader._sanitize_gemini_tool_name("wallet_screening") == "wallet_screening"
|
|
342
|
+
)
|
|
343
|
+
assert SkillLoader._sanitize_gemini_tool_name("") == "unknown_tool"
|
|
344
|
+
assert SkillLoader._sanitize_gemini_tool_name("a" * 80).startswith("a")
|
|
345
|
+
assert len(SkillLoader._sanitize_gemini_tool_name("a" * 80)) == 64
|
|
331
346
|
|
|
332
347
|
|
|
333
348
|
def test_to_claude_tool():
|
|
@@ -164,3 +164,37 @@ def test_agent_loops_reference_all_skills(
|
|
|
164
164
|
assert not missing, "Skills missing from docs/usage/agent_loops.md:\n" + "\n".join(
|
|
165
165
|
f" - {skill}" for skill in missing
|
|
166
166
|
)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def test_skill_docs_gemini_anti_patterns():
|
|
170
|
+
"""Verify Gemini snippets in skill catalog pages do not use anti-patterns."""
|
|
171
|
+
docs_root = REPO_ROOT / "docs" / "skills"
|
|
172
|
+
|
|
173
|
+
anti_patterns = [
|
|
174
|
+
(r'tool_decl\["name"\]\s*=', 'tool_decl["name"] mutation'),
|
|
175
|
+
(r'gemini_decl\["name"\]\s*=', 'gemini_decl["name"] mutation'),
|
|
176
|
+
(
|
|
177
|
+
r"types\.Tool\s*\(\s*function_declarations\s*=\s*\[",
|
|
178
|
+
"types.Tool(function_declarations=[ manual wrap",
|
|
179
|
+
),
|
|
180
|
+
(
|
|
181
|
+
r'function_call\.name\s*==\s*(?:bundle|skill)\["manifest"\]\["name"\]',
|
|
182
|
+
'function_call.name == bundle["manifest"]["name"] without sanitize',
|
|
183
|
+
),
|
|
184
|
+
]
|
|
185
|
+
|
|
186
|
+
failures = []
|
|
187
|
+
|
|
188
|
+
for md_file in docs_root.glob("*.md"):
|
|
189
|
+
if md_file.name == "README.md":
|
|
190
|
+
continue
|
|
191
|
+
|
|
192
|
+
content = md_file.read_text(encoding="utf-8")
|
|
193
|
+
|
|
194
|
+
for pattern, name in anti_patterns:
|
|
195
|
+
if re.search(pattern, content):
|
|
196
|
+
failures.append(f"{md_file.name}: {name}")
|
|
197
|
+
|
|
198
|
+
assert not failures, "Gemini anti-patterns found in skill docs:\n" + "\n".join(
|
|
199
|
+
f" - {f}" for f in failures
|
|
200
|
+
)
|
|
@@ -39,7 +39,7 @@ def test_emit_advisory_silent_for_current_release(monkeypatch, capsys):
|
|
|
39
39
|
monkeypatch.setattr(
|
|
40
40
|
version_policy.metadata,
|
|
41
41
|
"version",
|
|
42
|
-
lambda _name: "0.4.
|
|
42
|
+
lambda _name: "0.4.3",
|
|
43
43
|
)
|
|
44
44
|
version_policy.emit_upgrade_advisory()
|
|
45
45
|
assert capsys.readouterr().err == ""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/novelty_extractor/instructions.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/synthetic_generator/instructions.md
RENAMED
|
File without changes
|
{skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/synthetic_generator/manifest.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{skillware-0.4.2 → skillware-0.4.3}/skills/data_engineering/synthetic_generator/test_skill.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{skillware-0.4.2 → skillware-0.4.3}/skills/finance/uk_companies_house_handler/data/api_index.json
RENAMED
|
File without changes
|
|
File without changes
|
{skillware-0.4.2 → skillware-0.4.3}/skills/finance/uk_companies_house_handler/instructions.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/data/malicious_scs_2025.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{skillware-0.4.2 → skillware-0.4.3}/skills/finance/wallet_screening/data/normalized_uniswap_trm.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|