Skip to content

feat(skills): add library-skills, an agentskills.io implementation with 3 swappable engines - #49

Merged
jordanauge merged 1 commit into
mainfrom
feat/skills-plugin-library
Sep 4, 2026
Merged

jordanauge merged 1 commit into
mainfrom
feat/skills-plugin-library

Conversation

@jordanauge

@jordanauge jordanauge commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

New library-skills package implements the agentskills.io spec (discovery,
frontmatter, tiered catalog/tools/scripts) and exposes it to agents via two
plugins (ContextContract catalog injection, ToolContract activate/read/list).
Script execution runs through a small sandboxed shell.

Underneath, three interchangeable engines do the actual work. Swapping engines
is a manifest/overlay change, not a code change: set impl: native|adk|langchain
on the skills tool entries (see the library-skills/overlays/skill-impl-*.yaml
presets) and bootstrap wires the selection to both catalog injection and skill
tool execution.

  • native (default): wraps two new standalone packages, agentskills (spec
    implementation) and skill-sandbox (POSIX rlimit sandboxing); zero glue
    code, the recommended default.
  • adk: delegates to google-adk's native skills support; richest built-in
    behavior but no sandboxing and eager in-memory loading.
  • langchain: delegates to deepagents (LangGraph); needs ~70 lines of adapter
    glue since deepagents exposes a tool-call-oriented API rather than direct
    skill content access; no sandboxing.

Also improve CI stability/perf: run install/install-dev once per task
invocation, and remove avoidable test skips/warnings by installing OTEL and
httpx2 dev deps.

Signed-off-by: Jordan Augé augjorda@cisco.com

@jordanauge
jordanauge force-pushed the feat/skills-plugin-library branch 2 times, most recently from 9ea7333 to 466d1b9 Compare September 4, 2026 12:09
…th 3 swappable engines

New library-skills package implements the agentskills.io spec (discovery,
frontmatter, tiered catalog/tools/scripts) and exposes it to agents via two
plugins (ContextContract catalog injection, ToolContract activate/read/list).
Script execution runs through a small sandboxed shell.

Underneath, three interchangeable engines do the actual work. Swapping engines
is a manifest/overlay change, not a code change: set `impl: native|adk|langchain`
on the skills tool entries (see the library-skills/overlays/skill-impl-*.yaml
presets) and bootstrap wires the selection to both catalog injection and skill
tool execution.

- native (default): wraps two new standalone packages, `agentskills` (spec
  implementation) and `skill-sandbox` (POSIX rlimit sandboxing), vendored
  as library-skills/agentskills and library-skills/skill-sandbox workspace
  members; zero glue code, the recommended default.
- adk: delegates to google-adk's native skills support; richest built-in
  behavior but no sandboxing and eager in-memory loading.
- langchain: delegates to deepagents (LangGraph); needs ~70 lines of adapter
  glue since deepagents exposes a tool-call-oriented API rather than direct
  skill content access; no sandboxing.

Also improve CI stability/perf: run install/install-dev once per task
invocation, and remove avoidable test skips/warnings by installing OTEL and
httpx2 dev deps.

Also included:

- spec.context_sources: a plugin-list binding (mirrors observability/
  governance) for selecting the skills engine per deployment; skill-access
  (read-only catalog/activation) tools are auto-injected whenever
  spec.skills is non-empty
- run-skill-script stays opt-in: it's never auto-granted alongside
  skill-access, so script execution requires either an explicit tool ref
  or a deployment-wide context_sources: [{native: {auto_inject: true}}] --
  trusted environments only, by design
- Filesystem-ref validation recognizes any `<scheme>:<rest>` value as a
  library/package ref via generic scheme detection, so skill tool refs
  (and any future library prefix) are never misclassified as filesystem
  paths
- skill-impl-{native,adk,langchain} overlays let an agent select its
  skills engine and base directory purely through manifest/overlay
  composition, with schemas that accept the params these overlays set
- activate_skill's "name" parameter carries a real enum-constrained JSON
  schema, built by threading ctx through the tool-schema pipeline
  (ManifestToolProvider, openai_tools, ToolContract.on_collect_tools) --
  the model is constrained to actually-registered skill names, and the
  enum excludes skills already activated in the session, so a forced
  tool_choice can't get the model stuck re-selecting the same one
- The quickstart integration tests (library-skills/tests/test_quickstart.py)
  build their runtime instance with explicit standard:mock-llm infra and
  spec.execution.mocking enabled, so they never require a live model or
  OPENAI_API_KEY -- they only inspect prompt assembly and plugin wiring

Signed-off-by: Jordan Augé <augjorda@cisco.com>
@jordanauge
jordanauge force-pushed the feat/skills-plugin-library branch from 466d1b9 to 4606902 Compare September 4, 2026 12:20
@jordanauge
jordanauge merged commit 3fc3be5 into main Sep 4, 2026
3 checks passed
@jordanauge
jordanauge deleted the feat/skills-plugin-library branch September 4, 2026 12:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant