{"_id":"@ascenda-one/history-import","_rev":"17-809fbcff7e76ec625626ac4a3fdd80e6","name":"@ascenda-one/history-import","dist-tags":{"latest":"0.1.28"},"versions":{"0.1.12":{"name":"@ascenda-one/history-import","version":"0.1.12","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"b6a4f420f6f3845e7a52d23d233fbb15a009769a","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.12.tgz","fileCount":28,"integrity":"sha512-QZPdDOjgoJrUPi2lLmSaEtZT4IAxEcWVKykUn5lpIdkKAZrlEecbLC3b/KGABjP6DWOnfaQgbFKVb4I0ylYVFw==","signatures":[{"sig":"MEQCIC4TKqBsAvjXG0Jj3syJomZsD754yd1noF39QdydBbZEAiBmuvh2kX6SLpvdF3Pc804nJ2UyLxJ4YHLXRjG23HIRSg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":391293},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Cursor and VS Code stores.","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/history-import_0.1.12_1787211299918_0.5079484211281498","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"@ascenda-one/history-import","version":"0.1.13","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"7653feced8da2ab2f390ef2d10531b421582dafb","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.13.tgz","fileCount":30,"integrity":"sha512-AxbnsT9z7260Z9O6DGY5+q4XDf4LqfQevx0h7RtTrmWqWOJQV5P5XyeYd66hmu5EpJbWZkm/qc2y+YHx0bdl/w==","signatures":[{"sig":"MEQCIE4HDSTcpPjqjJsNSpjqjzHpS9nl+Ky5YUs/c7AG5qB2AiBO8cCdzRouujzAwjjeKxqjaGWJlh2Q9WsLBTMiHk6Rzw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":492399},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Cursor and VS Code stores.","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/history-import_0.1.13_1787710086746_0.8693997584792039","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"@ascenda-one/history-import","version":"0.1.14","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"ebe59761111bdc1b74a0052c6b762ddcae622a85","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.14.tgz","fileCount":30,"integrity":"sha512-akMOtYoFgKalL5nWKaDZ1cXmLbYng4xS4suTt+OxhUCBmZy3jLHIgOVAvJfyGnAP9SWNrEsnRpo3pYLmzs0v+Q==","signatures":[{"sig":"MEYCIQD3KYaOf5EptE8BiIPfLnwCIprrLxUh+PxnQCDzB/i20QIhAOeZqlcjl3gVFQGyjyGpydVsmqkn51aYy5H1FPasxx96","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":494452},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Cursor and VS Code stores.","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/history-import_0.1.14_1787727056549_0.24847599476626137","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"@ascenda-one/history-import","version":"0.1.15","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"61bede8fa745b49e321e0e44a62330edadae6441","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.15.tgz","fileCount":32,"integrity":"sha512-XaWY3lrOlwlwYnn9rZXlh+qvZB+RVlQvuKJhLYBu7DR8mBYtwUBesRv+OArziCUBWeOCoYv46+TE3/peny4a7g==","signatures":[{"sig":"MEYCIQC6VzNZrKtaORqXosJ/K385n/v7hq419S3iGzJ5TB6F2gIhANwwd+3J0MHZ+1E5W4auIjlirURS2zZLDkn1apAqLSQQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":534046},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Cursor and VS Code stores.","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/history-import_0.1.15_1787814827291_0.3317040318859992","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"@ascenda-one/history-import","version":"0.1.16","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"8df45ceebdb7cd65746dd3161b1f81546fe202d7","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.16.tgz","fileCount":34,"integrity":"sha512-UcX1JYxG8CI4WnxwxwIkBgmT90x9yT6Q/9r3vgTr6/9Myt3vE0VticRZns4Lk6jrWScx4EdrMqNKf/ku3J0tlQ==","signatures":[{"sig":"MEYCIQD3dZqVLD82virVMzq3nB1XXQp1Oe1MbU2fXDKYurRN6QIhAOkEx1/m38P7y4odSRXegX/emDzapHrbQWjeKUzeIWHY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.16","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":645645},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Cursor and VS Code stores.","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/history-import_0.1.16_1788492390647_0.13552714294801094","host":"s3://npm-registry-packages-npm-production"}},"0.1.17":{"name":"@ascenda-one/history-import","version":"0.1.17","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"1208c970ac3f5a14972a89f2e9f9810d737f49f0","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.17.tgz","fileCount":38,"integrity":"sha512-YJdgTxFeJ23NorxcX7v7OQrm6QubqXgfXpE1O9HlFHaYytGqNv/dvRrY5p0dfqm59RsJRPrdf0uHkIqOQWzvOQ==","signatures":[{"sig":"MEYCIQD6gsfSsGE0YSZ4yIVx82RQqyq818f9xN1Q9rOOBOPUSAIhANtZEbfZwwtoR/v6BC30Nlx0prXpYLHKL65jiMOUiHoF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.17","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":767170},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Codex, Cursor and VS Code stores.","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/history-import_0.1.17_1788744402214_0.3477310309025061","host":"s3://npm-registry-packages-npm-production"}},"0.1.18":{"name":"@ascenda-one/history-import","version":"0.1.18","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"d7e15add71f217e98e8a9d852989bebf1bb56c22","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.18.tgz","fileCount":38,"integrity":"sha512-jCuh/s+UyiZsXGhKMyNKhkB7JGbMbo2IRfAuLLpZBOmD5rIjDsgyxVamvMn4GZCR79oouKxb6od3N/Y4cj3TKw==","signatures":[{"sig":"MEUCIHdTRIehvK6ncTPYd6DwwI5YSLilaSBA0gf748AH8+WpAiEAucNzLHEhVuRjksnTIIEGldqVWNOBr1olZo3wywooMcI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.18","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":770403},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Codex, Cursor and VS Code stores.","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/history-import_0.1.18_1788753863208_0.5686401202392217","host":"s3://npm-registry-packages-npm-production"}},"0.1.19":{"name":"@ascenda-one/history-import","version":"0.1.19","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"0470012e614893616647be7ac77ccc0399030242","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.19.tgz","fileCount":44,"integrity":"sha512-E67Mf8uea6uCK3ktcKzOoqEGi/0W/FpxxzeA5AiymOqNxZQL6rAFgtImkOMsy79ZThCmJb7aJv0YAdIiw610fQ==","signatures":[{"sig":"MEYCIQDY7GhJUfKvV77iz0Ui1vgrSHPCK06eXHbBMa+7NDu8JgIhAJE6RFhtXYwi3bfSTWTYgivGkpA+1eHN0vfwMQ3sbdTo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.19","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":810640},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Codex, Cursor and VS Code stores.","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/history-import_0.1.19_1788913542677_0.2756133619501593","host":"s3://npm-registry-packages-npm-production"}},"0.1.20":{"name":"@ascenda-one/history-import","version":"0.1.20","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"deee2ac58b887df3a381942b29b07461b817396c","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.20.tgz","fileCount":44,"integrity":"sha512-5umL3+zWjqQPnNksFPxI8GOGqO8QVW0GM5bYnFFNAf9Hhtd0DRlJ/5/E/RuTgOr80gimUdRwzZahtZ7bSAxolg==","signatures":[{"sig":"MEUCIQD8ISqMrZ+mozSbsmeufxu1CbQW9E5KmL2oJMWxCqKOPQIgeYMQ/o3UPugfvtlMkZS3g4bnUfi+ZVDEe/nf++2FB5c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.20","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":810855},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Codex, Cursor and VS Code stores.","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/history-import_0.1.20_1788920148820_0.2813914700988398","host":"s3://npm-registry-packages-npm-production"}},"0.1.21":{"name":"@ascenda-one/history-import","version":"0.1.21","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"03883fec6dfa45e4d7c608f6e1acffd8173084b9","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.21.tgz","fileCount":44,"integrity":"sha512-+rZs5S/eMLnc9HMGxAG58SFvOoPafH7vh2Ss97Yt4uODEm4ZjKJf0LQPPaymoPI9z9dk7rnozf6kZCYJNSNvpQ==","signatures":[{"sig":"MEUCIQDKtr9SetdTXpuitbbOE/qD4MACOtF3mvp2aQcnlWytKgIgTk5aTZvUyQJyIIflJhppxtKWR3laF2G1fIiWgxuMieA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.21","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":811742},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Codex, Cursor and VS Code stores.","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/history-import_0.1.21_1788943456722_0.7076603618907069","host":"s3://npm-registry-packages-npm-production"}},"0.1.22":{"name":"@ascenda-one/history-import","version":"0.1.22","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"777645e1cf7d08515042f0db0dd4474f48632a77","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.22.tgz","fileCount":44,"integrity":"sha512-Qedro8kI+smPKj4cLh3lkI35XHDXHunyfi1ijovf18SenHmhmfKVL/j5yP2ZDaOqQQLBhYbN4dQwZwnb6tVtLQ==","signatures":[{"sig":"MEUCIQD3vae/eDFSAJws+KzXXUKhgHzK9PqxdaNhtuZt5qKCDgIgGFFBEM74HOXK1Q/O1R3XIJIScx8aM494q1fySBAiNbs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.22","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":827832},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Codex, Cursor and VS Code stores.","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/history-import_0.1.22_1789298714345_0.21145324037231172","host":"s3://npm-registry-packages-npm-production"}},"0.1.23":{"name":"@ascenda-one/history-import","version":"0.1.23","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"acdd214f31b54f0e8610a183f7a80bd886e66775","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.23.tgz","fileCount":46,"integrity":"sha512-SPRI+7Bm4Wkal9nbF+qYX9a3mF3zTyslf7RCbDEhgrxH1w6VCeroThQQ7sw7ukWg8Tg6UEeyB31B76Rx12UlBA==","signatures":[{"sig":"MEUCIA6wWNC03itH+L7Ns0ahH2oCTjKorNT3At8pB+7NZX/AAiEAypRpjGXnQTxw3pwzR5zoJKVMGoQxBEQuz8NB3hd0gNM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.23","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":852276},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Codex, Cursor and VS Code stores.","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/history-import_0.1.23_1789504665498_0.27995840914560066","host":"s3://npm-registry-packages-npm-production"}},"0.1.24":{"name":"@ascenda-one/history-import","version":"0.1.24","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"07715c2b121c3f98c2317a95e9c9c2ac8eb34c7a","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.24.tgz","fileCount":46,"integrity":"sha512-AiTEcBXC6C9pyc+CdHkhC9z+zQ846jqApkd2HPlyrubxycrE8mplAN8qbjXmt9usOE0opxEbSVF2wNAy2tlgFw==","signatures":[{"sig":"MEUCIQDWqhKMXka8uClmh6eE70X96TlOvqAZGwIoWd/d5bbeqQIgRBz0/E4k4H6sBPxMNIuIMN2JLc1mNesgsRn6BGw8Vf4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.24","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":852345},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Codex, Cursor and VS Code stores.","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/history-import_0.1.24_1789614187149_0.8467151499184216","host":"s3://npm-registry-packages-npm-production"}},"0.1.25":{"name":"@ascenda-one/history-import","version":"0.1.25","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"f87d1d0ad5c66570b346e991d33ab3c7d20ec8a0","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.25.tgz","fileCount":48,"integrity":"sha512-F7d5XdZj7jsBaDWVUkBTR76s46CX72wuVMI3DrTbXXsikNuUV2bmx5CuJ19oGQQPd8wiJHirHJFIE9iYrG7/tg==","signatures":[{"sig":"MEYCIQDaYIVgQNB+fpH4QzjyxirGOn5nugrPJPG6ZIf+953n7QIhAM8OHDObKbQtjS4uS+kcTsm8GR2F3akbIRpJZ/4OWbBa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIH+mPB8e7dJu0pfuQqSb+1ILBxgaZGVwShw8urAttP4BAiA9N+zfB/+9QTSDbuavJY7k5dJ+qFdLx64Bp6ZCynhnQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.25","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":881415},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Codex, Cursor and VS Code stores.","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/history-import_0.1.25_1789766203061_0.2748761625537761","host":"s3://npm-registry-packages-npm-production"}},"0.1.26":{"name":"@ascenda-one/history-import","version":"0.1.26","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"214a9035dc01c3ab972a8ebf36238ba65bdf1d4e","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.26.tgz","fileCount":48,"integrity":"sha512-j2xsZWltM4fM6DvbzQe9VWM4PohdHskpmeYo1qHCNZi7UXZt9obh9SyfhbpBwUPihz8NEBwnim9MB9FZ8vkqAg==","signatures":[{"sig":"MEYCIQCYxeATxhnm4znef0nWBE1c2ii8WaJJgAefSTqpkJ6+HQIhAMeRrbFflJVNtDCgNxOoqIAsCIVKRPndGTnWw+aFfQSM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC+LMEghk2NsjGyCY4ypeNAk0u5DYw3p7uJO1iSp9SWNgIhAKJKwgXdKkJXeZREyl/egTG/wveIjXbPUt/RG+V9Id0f","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.26","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":920638},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Codex, Cursor and VS Code stores.","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/history-import_0.1.26_1789945887245_0.9676346383367813","host":"s3://npm-registry-packages-npm-production"}},"0.1.27":{"name":"@ascenda-one/history-import","version":"0.1.27","license":"Apache-2.0","_id":"@ascenda-one/history-import@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-history-import":"dist/cli.js"},"dist":{"shasum":"f0e34b7e190d15c7302f041b45c33d6cfc785f4c","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.27.tgz","fileCount":48,"integrity":"sha512-nBiQajPMGoQV7aK5NRc9YlNWewXgEOeEh4B5oAyuSNp/jkFQ+ygLyWIDt5ffZLZL9yLefd6gDsLp8846TPlnmQ==","signatures":[{"sig":"MEQCIE4dIpcPIYPS5NFzOQeCdEmSS17GJo2PZtk/vX336N53AiAwAa9b02IdTkewdCt3pimYnmxpKCJ3LlDPsYYxrjF2Cg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDtZkaJDa2JlkCvMaGzgI46ZEIa0Gumij1V4UE6GpapxAiAEqU/Ltl34qgGFOcNhqKyo0gYsQT6LQS9/CI1qNpcPOA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.27","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":921760},"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"},"_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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Codex, Cursor and VS Code stores.","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/history-import_0.1.27_1790120763480_0.2995850747963862","host":"s3://npm-registry-packages-npm-production"}},"0.1.28":{"_id":"@ascenda-one/history-import@0.1.28","bin":{"ascenda-history-import":"dist/cli.js"},"bugs":{"url":"https://github.com/ascendaone-com/ai-engineer-tools/issues"},"dist":{"shasum":"ff010e7c70c355b083942a35c323523bde734c0c","tarball":"https://registry.npmjs.org/@ascenda-one/history-import/-/history-import-0.1.28.tgz","fileCount":48,"integrity":"sha512-nHqNqBkrJ8foPoEFYyifgY4XRL9oVfRtt4MEjnNPJhu0oalQ4zxEENdGAjLchM+PEb+Oo12qKKyudpL9DPTQrg==","signatures":[{"sig":"MEUCIQDwbYr9QzzdF1fJ6Jm1hLhw32tIXTH2/NYZNaLd8OMvkgIgY5gV2tduKBF27dFv7HZXtuD/Sb2BdZ79tzLXRNCyKjs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFOlbe5NPi9HTeYOKdVwrAoNHHaHa2whJFzF1mBJiP1OAiA/FnC/2GCbeDUN/Zu49ztTs+oZRJewrIt6MNnH7qSH+g=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ascenda-one%2fhistory-import@0.1.28","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":936496},"name":"@ascenda-one/history-import","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"},"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-history-import"},"_npmVersion":"10.8.2","description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Codex, Cursor and VS Code stores.","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/history-import_0.1.28_1790301276600_0.9987019843592275"}}},"time":{"created":"2026-08-20T07:34:59.772Z","modified":"2026-09-25T01:54:37.014Z","0.1.12":"2026-08-20T07:35:00.051Z","0.1.13":"2026-08-26T02:08:06.965Z","0.1.14":"2026-08-26T06:50:56.690Z","0.1.15":"2026-08-27T07:13:47.456Z","0.1.16":"2026-09-04T03:26:30.815Z","0.1.17":"2026-09-07T01:26:42.335Z","0.1.18":"2026-09-07T04:04:23.354Z","0.1.19":"2026-09-09T00:25:42.855Z","0.1.20":"2026-09-09T02:15:48.981Z","0.1.21":"2026-09-09T08:44:16.849Z","0.1.22":"2026-09-13T11:25:14.481Z","0.1.23":"2026-09-15T20:37:45.642Z","0.1.24":"2026-09-17T03:03:07.316Z","0.1.25":"2026-09-18T21:16:43.192Z","0.1.26":"2026-09-20T23:11:27.345Z","0.1.27":"2026-09-22T23:46:03.587Z","0.1.28":"2026-09-25T01:54:36.701Z"},"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-history-import"},"description":"Retrospective AI-usage import for Ascenda work telemetry — extracts the baseline already sitting in Claude Code, Codex, Cursor and VS Code stores.","maintainers":[{"name":"ascenda-one-com","email":"nathan@ascenda.one"},{"name":"klubiniecki","email":"klubiniecki@gmail.com"}],"readme":"# @ascenda-one/history-import\n\nRetrospective AI-usage import: extracts the baseline that already exists on\nan engineer's machine — Claude Code transcripts, Codex CLI rollouts, Cursor's\nconversation store, VS Code local history and Copilot sessions, git — and\nships it as provenance-classed historical events on the existing telemetry\nwire.\n\nThe store formats these extractors read are reverse-engineered and\nundocumented upstream, so they can change without notice. Each extractor's\nheader comment states the shape it expects and the invariants it relies on;\nread that, and the fixtures under `tests/`, before changing one.\n\n## Why this package exists here, not in the app\n\nThe macOS Flow app is sandboxed and child processes inherit the sandbox, so\nit can never read `~/.claude` or the editors' Application Support stores. The\napp is the consent and display surface; it hands the user one terminal\ncommand (same pattern as hooks pairing) and this CLI does the reading.\n\n## Design rules (non-negotiable)\n\n1. **Evaporation order.** Claude Code first — its 30-day rolling purge is\n   deleting a day of baseline per day. Then Codex (no purge observed on its\n   rollouts; it sits second because it is the same transcript shape and\n   costs nothing to read, not because of measured risk), then Cursor, then\n   VS Code, then git.\n2. **Copy, then parse.** Extraction only ever reads a staged snapshot\n   (`src/staging.ts`), never live files. SQLite snapshots carry their `-wal`.\n3. **Sniff per record, dispatch on the self-labelled version** (`version` on\n   Claude lines, `cli_version` on a Codex rollout's `session_meta`, `_v` on\n   Cursor records, `version: 1` in VS Code entries).\n   Unknown shapes become `historical_unparsed` — raw retained in staging,\n   nothing inferred. Fixture tests per known (tool, version) pair.\n4. **Metrics only by default.** Prompt/response text, thinking blocks and\n   file contents never leave the machine. Content-level ingestion, if it ever\n   ships, is a separate explicit opt-in — not this package's default path.\n5. **Aggregate before shipping, unless a reader counts the rows.** Per-session\n   / per-day events, not one event per bubble — a single machine's stores hold\n   tens of thousands of them. The one deliberate exception is\n   `ai_tool_call_started`: the backend's work-demand rail derives\n   `toolCallCount` by counting rows of that type and reads no `toolCallCount`\n   key off metadata, so a session-level aggregate would ship, store, and be\n   counted by nothing. Per-call events also place the work in the right hour,\n   which a session spanning six of them cannot. Expect an order of magnitude\n   more events than a session-only import, and an `events.jsonl` to match.\n6. **Provenance is data.** Every event carries `historical_direct`,\n   `historical_derived` or `historical_unparsed` — never the live\n   `ai_work_telemetry` provenance — so no chart can pass history off as\n   live observation.\n\n## Status (2026-08-18)\n\n| Piece | State |\n|---|---|\n| `scan` (per-store inventory, content never opened) | implemented |\n| `fix-retention` (Claude `cleanupPeriodDays`, merge-not-clobber) | implemented |\n| Staging/snapshot (copy-then-parse, WAL-aware, **torn down by the run that makes it**) | implemented |\n| `archive` (durable content-addressed copy, dedup, verify, restore, prune) | **implemented; exercised against a real multi-GB store** |\n| **Claude Code extractor** (human-prompt/tool-result split, session folds incl. recursive subagent transcripts, after-hours, compaction, tool failures, context-window peak, human-corrected edits, correction cadence, gap-split active minutes, epoch marker) | **implemented; exercised end to end against the ingest API** |\n| **Codex extractor** (`~/.codex/sessions` and `archived_sessions` rollouts: `user_message` prompts, per-turn model mix, issued tool calls, tool and runtime failures, cumulative tokens, context peak against the window the rollout itself records, compaction items, long turns, gap-split active minutes, epoch marker) | **implemented; fixture-tested and run against a developer machine's rollouts** |\n| **Active-time split** (hands-on vs agent-supervising, per session, per local day and per project digest; autonomy bands off the transcript's own `permissionMode`) | **implemented; exercised against a real store** |\n| **Tool-call counting, all four stores** (`tool_use` items / tool-call `response_item`s / `toolFormerData` / `toolInvocationSerialized`, one `ai_tool_call_started` per call) | **implemented; exercised end to end against all four stores on a developer machine** |\n| **Batch shipper** (`POST /v1/tool-events/batch`, salted hashes, stable importKey) | **implemented; exercised end to end against the ingest API** |\n| **Cursor extractor** (composerHeaders + bubble aggregation via SQL-side `json_extract`, prompt text never parsed into the process, subagent-composer folding, epoch marker) | **implemented; exercised end to end against the ingest API** |\n| **VS Code extractor** (Timeline-history Chat-Edit day×workspace aggregation, Copilot chatSessions folding, workspace identity via `workspace.json` longest-prefix match, epoch marker) | **implemented; exercised end to end against the ingest API** |\n| `import [--ship]` end to end | **implemented; exercised end to end against all three stores, dry run and `--ship`, on a developer machine** |\n| git extractor | stub — throws with a pointer |\n| zsh `EXTENDED_HISTORY` apply | snippet only |\n\nThe human-prompt classifier is the load-bearing piece: the large majority of\nuser-role transcript lines are tool-result round-trips, not typed prompts.\nConflating the two inflates every prompt metric by roughly an order of\nmagnitude, so its fixtures are the ones to keep green.\n\nCodex has the same trap in a different place. A prompt is an `event_msg` of\ntype `user_message`; the `response_item` copy that follows it shares\n`role: \"user\"` with injected environment context and aborted-turn notices,\nand counting those roughly doubles every prompt figure. Codex rollouts also\ncarry things Claude Code transcripts do not: the model's real\n`model_context_window` (so the context ratio needs no assumed 200k), a\nper-turn `duration_ms` (so long turns are the store's own number, bucketed\nthrough the same function the live hooks use), and no `permission_mode` at\nall — the rollout records `approval_policy` and `sandbox_policy`, which the\nlive Codex hooks deliberately leave unmapped, so every agent-supervising\nminute on this store lands in the `unknown` band. That is a blind spot stated\nas one, not a posture. On the wire Codex rides `cli_agent` with\n`metadata.host: \"codex\"`, exactly as the live hooks do, so historical and\nlive rows are one population.\n\n## Active time is two figures, never one\n\n`activeMinutes` answers \"how much of this session was not idle\": every\nknown-line timestamp, main thread and subagents merged, gap-split at five\nminutes. It has always been the honest alternative to wall clock, and it is\nunchanged.\n\nIt is not, on its own, an answer to \"how long did this take me\". One prompt can\ndrive a forty-minute agent run, and forty minutes of an agent working is not\nforty minutes of a person at a keyboard. So the same material is also reported\nsplit:\n\n| Figure | What it is |\n|---|---|\n| `handsOnMinutes` | The human turns: from the agent's last output to the human prompt that follows. The prompt at the end is the evidence: someone read the previous output and typed. |\n| `agentSupervisingMinutes` | Every other active interval. The agent produced the lines that bound it. |\n\nWhich line *begins* a hands-on span matters more than it looks. A transcript\nis not only prompts and turns: the runtime writes bookkeeping around a prompt\n(a queue operation as it is dequeued, an attachment as a hook runs), and those\nlines land milliseconds before the prompt line. The first version of this\nsplit took the single span ending at the prompt, whatever line began it, and\non any store with that bookkeeping it measured the runtime's write latency\nonce per prompt. The handoff now stamps `handsOnBoundary` to say which rule cut\nit: `human_turn` for Claude Code, whose extractor classifies its lines, and\n`nearest_line` for Codex, whose bookkeeping has not been classified yet. A\nhandoff without the stamp was cut by `nearest_line`.\n\nThe two partition `activeMinutes` exactly and there is **no third key holding\ntheir sum**, at session, day or project scale. Adding them reconstructs\n`activeMinutes`, which already exists; a differently-named total would be the\nsame number wearing a claim it cannot support. On a real 400-session store the\nsplit came out 1,074 hands-on minutes against 36,948 supervising — quoting the\ncombined 38,035 as time spent is off by a factor of thirty-five for the half a\nperson would recognise as their own.\n\n**`agentSupervisingMinutes` does not claim anyone was watching**, and nothing\nin a transcript could show that they were. It is time the agent was working\nwhich the person did not spend typing. Rendering it as attention is a\nfabrication the name invites and the data does not support; the honest gloss is\n\"the agent was working\".\n\n### Runs you cut short\n\nClaude Code sessions also count the times you stopped the agent mid-turn.\n\n| Figure | What it is |\n|---|---|\n| `interruptedRuns` | Runs you cut short. A run is cut short when a human interrupt marker (`[Request interrupted by user]`, or its `for tool use` variant, written when you press Escape) ends an agent turn that was still going. One per marker, per session, on every day slice as well, placed on the marker's local day the way prompts are. A marker after the turn had already ended is a stray keypress and doesn't count. Neither does one the app wrote while shutting down. |\n\nIt's a count. It isn't a rate, and nothing places it more finely than a day.\n\nThe handoff says whether it was counted. `interruptedRunsCounted: true` on the\nfile means every session and every day slice carries the figure, so `0` means\nnone. A handoff without the label wasn't counted: every file written before\nthis field, and every store other than Claude Code. Absent is never zero. The\nschema number doesn't move, because the label is additive.\n\nA turn is still going from the prompt, tool result or notification that starts\nit until a reply with a `stop_reason` other than `tool_use`, or the stop-hook\nline that closes the turn. The rule is in\n[`src/interruptedRuns.ts`](./src/interruptedRuns.ts), and the desktop app's\nimporter counts by the same one.\n\nA cut counts in the session you pressed Escape in, and in no other. Resuming\na session copies the history it inherits, markers included, so before this\nrule every resume in a lineage reported its ancestors' interruptions as\nwell — a fifth of the counted total on the store this was measured against.\nThe same ownership rule as the minutes (`minutesBasis: owned_lines`).\n\n### When two files both say a line is theirs\n\nMost copies keep the session id the line was written with, which is how the\nimport tells a copy from the real thing. Some rewrite it to the file the copy\nnow sits in, keeping the line's own id and its original timestamp — so the\ntest that settles every other copy answers \"written here\" in both places, and\nboth sessions counted the line. Nothing on the line says which of the two\nwrote it: the two records are identical apart from the fields the copy\nrewrote.\n\nWhere the line sits is what settles it. A line two files claim is contested.\nInside a file, the run of contested lines at the top is the history it\ninherited, and it ends at the first line that file claims and nobody else\ndoes — from there on, what it holds it wrote. So a contested line belongs to\nthe file still holding it after its own history has started.\n\nNot simply the first file the import reaches, which would be the easy rule and\nthe wrong one: on the store this was measured against it would hand two fifths\nof these lines to the copy instead, which is the error this whole rule exists\nto remove.\n\n**What that leaves.** A lineage whose earliest file the 30-day cleanup has\nalready taken has no file that wrote those lines — every one still holding\nthem holds them in its inherited head, and nothing left on disk says which\nsession did the work. The line is still counted once, by the first file the\nimport reaches, the same answer any orphaned line gets. The total is right and\nthe session it lands on is a guess. That was 16.1% of contested lines here.\n\nSizes, on the same store: 3.7% of the lines claiming their own file were\nclaimed by two of them, and counting each once takes 3.9% off the summed\nactive minutes. **Your week doesn't move** — the union of your active time\nholds to a minute, because a line counted twice was one minute counted twice.\nHands-on shifts a little more than that: a span changes sides when the lines\naround it move, so the unioned hands-on figure moved by 19 minutes in 6,734.\n\n### What counts as a prompt\n\n`promptCount` on a Claude Code session counts the prompts you typed. Claude\nCode also writes `user` lines on your behalf, and none of these count:\n\n- a background task's notification, or another session speaking (`origin.kind`\n  of `task-notification` or `peer`);\n- its own bookkeeping: `isMeta`, and the summary a compaction leaves\n  (`isCompactSummary`);\n- a line that's empty once its wrapper elements are stripped: `system-reminder`,\n  `command-name`, `command-message`, `command-args`, `local-command-stdout`,\n  `local-command-stderr`, `local-command-caveat`. That's what a slash command\n  and its output look like. A prompt with typed text beside a wrapper still\n  counts, and so does one that merely starts with a tag's name;\n- the interrupt marker, `[Request interrupted by user]` and its `for tool use`\n  variant.\n\nEach session carries `syntheticPromptLines`, the number of lines it left out.\n\nThese lines aren't you, and they aren't the agent, so they don't start or end a\nhands-on span. Prompt events, after-hours prompts and quick re-prompts all\nfollow the same count. The desktop app's importer declines the same lines; the\ntest is `isTypedPromptLine` in\n[`src/interruptedRuns.ts`](./src/interruptedRuns.ts).\n\nTwo more rules need the whole store, so the extractor reads every transcript\nonce before it folds any session ([`src/promptLedger.ts`](./src/promptLedger.ts)):\n\n- **Each line belongs to one session.** Resuming or forking a session writes a\n  new transcript that copies the history it inherited, line ids and timestamps\n  included. Each copy has one owner: the transcript the line's `sessionId`\n  names, or, where the purge took that file, the first in the walk's sorted\n  order. The owner counts the prompt, and the owner's timeline carries the\n  instant — so `activeMinutes`, the hands-on split, the day slices and\n  `startedAt` describe the session you resumed rather than everything behind\n  it. Two files can both name themselves on one line, which \"When two files\n  both say a line is theirs\" above settles. A line with no id is counted\n  wherever it appears; on the reference store that's `queue-operation` lines\n  and nothing else.\n- **A chip's prompt isn't typed.** A session launched from a `spawn_task` chip\n  opens on the chip's prompt. When a line's text, wrappers stripped, matches a\n  chip that some session in the store offered, it counts in\n  `dispatchedPromptLines`, not `promptCount`. The agent still runs on it, so an\n  interrupt during that first turn is still a cut-short run. Only hashes of\n  chip prompts are kept, and only for the run. If the store's cleanup has\n  already removed the session that offered the chip, there's nothing to match\n  and the opener counts as typed.\n\nThe handoff stamps `promptBasis: \"typed_once\"`. `\"typed\"` means the rules above\nthe list, with every resumed copy counted again and chip prompts counted as\ntyped. A handoff without the stamp counted every `user` line that wasn't a tool\nresult. Prompt counts for the same week run highest under that rule and lowest\nunder `typed_once`. The schema number doesn't move.\n\nBeside it, `minutesBasis: \"owned_lines\"` says the minutes were cut the same\nway. `\"every_line\"` — and an absent stamp — means a transcript's whole\ncontents counted there, inherited history included. Gate on this before\ncomparing minutes across two handoffs: a store's figures drop when it changes,\nand nothing else in the file says so.\n\n### How much history a resume carries\n\nEnough to matter, which is why the rule above covers the minutes and not only\nthe counts. On one real store of 984 transcripts, 151 carried inherited lines:\n275,801 of them, 29% of every dated line in the store. They held the whole of\nthe gap between what the sessions claimed and what the clock allowed. Both\ncolumns are the same 983 sessions, read from one snapshot:\n\n| | Every line | Owned lines |\n|---|---|---|\n| Summed active minutes | 70,212 | 53,600 |\n| Summed hands-on minutes | 12,238 | 8,006 |\n| Union of every active interval | 25,078 | 25,077 |\n| Exact-duplicate spans | 262,500 of 873,599 | 21,982 of 635,126 |\n| Sessions apparently spanning over a day | 158 | 154 |\n\nThe union is the control. It holds to the minute, so no work anyone did was\ndropped: what went was the copy of it. Duplicate spans fell from 30% of the\nstore to 3.5%, which matters to any count of how many agents were running at\nonce, since a duplicate reads as a second agent. 127 sessions now start when\nthey were resumed, 13 of them more than an hour later than they used to.\n\nThat 3.5% was not the floor, and it was not coincidence: four fifths of it was\nthe copy path settled above. On a later and slightly larger snapshot of the\nsame store, the duplicate spans go from 21,982 to 4,087 once contested lines\nare settled.\n\nAn earlier reading of this exposure put it at 0.72% of sessions. It counted\nrepeated `sessionRef`s, and a resumed transcript carries a fresh one, so it saw\nthree sessions where 151 transcripts were affected.\n\n### Autonomy bands\n\n`permissionMode` is on the transcript's human-prompt lines and nowhere else —\nacross 120 real stores it appears on 6.7% of `user` lines and on no\n`assistant`, `system` or `attachment` line. So posture is known at prompt\nboundaries and carried forward between them, and supervising minutes are banded\nby it through `autonomyBand`. Time before the first declaration lands in\n`unknown` and is never folded into a neighbouring band.\n\nThe band map rides in the local handoff only (`autonomySplit`), never on the\nwire: banding is a reader's vocabulary derived from the stored token at query\ntime, and storing the band would freeze a decision deliberately left open.\n\n### The counters\n\nThree diagnostics ship with the split, read by neither the backend nor the\nhandoff on purpose:\n\n- `activeSplitInstants` — distinct timestamps the split ran over. Two minutes\n  off four instants and off four hundred are not the same measurement.\n- `activeSplitUndatedLines` — known lines whose `timestamp` would not parse.\n  They still move the session's wall clock by string comparison, so only this\n  says both active figures are short.\n- `activeSplitUnposturedInstants` — instants reached before any\n  `permissionMode` was declared. The posture blind spot as a count, not\n  inferred from the `unknown` band being present.\n\n### The defect this replaced\n\nThe per-day slices used to gap-split the **prompt timestamps** while the\nsession figure gap-split the **whole timeline**. The threshold was shared and\ncommented as keeping one definition of \"active\"; the material was not. Across\n200 real sessions the prompts-only reading came to 2,730 minutes against\n18,938 — an 85.6% under-report, concentrated exactly on the sessions where an\nagent did the most work. Both now cross the call, and\n`tests/activeSplit.test.mjs` pins it against a real transcript.\n\n## What the backend enforces on a second run\n\nBoth of the blockers this section used to list — the consent scope and\nidempotency — are enforced by the deployed backend, and have been since\n20 Aug 2026 (verified against a real backfill on 25 Aug 2026). They stopped\ngating publication then, and the package ships from the release tag like\nevery other CLI here. Two things stand apart from them and are decided\nelsewhere: which tier the batch ship belongs to, and the consent surface that\ngrants the lease. Without that grant every event of a backfill is rejected\n`consent_missing_or_expired` — the gate working, not a broken token.\n\n- **Consent scope.** `historical_import` is a distinct `ToolConsentScope`,\n  separate from the lease granted for live IDE telemetry, and a backfill\n  requires it. Paying for a capability is not the same act as agreeing to a\n  specific read of months of local history, and pairing grants neither: a\n  paired tool has consent to watch you from now on, never to read backwards.\n  Enforcement keys on the event's **provenance** rather than the scope string\n  a client sends, so backdated events cannot ride in under live-telemetry\n  consent.\n- **Idempotency.** `(pairedUser, toolInstallation, importKey)` is unique, and\n  `importKey` is required on any historical event. A replayed event answers\n  `duplicate` and writes nothing at all (not the event, not `lastSeenAt`, not\n  an audit row); the batch response counts duplicates apart from both accepted\n  and rejected.\n\n  **The dedup key is the source record ref alone — not `extractionId` + ref,\n  as this list originally said.** An extraction id is minted per run, so\n  including it would make every key unique and dedup nothing, which is exactly\n  the case a re-run is. The source record is the stable identity, so it is the\n  whole key; a re-run with a fresh `extractionId` over the same records\n  therefore still dedups, and the first run's extraction stays on record.\n  The backend's ingest tests pin this on its side.\n- **The key survives a changing store.** `ordinal` numbers an event only\n  among events sharing its whole identity — store, session, kind, instant —\n  so it separates genuine same-millisecond duplicates without encoding the\n  event's position in the run. Deleting a day, a session or an entire store\n  between runs leaves every surviving key untouched. Pinned by\n  `tests/importKeyStability.test.mjs`. (Until 20 Aug 2026 this was the\n  event's index in the whole shipped array, which re-keyed unchanged records\n  after a purge — the one case a re-run is for.)\n\nStill open, and worth knowing before trusting a second run completely:\n\n- **The 18 Aug 2026 shipment cannot be deduped against.** Production accepted\n  8,720 backdated events from one machine before the `ImportKey` column\n  existed, so those rows carry `NULL` and the unique index is filtered on\n  `IS NOT NULL`. Nothing will ever match them. A clean re-ship needs them\n  removed backend-side first, or that window lands twice — once. Runs from\n  here are idempotent with each other.\n- **Epoch markers** (Copilot→Cursor→Claude eras, Ascenda install) are not yet\n  event types anywhere.\n\n## Usage\n\n```\nascenda-history-import scan            # human-readable inventory\nascenda-history-import scan --json     # what the app's consent surface renders\nascenda-history-import fix-retention   # dry-run; --apply to write\nascenda-history-import import          # Claude Code + Codex + Cursor + VS Code, dry run; --ship to send\nascenda-history-import archive         # the durable copy; --verify / --list / --restore <dir> / --prune\n```\n\n### Staging is scaffolding; `archive` is the copy\n\n`import` snapshots each store, extracts, and **deletes the snapshot in a\n`finally`** — success or failure — keeping only `events.jsonl`.\nIt also sweeps snapshots left by earlier runs. This is not tidiness: nineteen\nruns once left 254 GB on a 926 GB disk and took free space to 279 MB, and the\nfirst thing to notice was unrelated tooling failing with `ENOSPC`.\n\nThe comment that made it possible claimed APFS clone-on-write made a snapshot\nfree. Measured on macOS 15 / APFS / Node 24, it is not — `fs.copyFile` with\n`COPYFILE_FICLONE` costs exactly as much as a plain copy (450 MB source,\n464 MB consumed), while `/bin/cp -c` on the same file costs zero. Node's copy\npath does not use reflinks here. Never assume a Node copy is cheap.\n\n`fix-retention` is the other half, and is also **not a backup**: it stops\nClaude Code trimming itself *in place* and does nothing if that store is lost.\n`archive` is the durable copy:\n\n- lives outside `staging/`, so no sweep can reach it;\n- content-addressed, so re-archiving an unchanged 4 GB store costs ~0\n  (measured: first generation 4.1 GB in 20 s, second 48 MB in 2.8 s);\n- keeps every generation, so a transcript that grew is recoverable at both\n  states;\n- `--verify` re-hashes every blob, and **exits non-zero** if any is missing or\n  corrupted;\n- `--restore <dir>` never writes to the live store;\n- `--prune --keep N` bounds it, because storage that only grows is the same\n  defect wearing a different hat.\n\nVS Code chat sessions (15 GB, which VS Code is not deleting) are skipped by\ndefault; `--include-vscode-sessions` opts in.\n","readmeFilename":"README.md"}