{"_id":"@ascenda-one/claude-code-hooks","_rev":"26-ada513ed569b334dccaf90a4353acdfe","name":"@ascenda-one/claude-code-hooks","dist-tags":{"latest":"0.1.28"},"versions":{"0.1.3":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.3","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.3","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"f35c118c30229aa0799ca42af4efecbabf421110","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.3.tgz","fileCount":20,"integrity":"sha512-54FmMHklvEPceocGFYniwc92w0QLMWEh4sW7JKd9Kw+zuXHOAeSLfcipIQ8CsZ4U5BsVfn0F7GQAyodFyrIaCw==","signatures":[{"sig":"MEUCIBYG27UMFA1bwkdRwVMDHaIOiu+DZyt7efR9Wt7yLXaUAiEAt+GpefBLkfl+jO1x1rkVlCzccEI9CnTWVQav6SjqsgI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":98306},"type":"module","engines":{"node":">=20"},"gitHead":"8b247d4804aeeb72e97ff0551b932705f3a2bafc","scripts":{"test":"node --test","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.3_1785877621089_0.11931203806277768","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.4","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.4","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"0031d4eafe2148053eb417483c0cc44e0dc9ec50","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.4.tgz","fileCount":20,"integrity":"sha512-hayo/1nTFXSIbycmMeIqMc+9KnfVqgnhACt+rUwxyfzTx3lBb8qw7pWHaxwcFql2I6xBo42vFXr1F4zK5f7g6Q==","signatures":[{"sig":"MEYCIQCDsSvRrKSAlyh1XfVY/qzRP50k2Zw78D77Mqp0SEPISgIhANy2YcIipt964jpAxmTJs39Bp9LXETFqr/QRItdnI9qh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":99486},"type":"module","engines":{"node":">=20"},"gitHead":"e1e8fb5e1f8e2f5b1156cb49c425f1172da2c2ca","scripts":{"test":"node --test","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.4_1785982459633_0.04874013648596698","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.5","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.5","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"e6dfb755d6a0a99d95823c870cdd00d849c38b1a","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.5.tgz","fileCount":20,"integrity":"sha512-WWAOGNx4dutF3fDd8q6H8CsAPguhFPZXdgHE+iX7XDGqz83cGeyYzO4nMigCFX353zjzN6U0VOcoCcTJElGimA==","signatures":[{"sig":"MEQCHxX0LaPsj+qy+hn+oKZrF28vLA6uDMW+u+xHsPkyK78CIQDgEGEUFgiIY0XCSFh7A6e/N6LgcHys5e39i5Hy8fEpwQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":104187},"type":"module","engines":{"node":">=20"},"gitHead":"08c457799d48c33cd8e4aa55f36a20b834560982","scripts":{"test":"node --test","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.5_1785982893302_0.8054412667883275","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.6","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.6","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"bb32df5f1a30ff27aab35e64f9513c0f87e360f0","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.6.tgz","fileCount":20,"integrity":"sha512-On7THR+3GO9Mg4GAijvJkZ59pig49XiLtZl6hz/dSbLx8guLnM4ABK41x9Y3CN/6COkrmgeLDeSTg3julGtsOw==","signatures":[{"sig":"MEYCIQDnwycFm/eDj8k70hyki1u9V/xfsts8xFUYSpBpsEA0bgIhAJMgLDdkNWQXeubUcUHfOFYgRZ6CW+Mv+cUWH+9TPBIw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":104187},"type":"module","engines":{"node":">=20"},"gitHead":"6c329f239bcd48734b3bef23cc769f94d985b47c","scripts":{"test":"node --test","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.6_1785986254142_0.01781120604874875","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.7","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.7","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"730f796f7fed7ca7c80100de762e67f643ec9e12","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.7.tgz","fileCount":21,"integrity":"sha512-1b6QpX75vOtYQY4zVB3s1+0rscjYMZYp0hvS5ZbyXjLddfCNJXCWUHqxmeJML9WmFVvKS2BTh7lv7iExgMJ6+g==","signatures":[{"sig":"MEUCIQClEI2vZ3+IpdWNe2LeZqD8j/FiPRYxPzrVyMSfM8oOjwIgc7NkNZcm/ewNfMF7F+3Vrp81VoyVsJqP9Oq84MapwZQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":112045},"type":"module","engines":{"node":">=20"},"gitHead":"1546656f95d240e42e94df5c1fa1ac21ced91f38","scripts":{"test":"node --test","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.7_1786014830948_0.5221429316681374","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.8","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.8","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"d1a9579722fb2d616aca7fc0da368c7a062b4dcf","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.8.tgz","fileCount":21,"integrity":"sha512-98L3BWQRaWfAy/rNVH9cp2mR38ntchtE1cntchd3u6hS57EgVc4q6B/jsAbE4mfNS99Ls6cFz4cymM0tV+RmZQ==","signatures":[{"sig":"MEQCIBPg1gnhzHEKaKpSccs2wdhk8oT27jZicRp7N6wfIBTvAiAj/ephrim95MroLqztmxUwEA0E3OFTOlnerBXaUNoxoQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":119431},"type":"module","engines":{"node":">=20"},"gitHead":"ef7e6939b60a0c573109d4ecf98c25b4363a682a","scripts":{"test":"node --test","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.8_1786061288198_0.21981864656244454","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.9","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.9","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"acc5308ce28344fc308e148927498dadf4ec4d66","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.9.tgz","fileCount":21,"integrity":"sha512-/n0bbCXJj+oNPSPf1lWVXuyfcLrrwRfivmUamglOzPF2k7msTBE6GkQRiWbHLoT/FRDrACKgC7Crxr6Q0eFdMQ==","signatures":[{"sig":"MEUCIHeqTodS+MCweVxQ1xVmzA19ID2tf89y3YPHGUwNwUkAAiEAv5lmOXE4O5frWeHkkcP4ieu4DZiqkQX0o4RfUTxpF8w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":160186},"type":"module","engines":{"node":">=20"},"gitHead":"4eefc0c708b12c0a149f017ca028175c654bb100","scripts":{"test":"node --test","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.9_1787013976375_0.11004864318243657","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.10","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.10","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"340553ddd366dbf7a2d3a134fc5d0571086ad18d","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.10.tgz","fileCount":21,"integrity":"sha512-FFK+AtSK0bVXrUJdm7K4BxveiVOy/70bnMeKkWrSOZOOMuY3WHSy6R6EKIKr89Cwuncm3YcjCZOOdolVPxnVeA==","signatures":[{"sig":"MEUCIB+JJ9wsKfdXhukmUrpLcnTPPN7CUxy6r064VI0GEbs9AiEAvU6uk878oYpn2KJm5QKFaKN6mtsvxnaZVzN+b77obME=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":160187},"type":"module","engines":{"node":">=20"},"gitHead":"2f3b920c0af72f538c73b5679a8f3aef12f22cf2","scripts":{"test":"node --test","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.10_1787022784455_0.4073028730864767","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.11","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.11","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"e87a74ce462c7b963783cd9d4e3a530ebebd405d","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.11.tgz","fileCount":21,"integrity":"sha512-KZCDg4QpYOW9r08jsvg7NrPuPW62htQaRi9x1DrOl+7I86JjP/C89xkQMNrg1vT7aWUSzRSaxErFEogQ1r32nw==","signatures":[{"sig":"MEYCIQDgoEf9ixh4xAzCrax5G6B8VhxddbXyQj0lufxCZcYCjgIhAIauXwSaGq4ElxXqRE6kW+McgQKwQ4y3xp0jYMfCPGrm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":160292},"type":"module","engines":{"node":">=20"},"gitHead":"84c4a38c32a368e8100e7f61301b7cabbb889d44","scripts":{"test":"node --test","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.11_1787023599573_0.3547534346222454","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.12","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.12","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"9d1b5eb1f14ad7716318d4c0930498518ce032a3","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.12.tgz","fileCount":21,"integrity":"sha512-mrOvVdaq3tofrOhKR0ETFyA9THDItRrzikJBSVZNODlXW2420aewCUtE9CvXyXaMOnVk+RMqfsweLT2MSkSesQ==","signatures":[{"sig":"MEUCIQDt5c5qpRkSRNmRPTj5YELLgpNg+lG2BZY73PBWXOszGwIgBswcLouSgI4BW3DkW1OZH0gNPN/TAHIjBkLOj4L1UXA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":161403},"type":"module","engines":{"node":">=20"},"gitHead":"303241e2f404f9efb8c470a85a4273b647e77b42","scripts":{"test":"node --test","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.12_1787211284988_0.983210201826157","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.13","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.13","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"d3e54eccc7ce4f37eff52a86c36bed665f51c694","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.13.tgz","fileCount":21,"integrity":"sha512-mgKeRAIsIikaYY1VtmaWGZckApILP8F5Bzw6xiloDXPKYv0pCbrs5A9s2iWEUDcVblR2Vlekrv4oQPBKGjTsWQ==","signatures":[{"sig":"MEYCIQDPs8F5AOJho4BECvjmcUXx54U62wDJv+45yMVQl30C0QIhAMm17KlUs5MV6JWzDer5t5XcozhSx+CivsjuVadh2elZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":177755},"type":"module","engines":{"node":">=20"},"gitHead":"925010f352fa29016a26912d9c8b5ed656c5a4a5","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.13_1787710074750_0.5223174037607781","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.14","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.14","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"cb0705fd172cfa50de0a1c62a4883d4c35f7f6c8","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.14.tgz","fileCount":21,"integrity":"sha512-AHI9bK2pVw6WLQF/HBRwN4hnASNsPA9us838M1pWuZTQIxz2odB7U6HU4VXJv+N3qLDMdoBhiBUzIoe5iE9bCw==","signatures":[{"sig":"MEUCICIOv4HFx+AZ8vw4A/kC6OLZY/ouFBpOkh4tuhTn9AdUAiEAwD64+ZN+RMVt15UJyA/9zEX46RiD5HmpNXh3DRLPLc0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":177926},"type":"module","engines":{"node":">=20"},"gitHead":"e2588d22670b02da314c2ba89945ce7bffaa9cfb","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.14_1787727034869_0.9394387153738417","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.15","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.15","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"333809a8079f1414195256bddcd340290c0e2268","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.15.tgz","fileCount":25,"integrity":"sha512-qmsqWWmewOtAgzSqPaaKjTtHegyA4lfQ2D4/ntcwxW1gsJET6tVlQluB2GnKtqCY5btLYnlkwiuQRVOt6YoJGw==","signatures":[{"sig":"MEUCIQCJKWlVekxOhndyw1nkCvHq2004GVuvCcdhZVPYPewUPwIgPE04CahabGhPKTO8PhF2nPX86tK/03HxFnyz8CfbLJ4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":239162},"type":"module","engines":{"node":">=20"},"gitHead":"c52bfb88279d66d891fc683d0f98aff23fd6746f","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.15_1787814815387_0.46090482881881","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.16","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.16","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"d60ab69b9619880eef6ca6d5c44e4eb84189e513","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.16.tgz","fileCount":25,"integrity":"sha512-R/lJRSJV5FkONb+462byPHAZMXLRe/YDp9NGoHr5bHKlk9KGSg/lV68JCCiAFu2CK63S59dXkJjmiOoV5sqbhQ==","signatures":[{"sig":"MEQCIAVcsrjc1xKL68ef3HwxhmLGl1KsVZGBxis2TGwveGsuAiAYhKH+iUz99Gbric47hh9EWwi/0UoSigXtsfq/BCfIEw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.16","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":338840},"type":"module","engines":{"node":">=20"},"gitHead":"414b25b83dd062b11c845fde8c7c6eb582905a27","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.16_1788492370229_0.4852518710466982","host":"s3://npm-registry-packages-npm-production"}},"0.1.17":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.17","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.17","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"336b062c668ce568d5d0180ba33fda4a7df3aef6","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.17.tgz","fileCount":25,"integrity":"sha512-ssDfsIHGjvGok7lWt/+YElv9Ga9UiMV6t3jzaj9CK4ivL/qvZiyNr810Q3bpGhnMnurjWfzUjXRgB7Vz0FNItg==","signatures":[{"sig":"MEYCIQDr3ry8jJM3tV8TOOxNDGTRl7trAwHG2kA5WmpNU9VkcwIhAKvzTGwdu5OjfPkljgK8oMhyd6SioBmCz7DRySxjPvxi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.17","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":341533},"type":"module","engines":{"node":">=20"},"gitHead":"8fb13b8b541bb90e806c64537b25597268e9f214","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.17_1788744382849_0.967642558465402","host":"s3://npm-registry-packages-npm-production"}},"0.1.18":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.18","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.18","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"3fd35ef2b1777da7e197be3cf6b8a90edb7ce6fe","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.18.tgz","fileCount":25,"integrity":"sha512-DK9tmq0AlGAH1iMCXie+r7Ue8azkLDW9+y9A8KsFCw0BhG+MsETD2EOVi1BvahPaiC6kB1j5VrtMQg+HDzbpfQ==","signatures":[{"sig":"MEQCIAC4vmsPhYhhh5t35xz+Gq6oXg6p2jBvKyy3/mREEJuBAiA9sg1yj16Sj2/KPeHDmUkdQgkgTuvi67LpUKWVhFB2qA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.18","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":341533},"type":"module","engines":{"node":">=20"},"gitHead":"cb322aa6d7c16fd6e57eed756ed590be0e7c33c8","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.18_1788753843995_0.0513834993409783","host":"s3://npm-registry-packages-npm-production"}},"0.1.19":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.19","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.19","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"0024c11dad64ec121c0b52e3522f8498885914c6","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.19.tgz","fileCount":25,"integrity":"sha512-OnFFKLIvDlojvvbwAKtI2oxsAS907v0bL/9hMQ7aVVupscZvb+V+MLLgn9WVuufma8Olno7DdM7HWZaZ0gny1A==","signatures":[{"sig":"MEUCIH20q9nTaA63/fCBg5a6RpF21mwqmvfzo3hSY+/6Go9gAiEAkUstn0ktHQfjgg7dGPI7o19aytYxTGsRwPslwonxGYw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.19","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":345828},"type":"module","engines":{"node":">=20"},"gitHead":"99582dedcab13d38649ad7a96efdb2f2bea74211","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.19_1788913521800_0.6277860147334402","host":"s3://npm-registry-packages-npm-production"}},"0.1.20":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.20","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.20","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"03ed67f5863cc474fbb6bf90d5e4864c0e4eddc9","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.20.tgz","fileCount":25,"integrity":"sha512-GJqf6fQDkFyKHsRgGux4C49qtYHBV/L8tLCJPjLG79gttBrbC98InH8ON20QBiB/KY4fNGmL9UUIIoZkTm509w==","signatures":[{"sig":"MEYCIQCKj7JLiMPSIRPa30lAULCqWZtUYMeeY72P3tDYhg2A5QIhANQDL6Z+nMXAOmEW0pn+/1l6Q9gI75Od0xNZgblIkid5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.20","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":346043},"type":"module","engines":{"node":">=20"},"gitHead":"00e32f446284dfbbf57143e3c8f7ec9b846356a0","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.20_1788920130327_0.9261204688939992","host":"s3://npm-registry-packages-npm-production"}},"0.1.21":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.21","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.21","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"3f1e03284656e1f7676f26af160fc868e902ef91","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.21.tgz","fileCount":25,"integrity":"sha512-k4B5etgdO9kaB8MZRphnfo7I5nw3jkN08uPm3Z9eAONGfm42DgBrDq86ftrHagM+au8Uqb/hT5eZAlivQMMQKw==","signatures":[{"sig":"MEYCIQC3NVdasSnDaONVQ8937kkPU2nlFenl+K0QUhGdGu42wgIhAKAfNGAllZVJ2VVwaFNYmHFCJnLNwoWUVmMC8lrdb/wq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.21","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":346060},"type":"module","engines":{"node":">=20"},"gitHead":"e0ce58ab02da6b57ab922c36325a3c4f91766c61","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.21_1788943426032_0.9623668847472207","host":"s3://npm-registry-packages-npm-production"}},"0.1.22":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.22","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.22","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"bb1e5ae91028d799244f2ebac1449e4910f5a121","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.22.tgz","fileCount":25,"integrity":"sha512-YAXkFdRcCbdJ1jQGA69Ujtrbqg/ajGW3fei5olScBp/CvNTzrkIjTGt/Mhq7lsxR9fSshxCTvSSyA+RSotwnDQ==","signatures":[{"sig":"MEQCIHOARDYiQT/jMCQlXgKhItwBF9xn+l7UBTXkywVXI2gDAiBovrx0RtlHLH0RhSWq8Tf5b7jzuCezJMzHDUYm/lJwmA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.22","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":346060},"type":"module","engines":{"node":">=20"},"gitHead":"fbb257b423dc5cce771d600228bffe095c462753","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.22_1789298694687_0.2993436041594506","host":"s3://npm-registry-packages-npm-production"}},"0.1.23":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.23","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.23","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"35e548e2f52d1041f8727aa4f5b20245dc6a1c0a","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.23.tgz","fileCount":25,"integrity":"sha512-4ab9t7TuXLff1y54CyrN3ppq+YxhnwGFC4hkobVw7GBoQ0tmqPcRj2220sRtBu7sNR6++kyniW+6nTmBN+OI8g==","signatures":[{"sig":"MEQCIANF6MhnJlTYcFmUpKrldbytBvxeavhjcZzZYRWDpfPpAiB1ha2PudOS1NJo4pLR4wxrUloqpRWlpY4TU6RNtaRGzg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.23","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":348532},"type":"module","engines":{"node":">=20"},"gitHead":"137db4bde5b2f029175772e37afada58d521466c","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.23_1789504629522_0.024831819283858136","host":"s3://npm-registry-packages-npm-production"}},"0.1.24":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.24","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.24","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"65067028d6b019f1a6ea8c16011cc55b4db24f93","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.24.tgz","fileCount":25,"integrity":"sha512-rjjh8IYFgda06tebZPDK1XpaXPtbBD06M+EXiTH1WFbF/8shjfIWjLRIl1jcMtgh5BOkCc29+9t6CWb6lPaz0Q==","signatures":[{"sig":"MEUCIQCsj0qf880fl2VRNxLZpvY0jhuDHTPAgCpRvmCPwGk+dAIgfMQGe/vlckO6Wp80vfwsbEMRXud8R0r/+NpEBf+Eveg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.24","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":351969},"type":"module","engines":{"node":">=20"},"gitHead":"fd05772d254ebf3be74a5c5eb9f79b6e0c345627","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.24_1789614166286_0.558088619881876","host":"s3://npm-registry-packages-npm-production"}},"0.1.25":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.25","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.25","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"e1418da4b6ff90e69a2efa192487fddaf5e1bc73","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.25.tgz","fileCount":25,"integrity":"sha512-+3Myk2N953Exssrw/ISq4uofXYRun5Fg/gkfuB9LUxYNrrU84Nzpy8uTPJG5n17CmF41OXbUssjoCiUK7GzcLQ==","signatures":[{"sig":"MEQCIB8lA+wbdMQaQDh9OKXzY3Hlcw+ST021xxqMuuNXuH3KAiBw/sKSbFkTCGkOPUCjs/GwiiYoMCfhajtUtPJd29oTeA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGapxFgEY1sngwGINCcQE6Uf+HnlDErtdBMRjy+HmX1NAiAnFfF+1hIkp+9XhPZCXxUIJPymfFkiKUuT4rlTIC4VyA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.25","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":352382},"type":"module","engines":{"node":">=20"},"gitHead":"1dc0588ca2c6e427b829e56c1b7d38376a05c8e2","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.25_1789766204706_0.6085315341718884","host":"s3://npm-registry-packages-npm-production"}},"0.1.26":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.26","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.26","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"6a8f5587c0cdf24ae52b3a9b25c121536709068e","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.26.tgz","fileCount":25,"integrity":"sha512-LPF+Z27EDJdVsrPlXtavXWB5jzcRn/zpXBYwX6RnxV0wJD2oOLmvsaUF8Z+bWSeMmj5HwMKpaKWd9NSfdjQSzQ==","signatures":[{"sig":"MEQCIBp4feDpGFzC6LjAjFyPvUATk2TmH82EQo/EkGV41XwjAiBgTjyCahMZMr6AEZZ5HhF0dbnGKPHoO/GSaMgejg2Nhw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC1neRvvhuGoGnL1Vt9XMiPMzmtNAeyv6IeWIsKdSnPNwIhAMCEPpAGmrM3VxpkZ/MbQX3zO+weCqVluvoRD+6dNybB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.26","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":357952},"type":"module","engines":{"node":">=20"},"gitHead":"a8987ffc6607630a3f55279e6d5c3851d5e2d63e","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.26_1789945869818_0.417725187593178","host":"s3://npm-registry-packages-npm-production"}},"0.1.27":{"name":"@ascenda-one/claude-code-hooks","version":"0.1.27","license":"Apache-2.0","_id":"@ascenda-one/claude-code-hooks@0.1.27","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"bin":{"ascenda-claude-hook":"dist/cli.js"},"dist":{"shasum":"f8ce5ca0863fa817deabc7daa599e950758115be","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.27.tgz","fileCount":25,"integrity":"sha512-WL9JuH/9QtC3WRF0Fg4VmbrCqwUEKmG3mmov3pnXK4PNrKue62186MOWgUTjT5UtSd9RtAOnQrSCM/4j0gQjFw==","signatures":[{"sig":"MEUCIFfzUbhsYEKE4H+rdhL4JEJRZnqvEn40LrONw46z8qHKAiEAg565dvf5Fl3g/PsFmtUwpTUlY9F0R6UYheXGF5uJnSI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFie2iS7b7WaDpo9UZcWmtcy7EVvvWVF0t30Lb7lmXeGAiEA8FQopcGH74FuAp0e4nnDmtBYRMPoMsfJtFhWD4sncds=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.27","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":359074},"type":"module","engines":{"node":">=20"},"gitHead":"d9d373433ffab20f608c8312aca48d661a30fc0e","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"esbuild src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"tmp":"tmp/claude-code-hooks_0.1.27_1790120765414_0.667716406336895","host":"s3://npm-registry-packages-npm-production"}},"0.1.28":{"_id":"@ascenda-one/claude-code-hooks@0.1.28","bin":{"ascenda-claude-hook":"dist/cli.js"},"bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"dist":{"shasum":"98cf7253f4117e0199dfb45a324f7c96e5293ac9","tarball":"https://registry.npmjs.org/@ascenda-one/claude-code-hooks/-/claude-code-hooks-0.1.28.tgz","fileCount":25,"integrity":"sha512-PwcQFlL031GrwBrgBLqjlveDBy919oAnaB7PtsT4AGC3Gw16NCeygc8nf1qVI+vWVyu2ObtBBfHeEG34ICCmTA==","signatures":[{"sig":"MEUCIQCo/wH43JdfK6JN51KjsDmTpplP476KpV/m+no+V+f3WgIgb0lwvoAr0gV6G0RgJakydeFwUqMcWPlpW+GhBHHeZLo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIC6/Lw5LQ0rVJgf52bL136qA/r1Z0JV2zoZEheyPFLZlAiAOuCa1ypRf3cTtgbItAQL8Jyv8GrMhhVFlGMRFI/gQdA=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fclaude-code-hooks@0.1.28","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":407431},"name":"@ascenda-one/claude-code-hooks","type":"module","engines":{"node":">=20"},"gitHead":"a6a2b00ecf617eb77d5bc882b83ff9152409c489","license":"Apache-2.0","scripts":{"test":"node --test --require ./tests/isolateHome.cjs","build":"tsc -p ./ && npm run bundle","watch":"tsc -w -p ./","bundle":"node ../scripts/esbuild-collector.mjs src/cli.ts --bundle --platform=node --format=esm --banner:js=\"import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);\" --outfile=dist/cli.js","test:sample":"npm run build && cat examples/sample-post-tool-use-edit.json | node dist/cli.js PostToolUse","test:compact":"npm run build && cat examples/sample-pre-compact-auto.json | node dist/cli.js PreCompact","test:failure":"npm run build && cat examples/sample-post-tool-use-failure.json | node dist/cli.js PostToolUseFailure"},"version":"0.1.28","_npmUser":{"name":"ascenda-one-com","email":"nathan@ascenda.one"},"homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"_npmVersion":"10.8.2","description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","directories":{},"maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.14.10","@ascenda-one/tool-kit":"*","@ascenda-one/tool-contract":"*"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/claude-code-hooks_0.1.28_1790301226112_0.8082064862906753"}}},"time":{"created":"2026-08-04T21:07:00.908Z","modified":"2026-09-25T01:53:46.507Z","0.1.3":"2026-08-04T21:07:01.233Z","0.1.4":"2026-08-06T02:14:19.828Z","0.1.5":"2026-08-06T02:21:33.447Z","0.1.6":"2026-08-06T03:17:34.299Z","0.1.7":"2026-08-06T11:13:51.099Z","0.1.8":"2026-08-07T00:08:08.394Z","0.1.9":"2026-08-18T00:46:16.516Z","0.1.10":"2026-08-18T03:13:04.620Z","0.1.11":"2026-08-18T03:26:39.742Z","0.1.12":"2026-08-20T07:34:45.131Z","0.1.13":"2026-08-26T02:07:54.901Z","0.1.14":"2026-08-26T06:50:35.031Z","0.1.15":"2026-08-27T07:13:35.542Z","0.1.16":"2026-09-04T03:26:10.372Z","0.1.17":"2026-09-07T01:26:22.976Z","0.1.18":"2026-09-07T04:04:04.143Z","0.1.19":"2026-09-09T00:25:21.967Z","0.1.20":"2026-09-09T02:15:30.465Z","0.1.21":"2026-09-09T08:43:46.157Z","0.1.22":"2026-09-13T11:24:54.807Z","0.1.23":"2026-09-15T20:37:09.664Z","0.1.24":"2026-09-17T03:02:46.400Z","0.1.25":"2026-09-18T21:16:44.814Z","0.1.26":"2026-09-20T23:11:09.922Z","0.1.27":"2026-09-22T23:46:05.496Z","0.1.28":"2026-09-25T01:53:46.202Z"},"bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"license":"Apache-2.0","homepage":"https://github.com/ascendaone-com/ai-engineer-tools#readme","repository":{"url":"git+https://github.com/ascendaone-com/ai-engineer-tools.git","type":"git","directory":"ascenda-claude-code-hooks"},"description":"Claude Code hooks adapter for Ascenda AI workload telemetry.","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"readme":"# Ascenda Claude Code Hooks\n\nClaude Code hooks adapter for Ascenda AI workload telemetry.\n\nPart of [ai-engineer-tools](../). For what these measurements do and do not\nestablish, see [What this measures](../#what-this-measures-and-what-that-does-not-yet-prove).\nEvent mapping: [docs/CLAUDE_MAPPING.md](./docs/CLAUDE_MAPPING.md).\n\n## Role in workload detection (Phase 1)\n\nThis package is the **primary AI interaction load** source in the tooling repo. For AI engineers, digital telemetry from agent workflows is potentially more valuable than wearables in Phase 1.\n\n| Workload input | How this adapter contributes |\n| --- | --- |\n| AIInteractionLoad | Prompts, tool calls, correction loops, compaction |\n| FocusDuration | Long agent loops (`agent_loop_long`) |\n| Workflow friction | Tool failures, context pressure |\n| Verification load | Test/lint/build bash → `editor_verification_activity` / `compile_error` |\n\nSignals feed backend aggregation into creation / verification / supervision composition and the prototype workload score. Subjective strain and meeting load come from the app; baselines from backend Phase 3.\n\n## Architecture\n\n```text\nClaude Code hook adapter\n  -> toolInstallationId + eventWriteToken\n  -> Ascenda backend (POST /v1/tool-events)\n  -> paired anonymous Ascenda user\n  -> workload aggregation + baseline comparison\n  -> app notification / dashboard\n```\n\nSame loose-coupled pairing model as the VS Code and Cursor extensions. See [TOOL_PAIRING_API_REFERENCE.md](../api-docs/TOOL_PAIRING_API_REFERENCE.md).\n\n## Install\n\n### Recommended: the Claude Code plugin\n\nOne command installs this adapter, the work-signals skill, and the MCP server\ntogether — already wired to every lifecycle event, no settings file to edit:\n\n```bash\nclaude plugin marketplace add ascendaone-com/ai-engineer-tools\nclaude plugin install ascenda@ascenda-one\n```\n\nFrom inside a session, use `/plugin marketplace add …` then `/plugin install …`.\nSee [ascenda-agent-skills](../ascenda-agent-skills/) for what the bundle holds.\n\n### Alternative: this adapter on its own\n\nIf you want the deterministic hooks without the skill or MCP server, the\npublished package runs with no clone and no build:\n\n```bash\nnpx @ascenda-one/claude-code-hooks setup\n```\n\nThis pairs (printing a 6-digit code to confirm in the Ascenda app), installs a\nself-contained hook bundle to `~/.ascenda/bin`, writes\n`~/.ascenda/credentials.json`, and registers the hooks in this project's\n`.claude/settings.local.json`. Restart Claude Code and events flow — no shell\nexports, no settings file to hand-edit.\n\n```bash\nnpx @ascenda-one/claude-code-hooks status      # exits non-zero if anything is unwired\nnpx @ascenda-one/claude-code-hooks uninstall   # removes hooks and the binary\n```\n\n| Option | |\n| --- | --- |\n| `--api-base-url <url>` | ingest host (default `https://api.ascenda.one`) |\n| `--local [port]` | shorthand for a local [dev server](../ascenda-dev-server/) (default `4477`) |\n| `--tool-installation-id <id>` / `--token <t>` | reuse an existing pairing instead of creating one |\n| `--no-pair` | install the local half only: hooks work, nothing is sent |\n| `--scope project\\|user` | register in this project (default) or in `~/.claude/settings.json` |\n| `--project-dir <path>` | project root for `--scope project` (default cwd) |\n| `--dry-run` | print what would change, write nothing |\n\nFrom a clone, `./scripts/setup-local.sh` builds the workspace, starts the dev\nserver detached, and runs the same `setup --local` — no backend, no phone, no\nDevAuth. Stop it with `./scripts/setup-local.sh --stop`. See\n[TESTING.md](../TESTING.md).\n\n#### What setup writes\n\n| Path | |\n| --- | --- |\n| `~/.ascenda/bin/ascenda-claude-hook` | the self-contained bundle — no `npm -g`, no sudo, no PATH edit |\n| `~/.ascenda/credentials.json` | `apiBaseUrl` + `toolInstallationId`, `0600` (plus `localOnly` on an install with no pairing) |\n| `~/.ascenda/tokens/<id>` | the event write token, `0600`, rotated in place on renew |\n| `.claude/settings.local.json` | one hook entry per lifecycle event, `timeout: 5` |\n\nRegistration is idempotent and marker-keyed: re-running replaces our entries\nrather than appending, hooks belonging to anyone else are left alone, and the\nfile is backed up to `.ascenda-backup` before the first write. Settings that\nare not valid JSON abort the run rather than being overwritten.\n\nHooks then need **no environment at all**: the command pins the absolute path\nof the Node that ran setup, and configuration comes from the credentials file.\nClaude Code spawns hooks with whatever environment it was launched from, so\nanything depending on shell exports stops working the moment the editor is\nopened from a launcher rather than a terminal. The variables below still\noverride the file when set.\n\n`status` also flags hook entries pointing at a binary that no longer exists —\nthose fail silently on every event otherwise. It checks one scope, defaulting\nto `project` like `setup`; if it finds nothing there it looks in the other one\nand says where the hooks actually are. User settings apply in every project, so\nhooks found there answer a project-scope check.\n\n#### Installing without a pairing\n\n`--no-pair` installs the hooks and stops before pairing. A `setup` that tried\nto pair and couldn't finish — the backend unreachable, nobody at the keyboard\nto confirm the code, the session expired — lands in the same place instead of\nfailing. The install completes either way, and the summary names which half is\nrunning:\n\n```text\nInstalled, not paired.\n  active       the session prompts, and the live signal to a socket on this machine\n  inactive     delivery to https://api.ascenda.one. Nothing is sent, and nothing is queued for later.\n  pair later   npx @ascenda-one/claude-code-hooks pair\n```\n\nTwo things work with no pairing at all, which is why this mode exists. The\nsession prompts are composed locally in the hook process. The live signal goes\nto a socket on your own machine, so a listener there sees an agent working the\nmoment it starts. Neither owes anything to a backend, and gating the install on\none kept them from the people still setting Ascenda up.\n\nWhat that install holds: the hook binary, the registered events, and a\ncredentials file with an installation id, `localOnly: true` and `installedAt`.\nNo `pairedAt` and no token — nothing here fabricates a credential it doesn't\nhave. The id is the part that matters later. `pair` claims that same id, so the\nhooks already registered in your settings file end up paired; the flag is\ndropped and `pairedAt` takes its place.\n\nDelivery is a deliberate no-op until then. Nothing is sent, nothing is queued,\nand the send journal stays empty rather than recording an outage on every hook\nevent. An absent token on an install that *was* paired is a different matter:\nthat's a revoked or deleted credential, and it goes on being reported. `status`\nand `doctor` both distinguish the two:\n\n```text\npairing        claude_code:… (not paired, installed 2026-09-23T05:13:40.907Z)\ntoken          — none until this install is paired\ndelivery       inactive — nothing is sent, and nothing is queued for later\nlocal features active — the session prompts and the live socket signal need no pairing\nhooks          10/10 registered in ~/.claude/settings.json\n```\n\n`uninstall` removes an unpaired install the same way, and says there is no\ntoken to revoke. It leaves any other agent's pairing in the credentials file\nwhere it is.\n\n### Pairing by hand (if you skip `setup`)\n\n`setup` pairs for you. To pair this machine directly instead:\n\n```bash\nnpx -y @ascenda-one/claude-code-hooks pair\n```\n\nIt prints a 6-digit code — confirm it in the Ascenda app under\n**Connections → Ingest telemetry** — then saves the write token to\n`~/.ascenda/tokens/` and the pairing to `~/.ascenda/credentials.json`. Restart\nClaude Code; there is nothing to add to a shell profile. The token itself is\nnever copied around — every CLI tool reads it from the file `pair` wrote. (The\neditor extension's pairing cannot be reused here: its token lives in the\neditor's private secret storage.)\n\nRun on a machine `setup` has already touched, `pair` attaches to the\ninstallation that file names instead of minting a second one, and pairs against\nthe host recorded there. That's what finishes a `--no-pair` install.\n\n`--tool-type <type>` pairs something else CLI-shaped that has no `setup` of its\nown. An explicit type always mints its own id: naming a different tool is\npairing a second one, not re-pairing this one, and reusing the id there would\nfile the new tool's work under the old tool's identity.\n\n> **How a hook names itself**, in order: `ASCENDA_TOOL_INSTALLATION_ID` if it is\n> set, then `~/.ascenda/credentials.json`, then the token store — where exactly\n> one `claude_code` token means its filename is the id. With none, or several,\n> every hook invocation records a `skipped_no_installation_id` attempt in the\n> journal and exits saying so, rather than silently minting a second, unpaired\n> identity that would fragment your telemetry across two installations.\n>\n> The environment variable is per *machine*, while the credentials file is per\n> *tool* — so exporting one id on a machine running two agents sends both\n> agents' work under it. Prefer the file, which both `pair` and `setup` write.\n\nOn a Dev backend with no phone, [pairing-sim](../ascenda-pairing-sim/) stands in\nfor the app:\n\n```bash\ncd ../ascenda-pairing-sim && npm run build\nnode dist/cli.js e2e --tool-type claude_code\n```\n\nOptional environment:\n\n| Variable | Purpose |\n| --- | --- |\n| `ASCENDA_API_BASE_URL` | Backend to send to. Defaults to `https://api.ascenda.one`; use `http://localhost:5002` or the Azure Dev host for development |\n| `ASCENDA_EVENT_WRITE_TOKEN` | Only if you have no prior pairing to reuse — normally the token file supplies this |\n| `ASCENDA_EVENT_WRITE_TOKEN_FILE` | Override token file path (default `~/.ascenda/tokens/<toolInstallationId>`) |\n| `ASCENDA_SESSION_ID` | Stable session id across hooks |\n| `ASCENDA_WORKSPACE_HASH` | Override only. By default the hook derives this from the payload's own `cwd`: a machine-salted hash of the checkout folder's basename (never the path itself) |\n| `ASCENDA_PROJECT_HASH` | Override only. Defaults to the salted hash of the canonical repository's basename — a git worktree folds into the repo it was created from |\n| `ASCENDA_STATE_FILE` | Override the send journal path (default `~/.ascenda/state/<toolInstallationId>.json`) |\n| `ASCENDA_OUTBOX_FILE` | Override the outbox path (default `~/.ascenda/state/<toolInstallationId>.outbox.jsonl`) |\n| `ASCENDA_OUTBOX_DRAIN` | `true` lets the next hook re-send queued events. **Off by default** until the ingest endpoint is confirmed to dedupe live events on `idempotencyKey`; see \"When the collector cannot reach Ascenda\" |\n| `ASCENDA_DISABLE_FAILURE_NOTICE` | `true` silences the one-time in-session notice about a collector that has stopped delivering |\n\nOn first run the CLI seeds `~/.ascenda/tokens/<toolInstallationId>` so\n**tool-scoped renew** can persist rotated tokens without you editing anything.\n\n### Cloud sessions\n\nA hosted Claude Code session (Claude Code on the web, or one it spawns) runs in\na fresh container every time. Its transcript never reaches your machine, so a\nhistory import can't see it and these hooks are its only record. Every event\ncarries `metadata.runtime`: `cloud` when Claude Code sets `CLAUDE_CODE_REMOTE`,\n`local` otherwise.\n\nNothing under `~/.ascenda` survives a session there, so everything the hooks\nneed comes from the environment's settings:\n\n| Variable | Why |\n| --- | --- |\n| `ASCENDA_TOOL_INSTALLATION_ID` | The installation to send as. Pair one just for cloud sessions (run `pair` inside one); don't reuse your laptop's pairing, which re-pairing would rotate. |\n| `ASCENDA_EVENT_WRITE_TOKEN` | Its write token. |\n| the salt, `~/.ascenda/salt` | Without it every session mints a new one and one repository turns into a new project hash every time. Have whatever launches the hooks write a fixed value there first. Your laptop's value makes cloud and local hashes match. |\n\nThe environment's network access must also allow the Ascenda API host.\n\n**Tokens never rotate in a cloud session.** Renewal revokes the previous\ntoken, and the replacement would die with the container, taking the\nenvironment's copy down for every later session. So the hooks record a\nrejected token as a failed send and stop there. Tokens last 30 days; when one runs out, pair again\nand replace the token in the environment.\n\n### Register hooks manually\n\nThe plugin does this for you — this section is only for the standalone route.\nMerge [`examples/settings.local.json`](./examples/settings.local.json) into\n`.claude/settings.local.json` in a project, or into Claude Code's user settings\nfor machine-wide coverage:\n\n```json\n{\n  \"hooks\": {\n    \"SessionStart\": [{ \"hooks\": [{ \"type\": \"command\", \"command\": \"npx -y @ascenda-one/claude-code-hooks SessionStart\", \"timeout\": 5 }] }],\n    \"UserPromptSubmit\": [{ \"hooks\": [{ \"type\": \"command\", \"command\": \"npx -y @ascenda-one/claude-code-hooks UserPromptSubmit\", \"timeout\": 5 }] }],\n    \"PreToolUse\": [{ \"hooks\": [{ \"type\": \"command\", \"command\": \"npx -y @ascenda-one/claude-code-hooks PreToolUse\", \"timeout\": 5 }] }],\n    \"PostToolUse\": [{ \"hooks\": [{ \"type\": \"command\", \"command\": \"npx -y @ascenda-one/claude-code-hooks PostToolUse\", \"timeout\": 5 }] }],\n    \"PostToolUseFailure\": [{ \"hooks\": [{ \"type\": \"command\", \"command\": \"npx -y @ascenda-one/claude-code-hooks PostToolUseFailure\", \"timeout\": 5 }] }],\n    \"PreCompact\": [{ \"hooks\": [{ \"type\": \"command\", \"command\": \"npx -y @ascenda-one/claude-code-hooks PreCompact\", \"timeout\": 5 }] }],\n    \"PostCompact\": [{ \"hooks\": [{ \"type\": \"command\", \"command\": \"npx -y @ascenda-one/claude-code-hooks PostCompact\", \"timeout\": 5 }] }],\n    \"Stop\": [{ \"hooks\": [{ \"type\": \"command\", \"command\": \"npx -y @ascenda-one/claude-code-hooks Stop\", \"timeout\": 5 }] }],\n    \"Notification\": [{ \"hooks\": [{ \"type\": \"command\", \"command\": \"npx -y @ascenda-one/claude-code-hooks Notification\", \"timeout\": 5 }] }],\n    \"SessionEnd\": [{ \"hooks\": [{ \"type\": \"command\", \"command\": \"npx -y @ascenda-one/claude-code-hooks SessionEnd\", \"timeout\": 5 }] }]\n  }\n}\n```\n\nKeep the timeouts. Without one Claude Code gives a hook up to 600s, and all\nSessionEnd hooks share 1.5s between them.\n\n### Verify\n\n```bash\nnpx -y @ascenda-one/claude-code-hooks doctor\n```\n\n`doctor` prints the installation id and where it came from (environment,\ncredentials file, or the token store on disk), the token's presence and age,\nthe last recorded send outcome, any sends skipped for want of an installation\nid, and the result of a live round trip against the real ingest endpoint. It is the first thing to run when the Ascenda app shows a\nconnected tool that is not producing data.\n\nA telemetry failure never blocks your turn: **every hook invocation exits `0`**,\nincluding one that failed to send. Do not read the exit code — or stderr, which\nClaude Code discards for a hook that exits `0` — as evidence of anything. Read\nthe journal instead.\n\n### When the collector stops sending\n\nEvery send attempt — success included — is recorded to\n`~/.ascenda/state/<toolInstallationId>.json`:\n\n```json\n{\n  \"lastAttemptAt\": \"2026-08-17T08:05:17.436Z\",\n  \"lastSuccessAt\": \"2026-08-17T08:05:04.782Z\",\n  \"lastOutcome\": \"auth_failed\",\n  \"consecutiveFailures\": 1,\n  \"httpStatus\": 401,\n  \"errorCode\": \"invalid_token\",\n  \"failingSince\": \"2026-08-17T08:05:17.436Z\"\n}\n```\n\nSuccesses are recorded deliberately. If only failures were written, an absent\njournal would mean both \"healthy\" and \"never ran\" — and telling those apart is\nthe entire problem. A `lastAttemptAt` that is minutes old with\n`\"lastOutcome\": \"accepted\"` is positive evidence of health; one that is hours\nstale means the collector is not running at all, which is a different fault with\na different fix.\n\nWhen an installation transitions into a failing state, the next `SessionStart`\nor `PostToolUse` adds **one** line of context to the session naming the cause\nand offering `doctor` and `pair`. It appears once per outage, not once per tool\ncall, and never repeats until the collector has recovered and failed again.\n\n`lastSeenAt` in the Ascenda app cannot substitute for any of this: it cannot\ndistinguish a dead token from a night's sleep, because both are \"no events\".\nOnly the collector knows it tried and was refused.\n\n### When the collector cannot reach Ascenda\n\nA send that fails without a verdict — the endpoint unreachable, a timeout, a\n`429` or `5xx` — is retried once after 250 ms and then **kept**, not dropped.\nThe payload is appended to an outbox next to the journal:\n\n```\n~/.ascenda/state/<toolInstallationId>.outbox.jsonl\n```\n\none JSON line per event, exactly as it would have gone on the wire, plus the\ntime it was queued. Anything longer than a blip — a laptop waking from sleep,\na VPN reconnecting, a captive portal, a slow network on a train — used to lose\nevery event for its duration with no copy anywhere. Now it costs nothing but\ndelay. A rejection *with* a verdict (`400`, `401`, `403`) is not queued:\nreplaying it cannot change the answer.\n\nThe next hook invocation drains the outbox, oldest first, one batch of up to\n100 per invocation and never with a backoff loop — the hook is on your\ncritical path, and the invocation after that is usually seconds away. An\nentry is deleted when the server answers `accepted` **or** `duplicate`; a\nduplicate means the server already had it, which is the point of the\n`idempotencyKey` every event carries. If the door refuses again, the pass stops\nwith everything still on disk, and the live event joins the queue instead of\nknocking on a door that just said no.\n\n> **Sending from the outbox is off by default.** Set `ASCENDA_OUTBOX_DRAIN=true`\n> to enable it. A drain against an ingest endpoint that does not yet dedupe\n> live events on `idempotencyKey` would land every queued event a second\n> time — the exact double-count that blocked this queue until the key existed.\n> Until the deployed backend is confirmed to answer a replay with `duplicate`,\n> events are queued, bounded and reported, but not re-sent.\n\nThe outbox is bounded: 10,000 entries and 7 days. When a bound evicts, the\ndiscard is recorded in the journal as `\"lastOutcome\": \"outbox_discarded\"` with\na cumulative `outboxDiscarded` block — how many, when, why, and how far back\nthe loss reaches. It survives every later success, because a gap that has\nsince closed is still a gap in the data.\n\n`doctor` reads all of this:\n\n```\n  Outbox                ~/.ascenda/state/claude_code_….outbox.jsonl\n  Outbox depth          37 waiting — oldest queued 2026-09-03T01:12:08.114Z (3h 41m ago)\n  Outbox drain          off (queued events are kept and bounded, not sent) — ASCENDA_OUTBOX_DRAIN\n  Outbox discarded      12 total; last 12 at 2026-09-02T… (12 age, reaching back to 2026-08-25T…)\n```\n\nA non-empty outbox is the honest health answer. `consecutiveFailures` resets\non the first success after an outage; the outbox says events from that outage\nare still on this machine.\n\nHooks overlap — Claude Code fires `PreToolUse` and `PostToolUse` from separate\nprocesses — so appends use `O_APPEND` (whole lines, never fragments) and a\ndrain takes the file by renaming it out from under concurrent appenders. An\nentry is never deleted before the server has confirmed it; a drain that dies\nmid-way leaves a claim file that the next drain sweeps back in.\n\n## Build from source\n\nNot needed to use this — both routes above ship prebuilt. It is here because\n\"read what runs on your machine\" is a fair thing to want from a telemetry tool.\n\n```bash\n# from the repo root (workspace install + shared packages first)\nnpm install\nnpm run build:shared\n\ncd ascenda-claude-code-hooks\nnpm run build\nnpm link                 # or ./scripts/install-local.sh\n\nwhich ascenda-claude-hook\nascenda-claude-hook      # prints usage when passed no hook name\n\nnpm run test:sample      # pipes a sample PostToolUse payload through the CLI\nnpm run test:compact\n```\n\nA local build exposes the binary as `ascenda-claude-hook` — substitute it for\n`npx -y @ascenda-one/claude-code-hooks` in the hook config above. If it is not\non Claude Code's PATH, use an absolute path such as\n`/Users/<you>/.nvm/versions/node/<ver>/bin/ascenda-claude-hook`.\n\n## Supported Claude hook events\n\n```text\nSessionStart\nUserPromptSubmit\nPreToolUse\nPostToolUse\nPostToolUseFailure\nPreCompact\nPostCompact\nStop\nNotification\nSessionEnd\n```\n\n## Ascenda event mappings\n\nFull mapping: [docs/CLAUDE_MAPPING.md](./docs/CLAUDE_MAPPING.md). Catalog-only event types (no aliases).\n\n```text\nSessionStart       -> create_focus_session (startup and resume; clear and compact are skipped)\nUserPromptSubmit   -> ai_prompt_submitted / ai_correction_prompt\nPreToolUse         -> ai_tool_call_started\nPostToolUse Edit   -> ai_file_edit\nPostToolUse Write  -> ai_file_write\nPostToolUse Bash   -> editor_verification_activity / ai_tool_call_completed (success only)\nPostToolUseFailure -> compile_error / ai_tool_call_failed\nPreCompact         -> context_compression_manual / context_compression_auto\nPostCompact        -> context_pressure_high\nStop               -> ai_turn_completed (every turn), agent_loop_long (long only)\nNotification       -> supervision_interruption (interruptionKind only, never the message)\nSessionEnd         -> recovery_offline_period (activity session_ended, sessionEndReason)\n```\n\n## Privacy defaults\n\nMetadata-only telemetry. Does not send raw prompts, responses, code, file names, repository names, branch names, or terminal output.\n\nWhen the agent stops and waits for you, `Notification` records only which kind\nof wait it was — `permission_request`, `idle_prompt` or `other`. The\nnotification's own wording is read to pick one of those three labels and is\nthen discarded; it never leaves the hook process, and neither does anything you\nanswer. `tests/interruptionContentGuard.test.mjs` fails the build if that\nchanges.\n\nRepository and branch identity travel only as machine-salted digests, derived\nin the hook process and never as text: `workspaceHash` and `projectHash` from\nthe checkout's and repository's folder names, and `metadata.branchHash` from\nthe branch the checkout is on. The salt is random per machine, stored at\n`~/.ascenda/salt`, and never transmitted — without it, a digest of a name from\na short list is recoverable by guessing. A branch name is low-entropy in\nexactly that way, so the branch digest is not a security boundary; it is what\nlets work be grouped by branch on the other side without the name itself\nleaving the machine. On a detached HEAD, outside a checkout, or with no\nreadable salt the key is omitted entirely rather than sent blank.\n\nCorrection detection uses local pattern matching on prompt text in the hook process only — classified metadata (`reason: repeated_reprompting`) is sent; raw prompt text is not.\n\n## Roadmap\n\n| Phase | Scope |\n| --- | --- |\n| Phase 1 | Hook mappings, metadata-only ingest, shared pairing tokens |\n| Phase 2 | Standalone CLI pairing (`ascenda-claude-pair`) |\n| Phase 3 | Session rollup metadata aligned with backend baselines |\n\n## Compliance\n\n`consentScope: ide_telemetry` and `provenance: ai_work_telemetry` on every\nevent. Australian-hosted backend. Not a medical device — workload\nself-awareness only, no diagnosis, no clinical claim. Consent is revocable from\nthe app at any time; after revocation ingest returns `401`.\n","readmeFilename":"README.md"}