Skip to content

Release 0.4.0

Latest

Choose a tag to compare

@tercel tercel released this 27 Mar 01:33

Added

  • DisplayResolver (apcore_toolkit.display) — sparse binding.yaml display overlay (§5.13). Merges per-surface presentation fields (alias, description, guidance, tags, documentation) into ScannedModule.metadata["display"] for downstream CLI/MCP/A2A surfaces.
    • Resolution chain per field: surface-specific override > display default > binding-level field > scanner value.
    • resolve(modules, *, binding_path=..., binding_data=...) — accepts pre-parsed dict or a path to a .binding.yaml file / directory of *.binding.yaml files. binding_data takes precedence over binding_path.
    • MCP alias auto-sanitization: replaces characters outside [a-zA-Z0-9_-] with _; prepends _ if result starts with a digit.
    • MCP alias hard limit: raises ValueError if sanitized alias exceeds 64 characters.
    • CLI alias validation: warns and falls back to display.alias when user-explicitly-set alias does not match ^[a-z][a-z0-9_-]*$ (module_id fallback always accepted without warning).
    • suggested_alias in ScannedModule.metadata (emitted by simplify_ids=True scanner) used as fallback when no display.alias is set.
    • Match-count logging: INFO for match count, WARNING when binding map loaded but zero modules matched.
  • New feature spec: docs/features/display-overlay.md

Tests

  • 30 new tests in tests/test_display_resolver.py covering: no-binding fallthrough, alias-only overlay, surface-specific overrides, MCP sanitization, MCP 64-char limit, suggested_alias fallback, sparse overlay (10 modules / 1 binding), tags resolution, binding_path file and directory loading, guidance chain, CLI invalid alias warning and fallback, binding_data vs binding_path precedence.

Added (Convention Module Discovery — §5.14)

  • ConventionScanner — scans a commands/ directory of plain Python files for public functions and converts them to ScannedModule instances with schema inferred from PEP 484 type annotations.
    • Module ID: {file_prefix}.{function_name} with MODULE_PREFIX override.
    • Description from first line of docstring ("(no description)" fallback).
    • input_schema / output_schema inferred from type hints.
    • CLI_GROUP and TAGS module-level constants stored in metadata.
    • include / exclude regex filters on module IDs.
  • New feature spec: docs/features/convention-scanning.md

Tests (Convention Module Discovery)

  • 15 new tests in tests/test_convention_scanner.py.