Effort: standard
Adding a new tool/skill (a wrapper around an external API or a local
analysis primitive) currently means: write the function in
scidex/forge/tools.py (or a new file under scidex_tools/),
remember to apply @log_tool_call (defined in
scidex/forge/forge_tools.py:67), register it in the skills
table via register_tool at line 43, write a smoke test (look at
scripts/test_forge_tools.py — 200+ LoC of hand-rolled probes),
optionally add a card to the playground at scripts/test_playground_tools.py.
Half the new tools that have shipped in the last quarter are missing
at least one of those steps. Ship scidex new-skill to do all five
from a single signature declaration.
scidex new-skill <name> --inputs '<json-schema>'scidex/forge/skills/<name>.py with a single functiondef <name>(**kwargs) -> dict: decorated with@log_tool_call and a docstring auto-rendered from themigrations/<YYYYMMDD>_register_skill_<name>.py callingregister_tool(<name>, <description>, ...).tests/skills/test_<name>.py:test_signature (kwargs matches schema),test_logged (invocation row appears in tool_invocations),test_failure_path (raising → success=0 row written).--playground flag set.
validate_call so bad kwargs raise ValidationError beforescripts/export_skill_manifest.py walksscidex/forge/skills/ and emits site/skills.json (one entrytests/test_skill_scaffolder.py:dummy_pubmed_proxy skill againstpytest -k
dummy_pubmed_proxy.scidex new-skill --import-existingscidex/forge/forge_tools.py lines 1-130 to internalise the@log_tool_call decorator + register_tool flow.
scidex/forge/tools.py:20+,scidex_tools/methbase.py, scidex_tools/model_training.py) tostring.Template.validate_call adds runtime input validation; add ascidex/forge/forge_tools.py:43,67 — register_tool /log_tool_call.q-devx-live-api-explorer — consumes site/skills.json.