@@ -890,6 +890,44 @@ get_os() {
890890 uname -s 2> /dev/null || echo " unknown"
891891}
892892
893+ # Version of this plugin, read from its plugin.json manifest. Cached after the
894+ # first lookup. Returns "unknown" if it can't be read.
895+ get_plugin_version () {
896+ if [ -n " ${_PLUGIN_VERSION:- } " ]; then
897+ echo " $_PLUGIN_VERSION "
898+ return
899+ fi
900+ local manifest=" ${SCRIPT_DIR:- $(cd " $( dirname " ${BASH_SOURCE[0]} " ) " && pwd)} /../.claude-plugin/plugin.json"
901+ local v=" "
902+ [ -f " $manifest " ] && v=$( jq -r ' .version // empty' " $manifest " 2> /dev/null)
903+ _PLUGIN_VERSION=" ${v:- unknown} "
904+ echo " $_PLUGIN_VERSION "
905+ }
906+
907+ # Version of the running Claude Code CLI. Prefers a version found in the
908+ # session transcript (authoritative for the run that produced it); falls back
909+ # to `claude --version`. Cached after the first lookup. Returns "unknown" if
910+ # neither source is available.
911+ #
912+ # Args: [transcript_path] - optional transcript to read `.version` from.
913+ get_claude_code_version () {
914+ local transcript=" ${1:- } "
915+ if [ -n " ${_CC_VERSION:- } " ]; then
916+ echo " $_CC_VERSION "
917+ return
918+ fi
919+ local v=" "
920+ if [ -n " $transcript " ] && [ -f " $transcript " ]; then
921+ v=$( jq -rc ' select(.version) | .version' " $transcript " 2> /dev/null | head -1)
922+ fi
923+ if [ -z " $v " ]; then
924+ # e.g. "2.1.173 (Claude Code)" -> "2.1.173"
925+ v=$( claude --version 2> /dev/null | awk ' {print $1}' )
926+ fi
927+ _CC_VERSION=" ${v:- unknown} "
928+ echo " $_CC_VERSION "
929+ }
930+
893931# ##
894932# Emit spans for a Claude Code transcript file (typically a sub-agent's own
895933# transcript), parented under a given span. This reproduces the same span
0 commit comments