{"_id":"@gafj/gafj","_rev":"30-4825e34886b1242e28fbfccfdbe27aef","name":"@gafj/gafj","dist-tags":{"latest":"0.1.59"},"versions":{"0.1.1":{"name":"@gafj/gafj","version":"0.1.1","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.1","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"178aa7b20b4ff531c68fcc45f4bdef506489c47a","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.1.tgz","fileCount":121,"integrity":"sha512-PzH/lx3mIcwAXzm2rqcCFoEvGetbhmdiRVqGD61BNfbCuS4RYYHjcEyxUsoPTepH0gsLLBN1Qe1Yx5GmdS31vw==","signatures":[{"sig":"MEQCIEWlme1DRAV6Ki5FQKPQzlOBvTP1KujZUQy361p3IS/1AiBDhPlVvlmmLX1Jbk9L5X68Gr+qy+BZMwmCRoJ6iLfJDA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":747049},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"63f2a97d0925b5d8bf9ae764452e251622a043fb","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.1_1788538004071_0.32070966440114934","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@gafj/gafj","version":"0.1.2","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.2","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"d9f527ad5bbd0f3cf595a81b8d6603710d0df236","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.2.tgz","fileCount":121,"integrity":"sha512-RozdTH2OIOaVnf68owijF30u/iLbT16p9DVumt4MsrvQXqQAWTJcpsbEgIIZiX4HJXE38x4M9xM7qrPFaX2LnQ==","signatures":[{"sig":"MEUCIQCTlZq9xbczbo6Q2jhbKKaGCv9OOT4FeJ/nLIDzE+GCngIgJmWSgr963SP3SLUFw8PoadusM+bcf81jOvha+fD4DHs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":748544},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"a3b7fc07128da92bfe8a158ae1b12dde49f599de","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.2_1788544827575_0.34101698576672623","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@gafj/gafj","version":"0.1.3","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.3","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"d671a61cc78715c25de2f1a4461dc50c666c987e","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.3.tgz","fileCount":122,"integrity":"sha512-4lvLi2Co5YGK+jCKMDMrW0C1hGTnmLtuWI21NYD/xuC9GL+BYIaJeTEvOs70yFNxglcvv8wYYC5o8XqwPec6oA==","signatures":[{"sig":"MEUCIHxEdJ8JRoL16SXiUO0C2cCR0i+/8VXOEcCEBYqMptCNAiEAuob12US2U0akSCq2Ab2N51RWT4o6zPAijzd7s6UpQ0I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":759102},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"404aee0677d9adf902ae6b639aca6920d0d20289","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.3_1788546978216_0.7570041009502675","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@gafj/gafj","version":"0.1.4","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.4","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"64d67446bfbb07205cf7d2b1d0a29ffc736977dc","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.4.tgz","fileCount":123,"integrity":"sha512-wajmlAaRWMxrrYxZmUya/h0ZPhJYQMo5kjSkljDdLFWlmF6XjBve2Yd0Wel/ES+crf6cfgdhjP32zXhXQygLPw==","signatures":[{"sig":"MEQCIGYqsNFdr+bYv6BGZrzCANxfGWX5uoW0+GImNx+0+KnVAiATs/iiSpLwAIufmtI1VS5/+flLea7UJNXiBWpGmG5fMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":777650},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"4e1b80c6f4cf20b087cae3bc649dba521c57a023","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.4_1788549135795_0.23631089359375257","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@gafj/gafj","version":"0.1.6","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.6","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"c455bd423a8e9bf51d6e665a216a4633df15b8cc","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.6.tgz","fileCount":123,"integrity":"sha512-jcweOMwSiEN9eWysCjzRmn3CyjF8GbPKkzyDGPp4yiIlsDy3piCa6WjuVCekmtLVAj+qmI/0KbRtV95Bss7zkA==","signatures":[{"sig":"MEQCIEsBkGP4diOHJ6hrNIgKHOwezSHRpgNpB2RW2wtjhWuRAiBVmASC4bcHc0+OrXa93vH6hkENSkJlEauZPnmvRl/VIg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":783579},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"b6078236d56ae8c829c55c3730efb20e650d6aef","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.6_1788549736344_0.24336276686063352","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@gafj/gafj","version":"0.1.7","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.7","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"d8933e9721a06e24953fecea620024656c6aa9d0","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.7.tgz","fileCount":123,"integrity":"sha512-dMBpbSp5kLBFNN/WgYxyo8honv5FpiwKgB7XI31sowBxTob9494WXheedng+IuNGmvRlGwh2AgfVgut55nmksA==","signatures":[{"sig":"MEQCIBI5cByx0RHBomlsxDfjij/i0pdWhz89zRR+KRdHhssCAiBcQYcDyTsvHi6knXspNUpoFAOhm7GwUw22QQu+WUPsDg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":785612},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"64326355b185fdcb4f912216ea642e27a4c2582c","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.7_1788549889528_0.23708691386251668","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@gafj/gafj","version":"0.1.8","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.8","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"7a5f3107f4ea5295106dc3fb7004d1f47a1eec7c","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.8.tgz","fileCount":123,"integrity":"sha512-qLrBhPZD7gWq102nbb4ZWlY/4vy5CwAH2RUh55lg8VY+AwKf+Zbu2G6owDvch1ldDS8P6ZbsRp6l2YDo6tb6sw==","signatures":[{"sig":"MEUCIECzBTb0AocVh7wJ/zezkiSKnlGagHoYz7J2SVcL6NUNAiEAnXUIBy5/vbhJ5STqeXYakBfhOjS05X4QeYK09jvSXMw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":785764},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"1d8ca0533d8f33dc74752d26ebb9a3d69f3416d7","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.8_1788550397840_0.7183753507937249","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@gafj/gafj","version":"0.1.9","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.9","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"81bc8ccfec93e764b561a670cd4cb5ea6f1dd8d4","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.9.tgz","fileCount":123,"integrity":"sha512-ZMzyYgZS+SJ0S1yoRzZGON/QhaI9oCwZH/++8mqbuMwnxYH1EYJ4gs+uhV1Zs3zxdoyZ6+he08egrBHFOM4JNg==","signatures":[{"sig":"MEYCIQCjavXcbYFZWm0cpSxfBplrfN0XZxcJdHTxsOt7En8tBgIhAKYTJillwSckGjH4LMIxshxeMYAdctWe9U7Udxs7K7BQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":787280},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"8e4c2c4b76f084e745c7be857038577d7002b1d7","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.9_1788550744265_0.18803408424743928","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@gafj/gafj","version":"0.1.11","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.11","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"06aee2dd5376410ef19a41bc35e54f0d15fe2392","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.11.tgz","fileCount":123,"integrity":"sha512-vtBp8zwqvCG92DX8YQNFIfWnmWRgssTwgdR3oRVoW39UyGPhpn89lNcfB9C3nUk2pqM6o+zcQfusDHs+oDmb3g==","signatures":[{"sig":"MEUCIQDy53UvRVfb3Ed3Oq0uti7j0n8EDSB0m/RE4mYibO7sbAIgVNq/1WTHV0HcmiDYZOalKQpVgIVKn8vOAfI44dwbHRU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":793577},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"4b5face78ce96dac972df01f341ce7ea43fd37da","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.11_1788551244542_0.3475582899368099","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"@gafj/gafj","version":"0.1.13","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.13","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"c8783f4a76fb7f51519c35a9551bc6e8e31b8de5","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.13.tgz","fileCount":123,"integrity":"sha512-WKPLlwVfCURzLyIXhazI7LkqDTkMvw3ffH7yP/tojlFR60MQXmk4BrnWowSkIqlcSfA8/xXc9nba8D+rp8iCLQ==","signatures":[{"sig":"MEYCIQCXONtJgK3S3OYIQ3jU+eMJMUqVKF1zXn3R/sDtbQI06gIhAM5++leHLGHw0OaoKyLR1XHkahXKC5xXytZUmfy/L64l","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":795982},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"0738eee86a976ed6a6bce397fdb36f0b2ad6a2cd","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.13_1788551633646_0.6941682943297669","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"@gafj/gafj","version":"0.1.15","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.15","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"a2889128e817e14de0e9e260eb7d56242ddfde8e","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.15.tgz","fileCount":123,"integrity":"sha512-yVUMlOYGWcDVqzVyZbf2KUIDmv8ENYiH6W8ch/MVtS0PlIrp4Us22fkbPCeX4yZ8TgWfyy7dAOG7D5jCKZZINw==","signatures":[{"sig":"MEQCIAck2INtx5AduCT2BqBzkHyeB2fA7e/JAp1dcktV3O4fAiBe5ffLtKG9wA3qJXn7vhS4Fy73j4XBpJWLCyzZDtXaZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":797811},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"320a6ec894ac6678503f057542abb1b3469974c9","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.15_1788553730921_0.29627552675873337","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"@gafj/gafj","version":"0.1.16","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.16","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"ba196fa0ca43532b92bd1bc94327ce064d139059","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.16.tgz","fileCount":123,"integrity":"sha512-LvGyPYgguairWrwxQX9yaoD2EllsRUFkupHMJW/cU/4toX7JHAdtkaoP7/b2Jkx8ksn6e3FeA8uNaDN1OmKiNQ==","signatures":[{"sig":"MEYCIQDqM9GxacnK1vp+TnXeywlUSrovbp2ZugLSo7lSY/aEPAIhAPg3aNWsUL7C/DlhG47Ptl0qCY9MjZq/MQn87FDhZNvJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":799323},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"48f6dc0701c10a2606a5a2be07e4ca5d888731a4","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.16_1788554148605_0.7411411904582219","host":"s3://npm-registry-packages-npm-production"}},"0.1.17":{"name":"@gafj/gafj","version":"0.1.17","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.17","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"2f693798ea4bee81bb7d3ea44f917ac128b4d001","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.17.tgz","fileCount":125,"integrity":"sha512-hGTw3GF01fNOXrc2KPrXtJGwl0sAiCamID/ZEnRjVQRoeuvyCob6KhlUl6qon6S2EcUNMXTN+wZoRuDtMMSYuQ==","signatures":[{"sig":"MEUCIQCeTCQpmpOMC2/MuNKse48pRNp2XBlJNWxR0tSQZdzp3QIgeevPa+tfwBi+VSl8caR+Yj0ZzRLZoq/qbYtWW0E3EK4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":825551},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"2f81911862f00a7a7fab71ed58c103c92bccc0df","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.17_1788556995431_0.9900656137648975","host":"s3://npm-registry-packages-npm-production"}},"0.1.19":{"name":"@gafj/gafj","version":"0.1.19","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.19","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"5b1d72031366da18b3bb5aa9531fade025412260","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.19.tgz","fileCount":126,"integrity":"sha512-a7NeKTZfQGr3bxeL/d8CQSuI4rdd+aJ43d4kPgjOwmB8xSi8fKpKzcw7uMKKuxduFXnXtN/Bc6YTskaI3ZvDBg==","signatures":[{"sig":"MEUCIQDC7m4haMvuWTZ6k6kW5vck7wS8sHIpYpTzOL+8/8cqiwIgMns5iygJjPOxrH98a3xgu19P1bVzULY4HIvUdx+WO0Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":836025},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"e4b3c55893cdc30f8d32e15330c065acf45ec34f","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.19_1788558220645_0.10842253068979524","host":"s3://npm-registry-packages-npm-production"}},"0.1.20":{"name":"@gafj/gafj","version":"0.1.20","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.20","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"0daa4bb225fdcf966694c80e903e02d088753237","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.20.tgz","fileCount":126,"integrity":"sha512-JhLc8c04AKB4TuxG3g2Z96mDezLJ0hdO09ELmpIVKzq2IM1iS8FpNbwboXGNND26N4gy4UwlrHuZtXZ0Zl4Deg==","signatures":[{"sig":"MEUCIQDhaEBsbyN4t1pgeyXw9aaRj7Blcl60eARgoZ0EgVDPQwIgJvUupkYRf4Y5cZ3Sc+e6eayjZOKQWX+N2H1lA3SQ3m4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":837896},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"256cb85dd6a1186e430cc3cdb5d84023336f08d1","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.20_1788559151066_0.6643751361180299","host":"s3://npm-registry-packages-npm-production"}},"0.1.21":{"name":"@gafj/gafj","version":"0.1.21","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.21","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"2eae651ef4e5b40c88dbeac112e31be7f6a2a720","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.21.tgz","fileCount":126,"integrity":"sha512-bFlA4rEOZvoTbSihfHykEJY/3yMxrgY9pAFxchxZkkzELcWWFfLwjsl3DO76/AdcZJVHCjRhmAK6oTe9HwEQEA==","signatures":[{"sig":"MEUCIQCwa4VnClpmAAiTq9izTAaeGwte24q46gVZBu5unsGqPAIgFf5/CshgvlxWkCkC6GjeVHdz5TYzO8ZH8i9aitr0od0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":843281},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"3f813df7fe04445661b1389150b7a6d12077f677","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.21_1788561752308_0.22770751781936482","host":"s3://npm-registry-packages-npm-production"}},"0.1.28":{"name":"@gafj/gafj","version":"0.1.28","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.28","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"9171207ba6ea3156153e02bfc207d90ae3672eb4","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.28.tgz","fileCount":127,"integrity":"sha512-VKda8ZBm4gE+BhkloJ80CtvUlV5wSwREQCo2GpEpohKsTFSXaNQDCo+DwLI2GA20CqrMIQ7CgKOiv7FJgUtkXg==","signatures":[{"sig":"MEUCIQDayjYieZWilP6cq2KoGDj4weJOFMzV3pPC2lxwPmPyAQIgByf1ATKzsHVGzAboNpkZ40hJpRezGmDMMBFkGk9w1ig=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":860306},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"d70ee78bb3343cc06f66ab2766cd25cc04e3f383","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.28_1788580548858_0.39287828796092983","host":"s3://npm-registry-packages-npm-production"}},"0.1.46":{"name":"@gafj/gafj","version":"0.1.46","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.46","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"2d0c08b1315dc7f4bbf6edc21af68189276a75bc","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.46.tgz","fileCount":146,"integrity":"sha512-/g07DR6TQREIi9ttu13tnxW4PyumuPhURVGD35RvVVobPLp29pT05NnA+SlFNwiWqWekkKFJh+2G7/TfD9lCKA==","signatures":[{"sig":"MEUCIGiNNdo6pQB/fn7LiDUytEsm6Pb8pTnFAY45o0g218/uAiEAtK3e6GUw2h8iy8HlLE9jird+CoPfl5tUi6Gb7QEZZbY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1062386},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"6dbb00ad9eae519cb09b604784452ea3a3350535","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","jszip":"3.10.1","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.46_1788673416090_0.3917510001660993","host":"s3://npm-registry-packages-npm-production"}},"0.1.47":{"name":"@gafj/gafj","version":"0.1.47","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.47","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"0b9ab2bc940e3576b98d182fbcc7b43ac0f2e217","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.47.tgz","fileCount":150,"integrity":"sha512-4bRSctANiUQ+OAYrFnrF25yk4TFhd789HIDZeYcBBwFLbdlyj8BGI14jINp9PQvOlLgrUKCByNHhWFolwCNCVg==","signatures":[{"sig":"MEQCIDxivup40vZy4NO9ocofJ2kShcGCE8vnkSbzzdU5aaNzAiByS03dUZhW6HpyIDWy9/wKfpVunwyNqGHKD+OD8AAhgg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1107961},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"4cca74449e01b05b7bf2cd6506710c942d9c22cc","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","jszip":"3.10.1","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.47_1788698304683_0.190972692354904","host":"s3://npm-registry-packages-npm-production"}},"0.1.48":{"name":"@gafj/gafj","version":"0.1.48","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.48","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"523f49795e6629aa1b3e149d21d9fcc6ba3a8b65","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.48.tgz","fileCount":152,"integrity":"sha512-FsT1LEwVUGX2xcbxNPWa/sL5S/64DGwglVE2QHR7v6WNpTR1h9Jxw17CcqWqiJFx2wKTNUEo4pYvyMm0g+HStg==","signatures":[{"sig":"MEUCIHhbxbWGpIg8QqXSBOgXiU+BwRXXEeZ/lxwL73enNoLZAiEAlIptzEJ0Gr3pxPccYtLyjUNactgqrjaIHGL1e5/kMRM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1132151},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"c1ddbf6499ac8cbd96a99a94cdddf9b90390a242","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","jszip":"3.10.1","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.48_1788706404533_0.35998927483249954","host":"s3://npm-registry-packages-npm-production"}},"0.1.49":{"name":"@gafj/gafj","version":"0.1.49","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.49","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"089d2b1595e1002870e71417f30f87fb42f8198d","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.49.tgz","fileCount":153,"integrity":"sha512-mYIFuRJoxnR6Y5s5lJsb7tl6Xh1/SYAWmF/z8BYkxOJfTRFI/NVKzElzqZMzLgE96TXfuYWeEd/B9JEPxQfYhQ==","signatures":[{"sig":"MEUCICkSpMvnTJp3aUFowFAHBIz5LhD6je6drnhADcGf+hagAiEAj5Smi7ATBADrNp7fZWktfPmrE7VzHadYAR7xPjRnYxo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1157091},"main":"store/index.js","engines":{"node":">=24.0.0"},"gitHead":"6bbadca524e3e89139e208eba5b14520cd64812a","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","jszip":"3.10.1","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.49_1788724129310_0.6069189678652189","host":"s3://npm-registry-packages-npm-production"}},"0.1.51":{"name":"@gafj/gafj","version":"0.1.51","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.51","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"9fb9094f27d55a59227d2cf5a04a3a0367c3d7d1","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.51.tgz","fileCount":153,"integrity":"sha512-TRv7tEaeSxEeX0D4USn/Z8zdw++RvnUwzTIHWPAaHmzjGTxOG5KPKFhpenGwFh6rGwRaNBFbSvG9MaYxGZAFNw==","signatures":[{"sig":"MEQCIHYcQFpOm3HKZS0O9SN7FYUahPCCZlDWZvZBfAes3Z2ZAiAi1O979L2Z89MGdgNscW3/TWGFeDP9bizUlhhq78R1Sg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1175520},"engines":{"node":">=24.0.0"},"gitHead":"5a32abf09f735b94a4a8d2db1fe928cca7c0e2d0","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","jszip":"3.10.1","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.51_1788728499111_0.5453714180034646","host":"s3://npm-registry-packages-npm-production"}},"0.1.52":{"name":"@gafj/gafj","version":"0.1.52","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.52","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"f413af4bb53528de14e0bf875da8d63624839041","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.52.tgz","fileCount":153,"integrity":"sha512-Kbucc2rZzkr+hKe8f/kQ11j6sgKQGcGP6vq5DEcGc6ZZaKfAIH7Sg++zRCZEfMuBmjwYO+eAhqgZzekkW3RarQ==","signatures":[{"sig":"MEUCIGzLpeCQ2ldOZxpRlrvnoJUeDkrfhzBWAFFAW/25CVZkAiEA/23LtCL6M11P4v0I5BIWSuQS/In0bL76HnskACIs/RQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1181876},"engines":{"node":">=24.0.0"},"gitHead":"61cbf378bca084a1b710036951470bcc1eeba8bf","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","jszip":"3.10.1","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.52_1788729475257_0.33583272163832256","host":"s3://npm-registry-packages-npm-production"}},"0.1.53":{"name":"@gafj/gafj","version":"0.1.53","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.53","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"5c39ebd3aeecabe030bab631a778bf6865d04a6e","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.53.tgz","fileCount":153,"integrity":"sha512-GriCc/L3bzFVYh66i5waJEFbXHcHYvRyYJxOu+wLN7u1Ju7WBRDayORK8URUbknl0Kxnv0Iokb41SK0jY924eA==","signatures":[{"sig":"MEUCIQCmcoyOhAXojytfYnV6lSzZ5mz+RO3K7ZxG52d8ySwxbgIgUD0k18sSzdLoNlT0GBhGR9tB3T5xQWGvJOjEgRe83NY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1188525},"engines":{"node":">=24.0.0"},"gitHead":"e327d334c4ecfa4ddc2c94fa1720743695ef322f","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","jszip":"3.10.1","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.53_1788729751507_0.5533601914285315","host":"s3://npm-registry-packages-npm-production"}},"0.1.54":{"name":"@gafj/gafj","version":"0.1.54","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.54","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"bd440ff92dd5eff62e2a16c97ab32d294144fb1d","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.54.tgz","fileCount":153,"integrity":"sha512-IXBSScqw1aAjJsd2mx79bcUY8zFmbaPC5f7ut7D33cBRwlvXFLxqIXX0mj8gn57DHDBhKToVlHsi9qhEApTyGw==","signatures":[{"sig":"MEUCIFAGvSt44DWHMnKRz1Hgki3/DIGgPlck2KOCwq/rWdnwAiEAqQoun0ZGSTbDh3nkaTuiu0qkEPBLqtlEIH+LzESOtJM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1189479},"engines":{"node":">=24.0.0"},"gitHead":"bf87afb0fc7cb1dfefb2e509ebc105fb541f5b18","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","jszip":"3.10.1","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.54_1788734857787_0.7134152078289746","host":"s3://npm-registry-packages-npm-production"}},"0.1.55":{"name":"@gafj/gafj","version":"0.1.55","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.55","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"cefa071fb00c801561ae8e0b75da3f4ec402eb9f","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.55.tgz","fileCount":153,"integrity":"sha512-7FubAqADfEqPCg415vglUENuIVorSR+52T8bS5TlqGrBC58/ppAKrsm88jYRqfZpyw/KRhM4flO0yVd/WQZJVA==","signatures":[{"sig":"MEUCIB5DuttcgHGlPtweWreNAzf8rHQ2G8+woMUV398DTDUPAiEAzh3+o9y+ZduvhP0C23/iKGZWswRLEOkTWZOWwmRvRdg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1192903},"engines":{"node":">=24.0.0"},"gitHead":"37c17e17154fbe547d9c0f5034a3d77580460c28","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","jszip":"3.10.1","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.55_1788838010213_0.9954442700783594","host":"s3://npm-registry-packages-npm-production"}},"0.1.56":{"name":"@gafj/gafj","version":"0.1.56","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.56","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"2432045a3426c8767e84c7c9cfa5d057250e52fa","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.56.tgz","fileCount":154,"integrity":"sha512-S6lD1p3/UDU4RLj8iuV+wVtq8ogoXjq9QlXzgHRtTFH/cUroCW7thJdXxDRGpILlLgwrYlg68hlG8Yx4A6FpjA==","signatures":[{"sig":"MEYCIQDYTq+xewnpLOH81HDupa3h+lchd1BEoE0JkIFy0FdFzAIhAMbG4ohZJNh6pCfpghxktqnF/QU58IUPNqzr4SAwdcYr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1196302},"engines":{"node":">=24.0.0"},"gitHead":"5a40d80b52acd3172524b1051f29f1d78afc573d","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","jszip":"3.10.1","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.56_1788839954777_0.1333132188261552","host":"s3://npm-registry-packages-npm-production"}},"0.1.57":{"name":"@gafj/gafj","version":"0.1.57","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.57","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"9e108dd8e64da9a091afa0da7a43fb6170f9ad00","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.57.tgz","fileCount":154,"integrity":"sha512-0WuHfLgakK13OLyREw6SpumQEAgnAFUeVXpQuwhIOuNgI7mAw7gdDueaeqFFrC4mXxZ/YaG68oP95rSju0jbrg==","signatures":[{"sig":"MEUCIDFuqR6o1TljFqzcRnJ9ZdnxsKwXiiyoHaUwzRQ4yT1tAiEAiHymf7aNmEomJRzn+ygsTruigeM757KvCum5l3QvzNM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1199630},"engines":{"node":">=24.0.0"},"gitHead":"8a64726dedc463e571041d9985b10a575037cc2e","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","jszip":"3.10.1","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.57_1788840587196_0.22718713931614554","host":"s3://npm-registry-packages-npm-production"}},"0.1.58":{"name":"@gafj/gafj","version":"0.1.58","keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","_id":"@gafj/gafj@0.1.58","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"homepage":"https://gaf-j.com","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"bin":{"gafj":"bin/cli.js"},"dist":{"shasum":"51d7e37f2066f484427c50f526bde4602a5f1cd0","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.58.tgz","fileCount":154,"integrity":"sha512-VY2BFjQHDSTZr6JYv1DiENaDNeK+5xe9ARH7UCocvtRUdkUyDm6/KqFRV0rabOUGX1Ih69SsZIStjoORsRUXWQ==","signatures":[{"sig":"MEUCIQC6jciNjQYwEM77GJ66bnIfSxLL+Jls+8HbGpbn4BcMEQIgBHu+JvD5EhzD4w9K6Grd1BvQhZzf8EgN3Z5aodIykjs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1200622},"engines":{"node":">=24.0.0"},"gitHead":"d78a623842f1bc153c093b01a9f4a352c476ac86","scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"overrides":{"uuid":"^11.1.1"},"repository":{"url":"git+https://github.com/MVHProvGrd/resume-generator.git","type":"git","directory":"gafj"},"_npmVersion":"11.19.0","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"htm":"3.1.1","zod":"4.5.4","jszip":"3.10.1","unpdf":"1.8.1","preact":"10.29.8","exceljs":"4.4.0","mammoth":"1.12.2","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsqr":"1.4.0","@modelcontextprotocol/client":"2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/gafj_0.1.58_1788841826506_0.06165485214527466","host":"s3://npm-registry-packages-npm-production"}},"0.1.59":{"name":"@gafj/gafj","version":"0.1.59","description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","homepage":"https://gaf-j.com","repository":{"type":"git","url":"git+https://github.com/MVHProvGrd/resume-generator.git","directory":"gafj"},"publishConfig":{"access":"public"},"keywords":["resume","job-search","interview","local-first","sqlite"],"license":"UNLICENSED","bin":{"gafj":"bin/cli.js"},"engines":{"node":">=24.0.0"},"scripts":{"test":"node --test --no-warnings \"test/*.test.js\"","test:private":"node --test --no-warnings \"test/private/*.test.js\""},"dependencies":{"@modelcontextprotocol/server":"2.0.0","exceljs":"4.4.0","htm":"3.1.1","jszip":"3.10.1","mammoth":"1.12.2","preact":"10.29.8","unpdf":"1.8.1","zod":"4.5.4"},"devDependencies":{"@modelcontextprotocol/client":"2.0.0","jsqr":"1.4.0"},"overrides":{"uuid":"^11.1.1"},"gitHead":"ac109b1c7c2081a919a62f7721aa62236e56a1af","_id":"@gafj/gafj@0.1.59","bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-Kaiv8E2hXO0K6+NseLUtc1uT62JLzLUwm50gw+oYlA5XfafcYF4dSQlvzUYt7tSJrVxX4lHRVu12xb7QjpkboQ==","shasum":"63a6b9051467c1ee13289cef702bd24dbe1755a5","tarball":"https://registry.npmjs.org/@gafj/gafj/-/gafj-0.1.59.tgz","fileCount":154,"unpackedSize":1207340,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCPu3CqfY+MgYjrNwaTRhA9C3/KC/hWWm5DxX43TVS2lAIhAOEZEypAb7OolcF1oH+uyZdr7J32mcCxFfWbi9f7YhBc"}]},"_npmUser":{"name":"gafj","email":"admin@gaf-j.com"},"directories":{},"maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/gafj_0.1.59_1788874300751_0.39572204740588"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-04T16:06:43.837Z","modified":"2026-09-08T13:31:41.093Z","0.1.1":"2026-09-04T16:06:44.249Z","0.1.2":"2026-09-04T18:00:27.737Z","0.1.3":"2026-09-04T18:36:18.389Z","0.1.4":"2026-09-04T19:12:15.943Z","0.1.6":"2026-09-04T19:22:16.489Z","0.1.7":"2026-09-04T19:24:49.663Z","0.1.8":"2026-09-04T19:33:17.991Z","0.1.9":"2026-09-04T19:39:04.434Z","0.1.11":"2026-09-04T19:47:24.716Z","0.1.13":"2026-09-04T19:53:53.899Z","0.1.15":"2026-09-04T20:28:51.066Z","0.1.16":"2026-09-04T20:35:48.761Z","0.1.17":"2026-09-04T21:23:15.611Z","0.1.19":"2026-09-04T21:43:40.784Z","0.1.20":"2026-09-04T21:59:11.256Z","0.1.21":"2026-09-04T22:42:32.475Z","0.1.28":"2026-09-05T03:55:48.974Z","0.1.46":"2026-09-06T05:43:36.251Z","0.1.47":"2026-09-06T12:38:24.829Z","0.1.48":"2026-09-06T14:53:24.688Z","0.1.49":"2026-09-06T19:48:49.474Z","0.1.51":"2026-09-06T21:01:39.289Z","0.1.52":"2026-09-06T21:17:55.410Z","0.1.53":"2026-09-06T21:22:31.646Z","0.1.54":"2026-09-06T22:47:37.966Z","0.1.55":"2026-09-08T03:26:50.440Z","0.1.56":"2026-09-08T03:59:14.916Z","0.1.57":"2026-09-08T04:09:47.415Z","0.1.58":"2026-09-08T04:30:26.687Z","0.1.59":"2026-09-08T13:31:40.905Z"},"bugs":{"url":"https://github.com/MVHProvGrd/resume-generator/issues"},"license":"UNLICENSED","homepage":"https://gaf-j.com","keywords":["resume","job-search","interview","local-first","sqlite"],"repository":{"type":"git","url":"git+https://github.com/MVHProvGrd/resume-generator.git","directory":"gafj"},"description":"GAF-J: a local campaign engine for job search. One SQLite file, one ingest door, your own AI subscription.","maintainers":[{"name":"gafj","email":"admin@gaf-j.com"}],"readme":"# gafj\n\nGAF-J, the local campaign engine. One SQLite file on your PC, one ingest door for generated text, your own AI subscription. The architecture plan is at `../docs/career-engine-plan.md`; this folder is its implementation, built phase by phase.\n\nStatus: phases 1 through 6 built and tested (82 public tests on the synthetic candidates, 7 private calibration tests on the operator's set, 24 tests under `../functions/test` including the phase 7 relay against fakes); phase 7 is written but not deployed, per the plan's separate go decision. Nothing below has been run on the operator's Windows PC yet except the phase 1 import. What exists:\n\n- `core/schema.sql` schema version 1 (plan section K); `core/migrations/002-profile.sql` adds `candidate.profile_json`\n- `core/scoring.js` verbatim from the Firebase function, with three text helpers added to its exports\n- `core/kb_import.js` legacy knowledge base to accomplishment rows: metric cleanup, outcome keys, verbs, duration and tenure claims, and the fixture rule for per-dimension review state (a dimension is confirmed only when a fixture line exercises it on that record)\n- `core/rules/*.md` the engine rules per document kind, candidate-neutral; `core/rules/index.js` versions them\n- `core/schemas/` the output schemas in a small schema language (string classes, claim-bearing fields, counts) with a JSON Schema export\n- `core/provenance.js` the claim check: every claim resolves to a cited record's confirmed dimensions or to this application's interviews, documents, and people\n- `core/validators/` the ledger as seven functions: `no_dashes`, `no_derived_tenure`, `highlight_body_match`, `metric_pairing`, `verb_ladder`, `style_config`, `no_confabulated_history`. Style rules warn or block per kind and house settings; integrity rules always block\n- `core/house_rules.js` style settings with opt-in allowances; `core/text.js` figure extraction and identifier stripping\n- `core/tracker_map.js` tracker rows to store shapes; `store/import_tracker.js` idempotent import with a rounds manifest for what the tracker holds as prose\n- `store/` open with the documented PRAGMA order, migrations under a lock, `withTx` with BUSY retry, append-only events with actors, IANA zone check, home folder with a sync-folder warning, snapshot, xlsx export, backup and restore, `context.js` (the slice and application universe a check runs against), `ingest.js` (the only door onto the document table; three attempts per run then stop), `review.js` (confirm, edit, drop a dimension; bumps the kb revision)\n- `core/generators/` the packet builders: `serialize.js` (one record, confirmed dimensions only, bounded), `slice.js` (precedence: pinned, then evidence-cited, then the top five by rankEvidence per category at weight 7 or above under a byte budget; a required set that overflows fails closed), `excerpt.js` (title, location, comp, evidence lines, a bounded body window; never the raw text), `packet.js` (one semantic packet per operation: rules, context, slice with ids, output JSON Schema; refuses without frozen scoring; prep-family packets carry this application's facts only)\n- `bridge/paste.js` the paste route: the packet as one text file with the run handle at the top\n- `store/packets.js` gathers the facts and opens the run (ai_run pending with packet hash and kb ids; ingest uses those ids as the slice); `store/scoring.js` the scoring contract (`proposeFromScan`, `freezeScoring`: verbatim evidence or rejected, evidence ranked with scoring.js unchanged, weighted mean, verdict, evidence hash, supersedes); `store/render.js` Markdown export of a passed document with the round and people from the store\n- `mcp/` the stdio MCP server (phase 3) on `@modelcontextprotocol/server` 2.0.0: read tools (`campaign_snapshot`, `list_interviews`, `list_postings`, `get_posting`, `get_scoring`, `list_accomplishments`, `get_person`, `get_<op>_packet`), the one door (`save_document`, isError when blocked, stop after three attempts), and the proposal tools through `store/proposals.js` (`store_posting` proposed and idempotent, `propose_categories`, `kb_gap_request`, `propose_accomplishment`, `export_tracker_xlsx`). Nothing on the wire confirms, schedules, sends, or applies\n- `http/` the local server (phase 4): 127.0.0.1 only, Host check, session cookie on every /api call (HttpOnly, SameSite=Strict, minted from a single-use launch nonce), Origin and JSON checks on mutations, 1 MB body cap, CSP with no remote scripts, SSE change feed on `/api/events` polled from the event log so MCP writes show up too. `store/transitions.js` holds the UI-only state machines (section M); `store/reads.js` the screen read models\n- `ui/` Preact and htm vendored as one file (`ui/vendor/preact.mjs`), no build step: dashboard (screen 1), application (3), interview hub (4), document view with print CSS, and the packet modal with the form-based repair editor (7)\n- Phase 5: screens 2 (postings: paste, store and scan locally, edit and freeze categories, log the application), 5 (knowledge base: gaps to answer, pending rows to confirm or dismiss, imported dimensions to review, search), 6 (settings: route, providers with write-only keys, house rules per kind, thresholds including the export folder, backup and restore test). `store/kb.js` holds the only confirm path after import; `store/settings.js` the config writes; `core/practice.js` and `store/practice.js` the drill workbook with planted anomalies, an AnswerKey tab, and a Solution tab, written with exceljs. The four paper moments run as scripts in `test/moments.test.js`\n- Phase 6: `bridge/byo_key.js` and `bridge/providers/{anthropic,openai_compatible,gemini}.js`, fetch only, https unless loopback, no redirects, keys scrubbed from every error; `POST /api/run/:op` runs a packet through the active provider and straight into the door\n- Phase 5b, onboarding (plan section U): `core/parsers.js` extracts text from docx (mammoth), pdf (unpdf text layer), md, and txt under caps (raw size, docx entries and inflated bytes, PDF pages, timeout); an empty result is stored and shown as a failure with the \"OCR is not in v1\" message. `core/schemas/extract.js` and `core/rules/extract.md` define the extraction packet; `store/onboarding.js` is propose_from_source: every factual atom must be a verbatim excerpt of its source at the span it cites or the draft is rejected whole, pending rows carry batch, source, attempt, and excerpts, dedup suggests groups (same employer, overlapping dates, a shared figure) and the candidate merges or keeps separate by a click, style is proposed from the sources and never imposed. MCP adds `list_sources`, `get_extract_packet`, `save_extraction`. The synthetic one-resume candidate goes from upload to a confirmed knowledge base and then through the resume door in `test/onboarding.test.js`\n- Roadmap close-out (plan sections O, Q, U, and phase 7 as code): `test/hostile.test.js` is the hostile corpus against both doors (malformed and truncated JSON, fences, arrays and primitives at the top, nulls and objects for arrays, unknown and smuggled fields, 2 MB bodies, 100k-deep nesting, `__proto__` and `constructor` keys, terminal escapes, spans outside or shifted against the source, homoglyphs, a fourth attempt), plus an `npm pack --dry-run` test that every shipped file is on the whitelist and none is a fixture, a database, or a log; `core/extract.js` caps content at 1 MB and nesting at 64 levels and rejects `__proto__` at any depth; the schema validator refuses control characters and looks fields up as own properties (a `constructor` key used to pass as known). `store/log.js` is the operational log at `HOME/logs/gafj.jsonl`, keys fixed to `ts, level, event, entity, entity_id, actor, ms, status`, values cut at 200 characters, rotated past 10 MB with three kept; `serve` writes one line per request (method, path shape, status, ms; launch nonces collapsed) and never a body. `store/kb.js listHoles` computes the questions the records themselves raise (a record with no confirmed figure; an ownership verb at the top tier with no scope figure) with a prefilled draft; the answer lands pending with `replaces`, and confirming it extends that record's confirmed dimensions instead of adding a twin (screen 5, \"Holes\"). Phase 7 as code, not deployed: `../functions/relay/` (ledger, Stripe signature and event-id idempotency, operation endpoints with every cloud dependency injected, `functions/test/relay.test.js` runs the stop gate against fakes) and the local half `bridge/credits.js` with the relay url and sign-in token in config.json (masked on read), `POST /api/run/:op` on the credits route, `GET /api/credits/balance`, and the Credits card on screen 6\n- Discovery, the shakedown after upload (plan U): `discover` is a candidate-level op (schema v3 rebuilds `ai_run` for it; `store/migrate.js` now runs the documented foreign-keys-off recipe with `foreign_key_check` before commit). `core/rules/discover.md` and `core/schemas/discover.js`: the AI reads the confirmed records, thinnest first with the engine's holes and every prior question in context, and returns questions only, each tied to a record id in the slice. `store/discover.js` is the door: a question about a record outside the packet is refused whole, duplicates drop, twelve open at most, three attempts then stop, and a new round is refused while questions are open. The candidate answers on screen 5 (\"Discovery\"); the answer is a pending row with `replaces`, so confirming it extends the record. `store/reply.js` picks the door by the run's operation for the UI, the CLI (`gafj packet discover`, `gafj ingest --run`), byo_key and credits runs; MCP adds `get_discover_packet`, `save_discovery`, `list_questions`.\n- Bullet register (screen 6): `house_rules.bullet_register` is `result_first` (default, RAS), `action_first`, or `posting`; it travels in the resume packet's HOUSE RULES and `core/rules/resume.md` says what each means. Same facts, same claims, same gate; only word order.\n- Backup folder (screen 6): `config.backup_dir`, meant for a synced folder (Drive, OneDrive, Dropbox); `store/backup_dir.js` writes dated consistent copies there (`gafj backup`, the Back up now button, and one a day at `serve` start), keeps the newest 14, never prunes a pre-restore copy, and refuses the data folder itself. The live store never goes to a synced folder.\n- Hosted tier (plan W, gates 2 and 4 as code): `http/hosted.js` runs the same routes, screens, and doors behind a Google sign-in with one store per user under `<root>/tenants/<uid>/`; the session names the uid, the uid names the folder, and no query spans tenants (`test/hosted.test.js` drives every parameterized route as user B with user A's ids and expects 404 and no leaked text). Provider keys, MCP config, and the restore test are 404 for hosted users; the model is reached through the relay with a service key and the uid (`x-gafj-service`, `x-gafj-uid`; the relay's second auth path), never a stored user token. `/account/export` streams a restorable backup, `/account/delete` removes the folder and every session. `http/identity.js` verifies Firebase ID tokens with node:crypto against Google's JWK set, no SDK. `ui/hosted/signin.html` is the one page with a loosened CSP (Firebase Auth from gstatic). `gafj serve-hosted` is configured by environment only; `deploy/hosted/` holds the Dockerfile and fly.toml; `functions/relay/deploy.js` builds the relay with Firebase Admin, Stripe, and the Anthropic SDK and `functions/index.js` exports it as `relay`. Nothing is deployed; `docs/operator-setup.md` is the list of what only the operator can do.\n- First run: `ui/screens/welcome.js` gates the app until the six setup steps are done or skipped (`store/setup.js`, `/api/setup`): which AI (key saved and tested inline; paste; Claude Desktop config inline), upload, extract (Extract all runs every file through the active provider; paste opens a packet per file), confirm pending inline, discovery questions inline, first posting inline. The dashboard carries the same checklist afterwards. Provider form is provider plus key with an advanced fold; the first provider becomes active and the route switches to it.\n- `bin/cli.js`: `start` (the one command: candidate if none, then url or serve), `migrate`, `import`, `snapshot`, `review`, `lint`, `list`, `score-freeze`, `packet`, `ingest`, `render`, `export`, `backup`, `restore`, `mcp`, `print-mcp-config`, `serve`, `url`, `rotate-token`, `install-startup`, `allow-host`, `init`, `onboard`; every other command names its phase and exits\n\nOnboarding another candidate, phase 5b:\n\n```\ngafj init --name \"Priya Natarajan\"          a fresh candidate and an open batch (GAFJ_HOME picks the folder)\ngafj onboard add resume.docx old-resume.pdf notes.md\ngafj onboard packet --source <id>           an extraction packet to paste into any chat\ngafj onboard ingest --run <run> --file reply.json\ngafj onboard dedup                          suggested duplicate groups; gafj onboard merge <group> [--keep <pending id>]\ngafj review                                 or the knowledge base screen: confirm, edit, drop, each beside its excerpt\n```\n\nThe paste loop, phase 2:\n\n```\ngafj list postings                         ids and whether scoring is frozen\ngafj score-freeze --posting-id <id> --from-scan --propose-only   writes a categories file to edit\ngafj score-freeze --posting-id <id> --categories <file> [--scores <file>]\ngafj list interviews\ngafj packet prep --interview-id <id>       writes packets/packet-prep-<run>.md; paste it into any chat\ngafj ingest --run <run> --file reply.json  blocks name the field, the span, and the nearest records; three attempts then stop\ngafj render --document <id>                Markdown of a passed document under documents/\n```\n\nThe UI, phase 4:\n\n```\ngafj serve                 starts the local server (serve.lock holds pid and port), prints a launch URL, opens the browser\ngafj url                   a fresh launch URL for the running server (each one works once)\ngafj install-startup       registers serve at login (schtasks on Windows, launchd on macOS, a systemd user unit elsewhere); --print shows the commands only\n```\n\nOn your phone (same store, same screens, over your own private network):\n\n```\n1. Install Tailscale on the PC and the phone, same account (free personal plan).\n2. On the PC:   tailscale serve --bg http://127.0.0.1:7311     (your gafj port; prints a name like gafj-pc.tail1234.ts.net)\n3.              gafj allow-host gafj-pc.tail1234.ts.net        then restart gafj serve\n4.              gafj url --host gafj-pc.tail1234.ts.net --qr   scan the code with the phone, or type the link once\n5. On the phone: Chrome or Safari, share or menu, \"Add to Home Screen\" / \"Install app\".\n```\n\nTailscale terminates HTTPS on the PC and forwards to the loopback server, so nothing is exposed to the internet and the phone is a real installed app with a Secure cookie. Only hosts on the allow list are answered; every other Host header is still refused. The PC must be on for the phone to work: the store never leaves it.\n\nConnecting Claude Desktop or Claude Code, phase 3:\n\n```\ngafj print-mcp-config      prints the Desktop snippet and the Claude Code command with absolute paths (never npx)\n```\n\nA tracker-imported scoring row is frozen with no categories; packets for it rank the slice against the posting text instead, and `score-freeze --from-scan` replaces it when you want categories.\n\nOne deviation from the plan text: the highlight check (ledger rule 2) uses the shipped scoring function's semantics, a figure key match in the body or a different figure from the same record, rather than a phrase match. The phrase rule blocked every live resume; the key rule catches the missing-evidence case the rule exists for.\n\nPrivate calibration gate (needs the candidate's own files, never committed):\n\n```\nGAFJ_FIXTURES_PRIVATE=<folder> GAFJ_KB_DIR=<folder with accomplishments.json> npm run test:private\n```\n\nRun the tests:\n\n```\ncd gafj\nnpm test\n```\n\nNode 24 or newer. Dependencies: `exceljs` (tracker import and export), `@modelcontextprotocol/server` and `zod` (the MCP server), `preact` and `htm` (vendored into `ui/vendor`; the browser never loads from node_modules), `mammoth` and `unpdf` (text extraction for onboarding). `@modelcontextprotocol/client` is a dev dependency for the stdio test. Never put candidate data in this folder; real fixtures live outside the repository (see `GAFJ_FIXTURES_PRIVATE` in the plan).\n","readmeFilename":"README.md"}