{"_id":"@tiangong-ai/cli","_rev":"48-db4c6d5108e5c129a386584a7ac5e006","name":"@tiangong-ai/cli","dist-tags":{"latest":"0.0.50"},"versions":{"0.0.1":{"name":"@tiangong-ai/cli","version":"0.0.1","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.1","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"d3e48280a379705a6b57034d6a41358633fef069","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.1.tgz","fileCount":11,"integrity":"sha512-BsTS5xtfnvXs2PeISVcm4asPJQ51k8H1hYkSSUOKq9cTP15w2vD8gvVGLegbyKRRu5/fsSaw9AFc28ByVnon5A==","signatures":[{"sig":"MEQCIFVcijIInKQibBNUqbQgbJLjlqaLK2RZd5Fr7NELXRwVAiBqr8mKjWHwBG7TWfeydwwMgTv4LuXYypUdHZgZmd681A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67136},"type":"module","engines":{"node":">=24 <25"},"scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"linanenv","email":"linanenv@gmail.com"},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.6.2","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.1_1778235939299_0.06519211069511832","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@tiangong-ai/cli","version":"0.0.3","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.3","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"f65f8ff787b6a36c37ae7c352c2008cd7b5fc36c","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.3.tgz","fileCount":11,"integrity":"sha512-4r+vEbYLpGHirdf4Vl6J6QA2jeiAfEu82Xeht8yuFiCiUzNjeOzsdz00dMFm0dOABRyxzcOdOOPjbidNjUfdDQ==","signatures":[{"sig":"MEUCIQDnmSNaXRPk07qajE30/VYr3Cjzcr0Fr70N/CIxMLzufgIgJc61nMaI5OnrKsurN1vFvxRuO5lx26k3epQalwmxw68=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":67126},"type":"module","engines":{"node":">=24 <25"},"gitHead":"1e5e6cfea24c1b1c558e97bb23eeea4ec08c8b7d","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.14.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.3_1778236919932_0.3972246035086331","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@tiangong-ai/cli","version":"0.0.4","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.4","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"7e3ebd72533e6937a4bd6bbb284b3e6491b70be6","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.4.tgz","fileCount":11,"integrity":"sha512-JKolJG5Uw0uk9m/OYcZ0gz6/oVAKEYAHcgPPqruerOx2gXC+wkRSmecf5bK5DZfziq51GY2QIYw2XT6hiCBc2g==","signatures":[{"sig":"MEUCIQC0UvkDXPDc30FvpwxFC6wr3dcs8Cy3jF9eBeTKKz2JnAIgOUv17P8Ip4sV0oNARi0OsLATiqSXeLdOtN0qgrZxiQY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":236863},"type":"module","engines":{"node":">=24 <25"},"gitHead":"b323c9fc80c91a4558babbb54066ed97cce0bf24","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.4_1778422939551_0.11722691465155255","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@tiangong-ai/cli","version":"0.0.6","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.6","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"788365a0bcd0078041d0dd83ed41ae5e9c082bbb","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.6.tgz","fileCount":11,"integrity":"sha512-UzuXcZWyFGgGtT93hICAq99mGAMBZ4iYm+nPdMlY7xS5PK5zhjSfmfzYQ/7fV8drnrzYbueGJlcm4H7j4ihIcw==","signatures":[{"sig":"MEUCIQCQXwIIQ5GJpWwN2j+M/M+rOba3wzt2BKygnUJmnlX/9wIgJPyb6pMCyAAb1P+oZySeZbaFLs93Lo2fVf/fPPae/ZM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":237071},"type":"module","engines":{"node":">=24 <25"},"gitHead":"5388ebb9e4a4ea43c52f4dc05589afd4e1a78eb8","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.6_1778425399303_0.12148615777318206","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"@tiangong-ai/cli","version":"0.0.7","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.7","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"35db763233f9f043517a5d3470d263e7f3a07558","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.7.tgz","fileCount":11,"integrity":"sha512-mF2WFN3xafd7DBb5RVUYBZWEIWRSkXmkqm4YFe0Yu6FB13NA6C2ssZXsQjYYw1uUmlS8D9jPS5SbYAFxIBwZ/w==","signatures":[{"sig":"MEUCIQDMPg7QwRPFXDNkuDtYT8H7y/66j2eq1qx5Nh3Qx672QQIgcpblHd52zO4GEaFnBLZYBz8yaYMuUciYDOpeBgFl5sw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":269701},"type":"module","engines":{"node":">=24 <25"},"gitHead":"1c91a0dcf2c40b542ab758822e5c1cc7227cf565","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.7_1778583498967_0.8753301184798479","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"@tiangong-ai/cli","version":"0.0.8","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.8","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"f28f08454b26e31ae1f126746ad3471e9db312b0","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.8.tgz","fileCount":11,"integrity":"sha512-x6KI5Nu+g3JiTj6nJiNpkcXN5o30VcRZhgV1IHUTjHj0Ir9nYaJtkEns8DmHkcB867Z+wJ8c1t6ye2EfEq9QCg==","signatures":[{"sig":"MEUCIQCBliCp0JQOOAf9B+9pYin5P0QNkjVLU5FKgguAcDxY4gIgNb6nLaZLI6AV4rPXKgYi8FmDKP5AfI1Ig+7y6F/2vKY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":260538},"type":"module","engines":{"node":">=24 <25"},"gitHead":"9f6d90b59729299ccd7fa2ee190b3489f39e7e43","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.8_1778652012721_0.3938229018455015","host":"s3://npm-registry-packages-npm-production"}},"0.0.9":{"name":"@tiangong-ai/cli","version":"0.0.9","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.9","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"c06d190499c152066cdf77268d28cf7745fe6b50","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.9.tgz","fileCount":11,"integrity":"sha512-5oH4l16BT23xnv2HPgZGN06KQLilTMnziwEIdVKvX6UIv5VXqROiak528sTkXHH5qQhxhA9S+7y3ij4n8vA1qA==","signatures":[{"sig":"MEYCIQDu8jb9NPcyaMCk1un1TsbZBA34CKrWy+o7SyONPRodbQIhAISEYnbbkws8Dje1z3x9FBjZ+eAAq0rlnsn7SrnURDhm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":260615},"type":"module","engines":{"node":">=24 <25"},"gitHead":"ab563926a36f07f61f3926d0dac31544ec078c98","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.9_1778653288985_0.7914768394206801","host":"s3://npm-registry-packages-npm-production"}},"0.0.10":{"name":"@tiangong-ai/cli","version":"0.0.10","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.10","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"d315dedf4b3eec0161ed8e8f0057958d0a1e403c","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.10.tgz","fileCount":11,"integrity":"sha512-RSASRN1JzgK0nrKrNQnwO1nIHrM4UVcDciwWkuQbPCfRcnuCErE7dlR3pdiXKjrMF231Y4F31o0T7LBS1rZ6rA==","signatures":[{"sig":"MEUCIQCUII+DoGd9EgBrCNKPHQtL5qzbNdkavEzKT/KOYumy0QIgQ9fEk6KrkQpYFfrX8pjH96Fp4ypcz7LxCl926YHHJM8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":261516},"type":"module","engines":{"node":">=24 <25"},"gitHead":"e33f2a21d0c5d35cd04d5eafb668e4f2de2d0e0d","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.10_1778668566727_0.40282414623543206","host":"s3://npm-registry-packages-npm-production"}},"0.0.11":{"name":"@tiangong-ai/cli","version":"0.0.11","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.11","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"d082ae0d15261e990881b56ca15b1d57a3cc2351","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.11.tgz","fileCount":11,"integrity":"sha512-JUYK5qmYSPRETwyWgep696fRzdKn5B3pA1I3tkVG0QBT+/oTFQFsjeKB63GFteeOKo5botk9JhMPN/iKPmzT4Q==","signatures":[{"sig":"MEQCIHq0fPJYHDmFblP7VpycS39BKYJd1NkkMbyAdj9lLqywAiAnZUc8EoTeOfR7AZCPWVidZBocxQ2UrQnA5djiKq2DEw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":266333},"type":"module","engines":{"node":">=24 <25"},"gitHead":"be56490b427d4e3308be9fb1bcc9e28422ccbc60","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.11_1778822808185_0.5883104992282029","host":"s3://npm-registry-packages-npm-production"}},"0.0.12":{"name":"@tiangong-ai/cli","version":"0.0.12","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.12","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"678f55164f65e2ea107e1abd89d7d8b9b3a25e0f","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.12.tgz","fileCount":11,"integrity":"sha512-3Sgu7N7b+6v5zRCeUiOMvp7zj5AmD6VN7WIDT+1+1OibybDARkFJGU5D9t31oZPwZY7v3yQfnrRCEv/zE/ENkw==","signatures":[{"sig":"MEQCIBNG2iW8oscNBEkYJT6Trppvy9fZ79vXiJqeqDLTE6MAAiAG/eqa413LbBjIjF960WmMCqJJCezEvXksH2CRzIJeaA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":266333},"type":"module","engines":{"node":">=24 <25"},"gitHead":"d56d2633c2d69354d2cc787fe241459d887f22b9","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.12_1778936698722_0.7059176899204662","host":"s3://npm-registry-packages-npm-production"}},"0.0.13":{"name":"@tiangong-ai/cli","version":"0.0.13","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.13","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"a779b7cc9586201c2123dbefb68d3708864f87f1","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.13.tgz","fileCount":11,"integrity":"sha512-qf3c4U/e3n3wPdXFfLw/rQAJGBNtnjLwGWpr54QEKGEW9oaMg+ZAZKy3Ic/Hl3sgDGOVZ44ZnNEHzu1XVkrbjw==","signatures":[{"sig":"MEQCIBR7MTeQ2uSA0dWaVhunrsgHf7FjMGpxMCWcE1Tv9UKkAiAbvE+RJfR26uFW1a5M4jrLUFsk7nBUURLp+/x27uO/Zw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":268083},"type":"module","engines":{"node":">=24 <25"},"gitHead":"6a05f20d5e167b770fce1aa3286a7dbdd2e1cd0d","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.13_1779167523567_0.5576318646806833","host":"s3://npm-registry-packages-npm-production"}},"0.0.14":{"name":"@tiangong-ai/cli","version":"0.0.14","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.14","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"e7e2c2f36171484bb2a776ea0272173b104302a2","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.14.tgz","fileCount":68,"integrity":"sha512-Z2rGgj4pUsTJwqpu8zV0WfIIP9wICkTNSYk5nWVOGui/GUhQGH4iG54MK6PYO4vI8ZglVNQ7HSiUe3zseBbHDA==","signatures":[{"sig":"MEUCIQCvFeE9FEAplunTXggJC5gKLqEH0SO50lM7kc/6KjzXjAIgDaN4Fw9A7jUnwhXRuaUlEXc7IDKG+BW2HcD3NWyY5vM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":345834},"type":"module","engines":{"node":">=24 <25"},"gitHead":"ae90d45670f1ca03f976cd7d2a83b1dedae7f702","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.14_1779865690391_0.6723498834589181","host":"s3://npm-registry-packages-npm-production"}},"0.0.15":{"name":"@tiangong-ai/cli","version":"0.0.15","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.15","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"d9102f2c29af2fa60b2bada88576f4addc1cdd73","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.15.tgz","fileCount":68,"integrity":"sha512-amwxIzQ2Io+/0XzHb9aQvwuH8L0yGNLGgkqcNuod0uim8UOqPTqnS6fzxcaIRPcJ2s2rjW7hfTQTotSicXzMcA==","signatures":[{"sig":"MEUCIQCtGdbbAY0HpK3tJNofmMwkrr4rrd/Twd0fwZJRQCdWQwIgZWOTMNV8thEn6b3rD/KQiGaOuYxD5b2GghOwDoDLO7c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":345851},"type":"module","engines":{"node":">=24 <25"},"gitHead":"8bd0ba63b906789761fc21f450f9979bd5e1b0b9","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.15_1779865777141_0.002871158544280661","host":"s3://npm-registry-packages-npm-production"}},"0.0.16":{"name":"@tiangong-ai/cli","version":"0.0.16","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.16","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"4f850bafcbed16d283661555368e6b1437393fe6","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.16.tgz","fileCount":71,"integrity":"sha512-bdOzKfP9MZSdx/nuw/ik8YsagLjD/xZtoWCni/1GWV0p6xyy5EAhmtQPxJqMvPWxPwz0cYKcHpbsB3C7PJUwAg==","signatures":[{"sig":"MEUCIQD8Zd04n4HZPe0BPqWqGp7I+I1DTUrCcLqvlByTyHlUvwIgTxM+CwzTrpXzE4YkNHYPiNDrw31fnn1fSC/4tVjpGBw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.16","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":361012},"type":"module","engines":{"node":">=24 <25"},"gitHead":"09572bea5a50c07a5a8e023a2b7e180cbd037d75","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.16_1780042147948_0.04033812738373044","host":"s3://npm-registry-packages-npm-production"}},"0.0.17":{"name":"@tiangong-ai/cli","version":"0.0.17","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.17","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"cf2795de66e28265192a88d74ea0307de8d2bb7d","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.17.tgz","fileCount":71,"integrity":"sha512-O8xsDaoikZmMJ36xNgABZwjAXs9qVYDkQGr1aCF61mPWLyUR+FI4xlYaS9V7zovSgnTtXZv3qJLTV+jFN92xAA==","signatures":[{"sig":"MEYCIQCNZZ1/uCbe+tk153IeviUX6Z+KoHtFm0/zjcey7dOK5QIhAI7NU0INBmtG5VqvW3lL3SM7ua5smLwZtOkx12uRgZpA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.17","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":361215},"type":"module","engines":{"node":">=24 <25"},"gitHead":"8ca14bfbc4c052064ccc931af0b43bfab486ae7f","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.17_1780312711303_0.835606469575265","host":"s3://npm-registry-packages-npm-production"}},"0.0.18":{"name":"@tiangong-ai/cli","version":"0.0.18","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.18","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"aa7e3b6c9701da40c2d23e382a21a26f76994c9b","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.18.tgz","fileCount":71,"integrity":"sha512-F8t8knVXpxD8lHURQM3q1S9fC2Hc+KPSLDCrCeDUfpyVhuYDFl7foIgtKj1j1ODzEQOdGwwYXaaqANLn2K8Qwg==","signatures":[{"sig":"MEYCIQDCXZhFYT4TD1bTb3II3uqHevMUCEJCNF/WKvh7rOCjBgIhAIJsSzXOnVlFCoaf3mJihyoaQU/JwHhZXPZYRXgSsUfD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.18","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":362916},"type":"module","engines":{"node":">=24 <25"},"gitHead":"6f8a33418ce82ca5b2e05c647054d0af24c34e0a","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.18_1784113374575_0.7694906480333801","host":"s3://npm-registry-packages-npm-production"}},"0.0.19":{"name":"@tiangong-ai/cli","version":"0.0.19","keywords":["tiangong","ai","cli","kb"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.19","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"0b3cea3ee177d0276eb41ae45d42bb4c34da8199","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.19.tgz","fileCount":71,"integrity":"sha512-8Dh5aA2TG5z3Hi9vVCZrRXJ5e8Y3EuTKGqSBr/WIn/yXQAO4ovxos0Vb1inZlAAvJ/znGNuBdfAuh1adMPgD7w==","signatures":[{"sig":"MEUCIGdBW71jApHOqul3kd9fbpHYw3LaQrEc23oPLIjRgE6DAiEAmnYlcLfwTNwShGMtGiLJgrwPrvuulV412v4KKNMs1To=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.19","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":364591},"type":"module","engines":{"node":">=24 <25"},"gitHead":"e3c4d0347a048971876907b91dd5536eddadab00","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.19_1784705493389_0.21360890142502598","host":"s3://npm-registry-packages-npm-production"}},"0.0.20":{"name":"@tiangong-ai/cli","version":"0.0.20","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.20","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"467ef31695a333db5cf08d9b7acea83af5bb6f27","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.20.tgz","fileCount":107,"integrity":"sha512-KR923FZHrouqUFqWYg3Pf4uyHBl5+8xoh02rdH8Pz2l0nhF4FGqXveVqSivTleWi3HVa4buv+PZEKCnQYLbKgA==","signatures":[{"sig":"MEYCIQCvUTYlRDvbqM0E4TbHQHk+Yfii58+XQlWuQsjRt8Me4QIhAKwib88n5AA1zqUxQeu24ZjYL+SbXW3DICbYdOxIPD/S","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.20","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":605157},"type":"module","engines":{"node":">=24 <25"},"gitHead":"f5d031588a8eb2694573b8c3c83ff07c6ecd2b6f","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"sharp":"^0.34.5","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.20_1785857872391_0.4265766650699603","host":"s3://npm-registry-packages-npm-production"}},"0.0.21":{"name":"@tiangong-ai/cli","version":"0.0.21","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.21","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"eb1a670e8a1295eb5786cb194b1e80eaa36aa10a","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.21.tgz","fileCount":122,"integrity":"sha512-TwP2tptQ95cKMhxdWyjgxN6UR08qM/4Xa71j6F9WSA2c0wxYIPajhoo0f+TGPhC6BUJFC0WhIDamkv2irwyKGw==","signatures":[{"sig":"MEUCIQD9Rv0aUzX4+1C0v7XjAr5Nq6Piqo5xCuw/Be57BGywjwIgMPbP0u5YK9AjBp2mKSd0ez8j/2pqqDmrq1rDIgkh0xE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.21","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":978971},"type":"module","engines":{"node":">=24 <25"},"gitHead":"bc5f73c8418605892b9905263347044c11d8a7a3","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"8.20.0","sharp":"^0.34.5","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.21_1786070632815_0.3205245944214874","host":"s3://npm-registry-packages-npm-production"}},"0.0.22":{"name":"@tiangong-ai/cli","version":"0.0.22","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.22","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"7c3c486bda066bb551362cd6c9bb2e5fa800ebac","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.22.tgz","fileCount":122,"integrity":"sha512-z7eb8NVhGb/vC2XSU95XzbzWZq6/OqNGvNNPbejzXo7UAfeGfUH5dzzzfc5Tarmytveea0qOiyQObewsrubQ/A==","signatures":[{"sig":"MEQCIDxmG7SAe2BzECpEXjhJakOa+6HgxeGfHizKWb+x0fSuAiBzlGdADzbyozemJO1DlUFEXZLYWtdUvOf3JZsdXXLebQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.22","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":979904},"type":"module","engines":{"node":">=24 <25"},"gitHead":"b973ec1d9c21b53b8c80d17c6bea92b4c9c7843b","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"8.20.0","sharp":"^0.34.5","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","tsx":"^4.21.0","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.22_1786073594224_0.5998492541787066","host":"s3://npm-registry-packages-npm-production"}},"0.0.23":{"name":"@tiangong-ai/cli","version":"0.0.23","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.23","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"269b99eb07f1b22188e7d25d3339c217ac3c3726","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.23.tgz","fileCount":128,"integrity":"sha512-+J24UTiIkB9uLHIKUbd7YRrEV+oLRmmKyjKGh/Tph08EECxtsk+4bejQaflbHeVlLnkbHz2lQbWjiLiNkZasJw==","signatures":[{"sig":"MEUCIQDfZQhlLEBgxVNqGJjWmyWvMEjXTyzzxTfBWF8YE/rQ/QIgVWDRKsW8GZmt3AnBkMwkOi0Av/1JLV+HKL5cMcc4EKY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.23","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1138110},"type":"module","engines":{"node":">=24 <25"},"gitHead":"2aee8339c04d94dc42a8b34d20d59af27dbe756d","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"8.20.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.23_1786118738267_0.35897242743217683","host":"s3://npm-registry-packages-npm-production"}},"0.0.24":{"name":"@tiangong-ai/cli","version":"0.0.24","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.24","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"aa2bc4bd201d172e3acd5d767a2e57c959dd8ec9","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.24.tgz","fileCount":140,"integrity":"sha512-Mr/APScS1TVrgKX4JXeszGfFl2Y1kM2/5JXPvjvmelnGOGAwc8oAyFrEwblILrNeWs3jTP+0HnxQ/Z0WslMTCw==","signatures":[{"sig":"MEYCIQDYn7mG1MBa1pYhp9aeJAxLIJ0ECM/wX4yPi0CCNInx3AIhAO865nUJmd9Fq4hLruyGwzC0kBQeQIC1uokk3DF3KxOT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.24","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1561286},"type":"module","engines":{"node":">=24 <25"},"gitHead":"4ac3f08530e2795096437f36d8a3f04fb342195a","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"8.20.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.24_1786170111891_0.8133687840233881","host":"s3://npm-registry-packages-npm-production"}},"0.0.25":{"name":"@tiangong-ai/cli","version":"0.0.25","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.25","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"f5e8aa6180047a5ec1f20045b5ed36ef25fb90c6","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.25.tgz","fileCount":140,"integrity":"sha512-7k02jZSGUOFxmkF1phz4UYUWYYWZ0X3oe/44WLhftVywHnTIIoWAbVpcqwHTQX6dRbhmo9XbN9PhibGD3AtQng==","signatures":[{"sig":"MEUCIEi0IM7Xm7gdGabQsssNdIfxJvmx94y593e6FHXE3VuWAiEA1sGGvvZFAhq95czmf+fZ3wYc12NcvwHXSt2zjvux0bg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.25","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1562480},"type":"module","engines":{"node":">=24 <25"},"gitHead":"e2d378f1626da579548fe2c8dc8ca59858e45f6b","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"8.20.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.25_1786182730154_0.6552763903205692","host":"s3://npm-registry-packages-npm-production"}},"0.0.26":{"name":"@tiangong-ai/cli","version":"0.0.26","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.26","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"416e3e91f45baf03917a48a3874eaf3603048e75","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.26.tgz","fileCount":140,"integrity":"sha512-n9RcJnz2137wrkwf/if6f63G5kQ9cwhdXWlXUS5NxMLZGbFl4cP0I6tImyz5GSDWHgXaDo2BYno+XkOjdtx50g==","signatures":[{"sig":"MEUCIDBOMsAPXJxZSs7LJE91hgtAtqcgjtsg1PQVqqZ8YuSSAiEAsh6JowQ3bD96K+NoK8FEj/g2MI6HqrwQKNz2o46Z4SQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.26","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1569912},"type":"module","engines":{"node":">=24 <25"},"gitHead":"a2ed69478dc9a30b8697eedbafc98acdd4c7c034","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"8.20.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.26_1786189439867_0.7629332340872002","host":"s3://npm-registry-packages-npm-production"}},"0.0.27":{"name":"@tiangong-ai/cli","version":"0.0.27","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.27","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"b640a2b276a5e491a235df1be2a49c4c79eb0712","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.27.tgz","fileCount":140,"integrity":"sha512-zZSBf60dOLxnMFKHn+1fHviSmYVk+m1qG6CcLnOn55hzO9lRdDjryWoEeeRBWolFCA5DEEL4Zo99n3aIvynJHQ==","signatures":[{"sig":"MEQCICjB97Y2Tr1LDCp3GuFg1b+pS3J8AEs6Y1Nbgc5DxKsOAiAthSyH4gzi/qD1cTjwy+6LSsKXrnBcGSxNOQDMQ/c24Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.27","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1569912},"type":"module","engines":{"node":">=24 <25"},"gitHead":"8e990e24c3ab77058a0f67f9bbcea698c6404a3b","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"8.20.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.27_1786208977169_0.3533803464545062","host":"s3://npm-registry-packages-npm-production"}},"0.0.28":{"name":"@tiangong-ai/cli","version":"0.0.28","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.28","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"da6a111fcf684720044b7613ade123d2d3202793","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.28.tgz","fileCount":140,"integrity":"sha512-jSP3J+duBy6kNWR4ff1HhxYzRgQvcxMAMmqrmd4NlwvDcGoCNyXDHQlsAUMM0L/FnNQIQLpGHiXisOd+EE5q9A==","signatures":[{"sig":"MEUCIQDXnM2aWIw77ikY2KUkgylQ6fjTtFSW5V/6M4YwAxPGigIgCud6e7qUH0G/LOl+eXkBYdX+uhz+4IZKo9ufC4M3p/0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.28","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1634089},"type":"module","engines":{"node":">=24 <25"},"gitHead":"4ddc522fae9fb6a69e1a2aee3d0ea0fb6665eb34","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"8.20.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.28_1786266679762_0.6959512375495991","host":"s3://npm-registry-packages-npm-production"}},"0.0.29":{"name":"@tiangong-ai/cli","version":"0.0.29","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.29","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"72abba134681ba95d6ee9e33f7c915ec70caeecb","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.29.tgz","fileCount":140,"integrity":"sha512-RBkMVCg3T7m6qa+eLfcfPQZKm8GMao5izReTTntJUjClJ65vtkHJu4Z5vvJ6TrijDIVL3TCy5CZvK+TX9cNhnQ==","signatures":[{"sig":"MEYCIQDXRlCz6p53Puy/YPbh+TEY1t3+y5borEvybEBY8VJRZwIhAO/QIXkFAKuC0t2l3EcaIQJBnmTud6gvkeDAnXLsNTW8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.29","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1664746},"type":"module","engines":{"node":">=24 <25"},"gitHead":"6014c3cf3e9bd13a89285e80483f02148a3f0fb0","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"8.20.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.29_1786270592045_0.6188515288518384","host":"s3://npm-registry-packages-npm-production"}},"0.0.30":{"name":"@tiangong-ai/cli","version":"0.0.30","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.30","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"6507a1967ecc6a8d31204cf625449686db72a318","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.30.tgz","fileCount":140,"integrity":"sha512-kVw383tsZ5Fv/G6dj9HsiO3j4r91a+prVaWo3jv5j/EiQi6aTYIDsyqn0DyvX7ZsLyXRDTmBd45zOjDrJZ4row==","signatures":[{"sig":"MEUCIEaxgmTwbSVqcVg7NLUzIKRkxqpUlf1awuVjTeL3sXioAiEAoU370r1FyqKrYxkaduuDYzCs53Nq7qWVdlYaWP8cI0E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.30","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1669633},"type":"module","engines":{"node":">=24 <25"},"gitHead":"14c804e61b3768489253533ee754b6f7e75460ea","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"8.20.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.30_1786274886736_0.7169810848726146","host":"s3://npm-registry-packages-npm-production"}},"0.0.31":{"name":"@tiangong-ai/cli","version":"0.0.31","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.31","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"66ac0264b15465fbfd845d6d4bd44bf5e0fd8d62","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.31.tgz","fileCount":140,"integrity":"sha512-xbl+Lmzmjv2YRJeH9dXd+arS/9Wa6gjfvJRr9sSuDvIfGbxIrpEgn8mFAynaYtsKzxJcg4/Uy62m6/34Qk1WCg==","signatures":[{"sig":"MEUCIHWrXLQia/d4OMd+tlEjY15Vf7s0LvMFPYUVOoSj82UCAiEA8jwwGbSLefmYJxti9GX8ZqKtSF4fieyYpb6yMq5afKk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.31","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1719953},"type":"module","engines":{"node":">=24 <25"},"gitHead":"bef62f8d48c42eaff14fa2bd7eba1be83a46a58b","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"8.20.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.31_1786280750419_0.9765480309242338","host":"s3://npm-registry-packages-npm-production"}},"0.0.32":{"name":"@tiangong-ai/cli","version":"0.0.32","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.32","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"a9a83e087d207ac651e1ef846d5a3c8398cb81e3","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.32.tgz","fileCount":143,"integrity":"sha512-7uI0jMe466B5kh1EdDPp19QTONlyJWL5yh3LPhabcKkFNLLMnPkdtavEv3939UPQtWIjvQ0ANwMZU6+t2zyHuQ==","signatures":[{"sig":"MEYCIQD/t3TphDQij0W3iBclnFIt6bwForWuUOkIF/1I++SjuwIhANx3xWuIaAkX3cxtWKXDfvFBBjLGpoXweiC6wCNIztLT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.32","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1837367},"type":"module","engines":{"node":">=24 <25"},"gitHead":"0d814fa220c85c51e90d186b529513ed70f75cdc","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"8.20.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.32_1786346763677_0.9149581775677442","host":"s3://npm-registry-packages-npm-production"}},"0.0.33":{"name":"@tiangong-ai/cli","version":"0.0.33","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.33","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"f6e4dba4e7104a56061983df186b8ede8a4f1250","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.33.tgz","fileCount":167,"integrity":"sha512-t5JUH+7geABkOLhgh4PHTeyD1o3XinXWYAlD0OEqDXmMSDaCaMqQsn1LX3htTy+JzKFcZDPQEiRCtHRJSiC6OA==","signatures":[{"sig":"MEUCIQCHFlQdRiijR+jplg7UNoeMS5tMKygRJaDWGAOmuGPNIgIgJDpcggSvfumHO0Wi97kcZ5ABCV1/4v7rFynQpgmaGg8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.33","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2283816},"type":"module","engines":{"node":">=24 <25"},"gitHead":"022e8853225163a7d6469fb269efe85173f08844","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run lint && npm run test:coverage && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ajv":"8.20.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.33_1786450016404_0.40957889284884597","host":"s3://npm-registry-packages-npm-production"}},"0.0.34":{"name":"@tiangong-ai/cli","version":"0.0.34","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.34","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"51bd3bcb972acf2eb95b6e859a3b3779197d02e5","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.34.tgz","fileCount":170,"integrity":"sha512-srdceqJmGe83PvN/ptH6WahP70PBgXEw/9A25+Dujz+5ZDSwNp1Bz960+8+uu+oRBathmK2Dv4MQvtNvyWtzFA==","signatures":[{"sig":"MEYCIQDgUKVftKYv3DboWNQqT1/Lqu61I6Htc79DK/Z4Y2QD9QIhAP/pNBUjJU4/oMy751EQ2s7tWAO/vJ2yVzDdSEVYoIDL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.34","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2346567},"type":"module","engines":{"node":">=24 <25"},"gitHead":"85184080e247d52eaa8487e6d16cbed3a9693856","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.34_1786471466518_0.5711247790446754","host":"s3://npm-registry-packages-npm-production"}},"0.0.35":{"name":"@tiangong-ai/cli","version":"0.0.35","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.35","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"bac4ee02a0282125da5a8f5d5b1dce02679285b6","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.35.tgz","fileCount":182,"integrity":"sha512-BX3wTs8aFscLcZqqjwXwZSu3EG4HdSje8gQpipYZGu85Q8V6GPaZS9emfY1RX3Zk3RTnT8Xc93L8bm7wnJuTyA==","signatures":[{"sig":"MEYCIQCS0au1H0i8l3YAfv6HoGk4KoPUkmNz4mmKyV6Qzs7hVQIhAL+wIf4Ggvwvcw4Be7iP5Kf5VUQnIRYrb37s62byv2ZT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.35","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2615760},"type":"module","engines":{"node":">=24 <25"},"gitHead":"6369461ca3c0866c5a37f991dac8760ea8f361a2","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.35_1786566579511_0.021081632801519756","host":"s3://npm-registry-packages-npm-production"}},"0.0.36":{"name":"@tiangong-ai/cli","version":"0.0.36","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.36","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"4b28c5a17de084d84a12057c2fdbfe8c4751d77e","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.36.tgz","fileCount":191,"integrity":"sha512-5MuY7hTmYQUj8C+bkFc3uxaYOWXJrF4wh7r8rRWDc3COHTMyFWP/+lTsoLuKl10NXSMG7lEr+ISGJNA8bbmrPA==","signatures":[{"sig":"MEUCIGzqnJbvSaucZFaq+gwg/57XX4PCI55Cdzv8bdY2SS+IAiEAqAWPyUh1UcDfD61qUc8sYczlX8z+H2wwAfxK0prld3s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.36","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3017040},"type":"module","engines":{"node":">=24 <25"},"gitHead":"32e15e42bb3874ab51636c3329e13ea05b95b181","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.36_1786761624326_0.5748268525945817","host":"s3://npm-registry-packages-npm-production"}},"0.0.37":{"name":"@tiangong-ai/cli","version":"0.0.37","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.37","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"c0a6ec8041d25f1fef76807d8b92c5bfe4da2fd1","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.37.tgz","fileCount":197,"integrity":"sha512-OKYQzRrNxUdmMr/AqKewK3uVHrxwIaWxfUA3JFp274Il2q+0T7bd3eedDGs9o5y07zn2T+WTcHZR6YGbJ6TXCg==","signatures":[{"sig":"MEYCIQDtHc0wpZ8jG6Wsf0LN6ubLhCbl1dwtANPRv6/jWSlP3wIhAJUC9KRGyitQQmj6f1xQJjV7IiKGDFrtK73Y26G6uOHH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.37","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3110357},"type":"module","engines":{"node":">=24 <25"},"gitHead":"ecf72d5a4b8f34139de3f5718900a41c6bf32dce","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.37_1786866890966_0.24236617751733736","host":"s3://npm-registry-packages-npm-production"}},"0.0.38":{"name":"@tiangong-ai/cli","version":"0.0.38","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.38","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"837620b4633bb23893ba54d4eacee9fc02ea0e5c","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.38.tgz","fileCount":197,"integrity":"sha512-Q+rnT+5kbV7sFwYfBI62H5EYQn2GsVllM6eNVwzr77mQvTtyzN1qw9Q3XOtoTUEAFWAaBBG/Ol3v193u3bWErg==","signatures":[{"sig":"MEQCIDC5Z9Jgxnztf7IjYkC0Ug5kP7kfZQb27IBKC9gRSqiJAiAGp9UXI19AzG+3YsDN3Cy3lqbugBbRgVWJG4jb4VAdjA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.38","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3118751},"type":"module","engines":{"node":">=24 <25"},"gitHead":"d14c542100d6e1efdd82798c2d92e68a5bc3bba2","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.38_1786885675312_0.6500675708557284","host":"s3://npm-registry-packages-npm-production"}},"0.0.39":{"name":"@tiangong-ai/cli","version":"0.0.39","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.39","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"9da970d4d32b212e4a4472a1f7e663cac5ab9222","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.39.tgz","fileCount":200,"integrity":"sha512-Ejkgzlr3qJK6nI7qHivqLoW8f/4Y9T9EUvtvMWRSV07qvwwsYpwi135l6YJVpgxvMpc7BbvOnxrcRiN2Adp25A==","signatures":[{"sig":"MEYCIQCd20RuhkrUmORzV2TUrqM/+EFiQ3Fr1T3s1eBLjCSq3gIhAORePqqWe55I8HB+J0UjUOdMi2NebUT2ovfG9kQwUk6u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.39","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3185808},"type":"module","engines":{"node":">=24 <25"},"gitHead":"223b9ea8900da100afca9668be6c6df1f60578e9","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.39_1786943474278_0.3024918776469574","host":"s3://npm-registry-packages-npm-production"}},"0.0.40":{"name":"@tiangong-ai/cli","version":"0.0.40","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.40","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"2b0b4955e7503e56cb06951d3daf648249663a48","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.40.tgz","fileCount":200,"integrity":"sha512-YZnjGg9azwgk5tuIG9Fb+W890oXxBG5V3ObDz9Iy//fThJBmjrnum0NWtH9YrQBLFgna8qVdQRQe8gJXUnpRJQ==","signatures":[{"sig":"MEYCIQC9i+Z1DpzZBXNndtfAmww9nTub0CIywunzG7hIfpUQ9AIhAO+t8lco8FubOGS6URsuqJtxJdGJ5YesvkSul+TdFYsJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.40","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3208933},"type":"module","engines":{"node":">=24 <25"},"gitHead":"03ab6d8bec762f1007c89a371b7589e176aeca95","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.40_1786948683447_0.20726886024164037","host":"s3://npm-registry-packages-npm-production"}},"0.0.41":{"name":"@tiangong-ai/cli","version":"0.0.41","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.41","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"d20e6796e8379ea7102c69d5aacae09c622d8126","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.41.tgz","fileCount":200,"integrity":"sha512-aEXn3kJnQBIo2KGdo0MVYQhN0OXqjIh0a7M6EHZnxyBhbGYOKGq3Q+FQQHsd+MQy3rbVmNvgyuWLzqjmoGfMNA==","signatures":[{"sig":"MEQCIEfLfHBqxOdxkL72OkiOnxkERU06D4MEGugFqsp4OuJ+AiAX5gxm41pooxMvtaxsS/GXSpvE5BXicfmlZkhi6ULlOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.41","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3232994},"type":"module","engines":{"node":">=24 <25"},"gitHead":"9205e1b06678ef79042bee89bd3bca3fa77af515","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.41_1787050292695_0.6158949725022214","host":"s3://npm-registry-packages-npm-production"}},"0.0.42":{"name":"@tiangong-ai/cli","version":"0.0.42","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.42","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"eeba665f276906701fb33ca14543d21849d27881","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.42.tgz","fileCount":200,"integrity":"sha512-DgwO7q2zu5LMfsjjhM02ZRROPSvVrDHiIYrFln71s5rTy3DHDDGrmvBhmFMt6Ml48HLnlyxQCIOZ4aKT1jpxkg==","signatures":[{"sig":"MEYCIQDV/D15MQCyPWQ/IBHuJCv4vyYrD5Xetxn7KayBuEAHrAIhAMLtTVbmljT7ryvE1Kw3JbFIDtYcMlKVtIMqmTC5yW+3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.42","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3232994},"type":"module","engines":{"node":">=24 <25"},"gitHead":"34a5c2a3af26fc56e9c9dc94fcbdabd91a6dd1d8","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.42_1787053980724_0.223717182148635","host":"s3://npm-registry-packages-npm-production"}},"0.0.43":{"name":"@tiangong-ai/cli","version":"0.0.43","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.43","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"4240503d4168dbd9098e70d4e6b1df61e9c4f777","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.43.tgz","fileCount":206,"integrity":"sha512-Qb8R0ZbhqWBqfDpJdNzHP3KGrwLbNEdWi2MjxU5xiOkbm8ER72qzbJSSb52F+UhODGkHTNihoxhhG9WJXnsB2Q==","signatures":[{"sig":"MEUCIGHQvcacxFB6J8dYdZNrhPMhhhVm2SzkijdZssRWDUZzAiEAxZnJz6GBtvbeQHjWpsZWoVU1T+LaKFYopg3s+JGhjko=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.43","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3435164},"type":"module","engines":{"node":">=24 <25"},"gitHead":"9bd8d89ffd0b189deb9195c0a1b87f497ac9ab0d","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.43_1787075427659_0.9111063210008254","host":"s3://npm-registry-packages-npm-production"}},"0.0.44":{"name":"@tiangong-ai/cli","version":"0.0.44","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.44","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"a2212d5a16105911f4b217c1a6a403a51763ccae","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.44.tgz","fileCount":209,"integrity":"sha512-gMJ1uEUsVZZiAOGXevgoMDBnKt3DJWhI5pYlaWYAAvS7+bE96HApCH+gLU3aHSe+hsmzCNAzk2z5tkINNd2IPg==","signatures":[{"sig":"MEQCIE2DEgGbK24V3f8k1KvMC9rksyurP3e0NOz7synuDlIqAiADPZur8SHGbrWIclAmkrNiN7V+kyHlWhbQHXoGS0m3QA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.44","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3558067},"type":"module","engines":{"node":">=24 <25"},"gitHead":"bf477fa6315ec5d366a4ef81f61acfecc609a03b","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.44_1787132493259_0.4005545401335291","host":"s3://npm-registry-packages-npm-production"}},"0.0.45":{"name":"@tiangong-ai/cli","version":"0.0.45","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.45","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"0f804d0b07a41177f93963e84a665e714e3f135c","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.45.tgz","fileCount":212,"integrity":"sha512-/XcuK+4JY0xwLCMUzS/k1v3ZF4eA1UDj2Stl0T0OEWaRbI+hetSCzzkKlVajYdPx7XjQxUD8EEIecx5QcyXqLw==","signatures":[{"sig":"MEUCIEFeJv6xM8qdsCD0MYYW+WJZu3srwfGFwAP5p5C51u7SAiEA1sepm54GA0EcIxEVnVLVfHims/TlS/tds9UNmWXfmQ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.45","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3612739},"type":"module","engines":{"node":">=24 <25"},"gitHead":"3890e420908be67b7b0745d964bb6ae075a8e4bf","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.45_1787150262866_0.8717976798873965","host":"s3://npm-registry-packages-npm-production"}},"0.0.46":{"name":"@tiangong-ai/cli","version":"0.0.46","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.46","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"af54040cf6657890b8756f06196a78584f5d16c9","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.46.tgz","fileCount":215,"integrity":"sha512-txIRewtvUYd0wy8J1Y8oDOTXr+8jz6VCeEDbMKxPdpnig/B4iUUxnQvdnOMKg6y3r5aXaSWQkX9RUv88njAIBg==","signatures":[{"sig":"MEUCIQD8CQfeCserlsXVQI5qS3HBFKoKkK1SJAXH+GDrN0pb6gIgMbQfO8l28rcTUGlMiVEpeDso3eN6z/P8Y109XzWld9I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.46","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3623093},"type":"module","engines":{"node":">=24 <25"},"gitHead":"daf1a9dd243163778e60b48803263a0fcf1ef678","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:platform":"npm run build && node --import tsx --test test/research-platform-contract.test.ts","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.46_1787164785916_0.1550763301073672","host":"s3://npm-registry-packages-npm-production"}},"0.0.47":{"name":"@tiangong-ai/cli","version":"0.0.47","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.47","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"d97e74f8ed7afe2ea606f3dd3641c69307bd6e0b","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.47.tgz","fileCount":215,"integrity":"sha512-TtAhx5YKYKc//NfDXX7A1eID7gwc2+W1PwcZw7iHFzVi3tyJowKxRWfsqSQI7N7jUyBfG7WyAlLa7ePT0WPEXQ==","signatures":[{"sig":"MEUCIQCoYFkkRVB5u41WW8UpsZB/6NwiVWxlqM+4l4pPyy/kcAIgeIp4qIs16wdnp78wQMPrZyUJgGARifxV4ykJ49wm2/I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.47","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3654007},"type":"module","engines":{"node":">=24 <25"},"gitHead":"a011bc2f65d6cf842ae121ce24e65c8375815db7","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:platform":"npm run build && node --import tsx --test test/research-platform-contract.test.ts","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","proper-lockfile":"^4.1.2","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.47_1787213190900_0.8982916688803471","host":"s3://npm-registry-packages-npm-production"}},"0.0.48":{"name":"@tiangong-ai/cli","version":"0.0.48","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.48","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"d99ac11aa6623cd58bf9317ab74a90675afe5363","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.48.tgz","fileCount":215,"integrity":"sha512-Tu8lxbkL3xpTaqPM0qEMPTtEIju54sBijCKtHzhlgC99tnUkc5b1qfXPYyv/NLkM8ZdbFGDrtRR7C7SggyImnQ==","signatures":[{"sig":"MEUCIQDkOPE9zSlcO9EPBuVs2EIqp8RP0z5AFd9UdacVtD0xkAIgd9jOvzViEIcxKvU7pKvbFoq+eczk49adck1YqIhHBFE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.48","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3664104},"type":"module","engines":{"node":">=24 <25"},"gitHead":"4b5339bf7b2760d7ffd51827b87a820dd8f57ebe","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:platform":"npm run build && node --import tsx --test test/research-platform-contract.test.ts","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","proper-lockfile":"^4.1.2","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.48_1787220910538_0.5160777859909249","host":"s3://npm-registry-packages-npm-production"}},"0.0.49":{"name":"@tiangong-ai/cli","version":"0.0.49","keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","_id":"@tiangong-ai/cli@0.0.49","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"bin":{"tiangong-ai":"bin/tiangong-ai.js"},"dist":{"shasum":"33895f3d6e4ebcc161fa38d100f0cb79ed84a0f5","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.49.tgz","fileCount":215,"integrity":"sha512-SB1e1woevlYwn2EmDyp+oYaQOEhJn9hUM155glVe9s7c7w8Obf+Ub/Gbbnoaz0rI4Ck33Y13Eyg3UE5CyE7viw==","signatures":[{"sig":"MEUCIQDwOKAWqw6OlQtWPCg1L7FGGEVnH9+UTQtrPuNwLnvEoAIgO6k/0M8evPJSZZd1hgRvLtm0Nw0r07GA/5r/dNrMEzs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.49","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":3671537},"type":"module","engines":{"node":">=24 <25"},"gitHead":"9345c2c5c68d644a38cc8bcd54164de7ce393f83","scripts":{"lint":"npm run lint:format && npm run lint:coverage-guards","test":"npm run build && node --import tsx --test test/*.test.ts","build":"tsc -p tsconfig.build.json","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\"","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test:clean":"sh ./scripts/test-clean-container.sh","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:platform":"npm run build && node --import tsx --test test/research-platform-contract.test.ts","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"repository":{"url":"git+https://github.com/tiangong-ai/cli.git","type":"git"},"_npmVersion":"11.12.1","description":"Tiangong AI command-line interface.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ajv":"8.20.0","yaml":"2.9.0","sharp":"^0.35.3","pdf-lib":"^1.17.1","proper-lockfile":"^4.1.2","@aws-sdk/client-s3":"^3.1056.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","tsx":"^4.23.11","prettier":"^3.8.1","typescript":"^5.9.3","@types/node":"^24.12.2","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.0.49_1787239979993_0.6652652277043061","host":"s3://npm-registry-packages-npm-production"}},"0.0.50":{"name":"@tiangong-ai/cli","version":"0.0.50","description":"Tiangong AI command-line interface.","repository":{"type":"git","url":"git+https://github.com/tiangong-ai/cli.git"},"homepage":"https://github.com/tiangong-ai/cli#readme","bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"type":"module","bin":{"tiangong-ai":"bin/tiangong-ai.js"},"publishConfig":{"access":"public"},"scripts":{"build":"tsc -p tsconfig.build.json","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","test":"npm run build && node --import tsx --test test/*.test.ts","test:platform":"npm run build && node --import tsx --test test/research-platform-contract.test.ts","test:coverage":"npm run build && node ./scripts/run-test-coverage.cjs","test:container":"node ./scripts/assert-clean-container.mjs && npm run lint && npm run test:coverage","test:clean":"sh ./scripts/test-clean-container.sh","test:clean:cold":"sh ./scripts/test-clean-container.sh --cold-build","audit:research-setup-pins":"npm run build && node ./scripts/audit-research-setup-pins.mjs","prepush:gate":"npm run test:clean && docpact validate-config --root . --strict && docpact lint --root . --worktree --mode enforce","lint":"npm run lint:format && npm run lint:coverage-guards","lint:format":"prettier --check \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","lint:coverage-guards":"node ./scripts/assert-no-coverage-ignore.cjs","format":"prettier --write \"{src,test,bin,scripts}/**/*.{ts,js,cjs,mjs}\" \"*.{md,json}\" \"docs/**/*.md\" \".docpact/**/*.yaml\" \".github/**/*.yml\"","clean":"node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { recursive: true, force: true }))\""},"engines":{"node":">=24 <25"},"keywords":["tiangong","ai","cli","kb","research"],"license":"MIT","devDependencies":{"@types/node":"^24.12.2","@types/proper-lockfile":"^4.1.4","c8":"^12.0.0","prettier":"^3.8.1","tsx":"^4.23.11","typescript":"^5.9.3"},"dependencies":{"@aws-sdk/client-s3":"^3.1056.0","ajv":"8.20.0","pdf-lib":"^1.17.1","proper-lockfile":"^4.1.2","sharp":"^0.35.3","yaml":"2.9.0"},"gitHead":"2438d7677764450094a829ab036a8b9f2d4a73ee","_id":"@tiangong-ai/cli@0.0.50","_nodeVersion":"24.19.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-DwQA2bfJllhAPuMdpxES5dhIts8q2WU7c9bbZZH1dVZ3rtl6BWPGP9fzRWhL/aO9u/6cp+wVJj7H//XeqGI4Rg==","shasum":"cecd8ac3e7ad3e9187c84fdd5b41c2ad504adcce","tarball":"https://registry.npmjs.org/@tiangong-ai/cli/-/cli-0.0.50.tgz","fileCount":218,"unpackedSize":3859554,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@tiangong-ai%2fcli@0.0.50","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDP6G7ZGTCRd71Jnc58yZJZEPvv8Upup/325/7ILOcPKwIgCfpcMRfEN+2uDRGlrtW6Q5jZL5U26EfCJbmVvXnE8+Y="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d3aabf1-639b-4161-a81f-688bde4f0654"}},"directories":{},"maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cli_0.0.50_1787288990314_0.3953978827137379"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-08T10:25:39.240Z","modified":"2026-08-21T05:09:50.895Z","0.0.1":"2026-05-08T10:25:39.439Z","0.0.3":"2026-05-08T10:42:00.072Z","0.0.4":"2026-05-10T14:22:19.716Z","0.0.6":"2026-05-10T15:03:19.512Z","0.0.7":"2026-05-12T10:58:19.135Z","0.0.8":"2026-05-13T06:00:12.906Z","0.0.9":"2026-05-13T06:21:29.135Z","0.0.10":"2026-05-13T10:36:06.873Z","0.0.11":"2026-05-15T05:26:48.347Z","0.0.12":"2026-05-16T13:04:58.873Z","0.0.13":"2026-05-19T05:12:03.726Z","0.0.14":"2026-05-27T07:08:10.566Z","0.0.15":"2026-05-27T07:09:37.346Z","0.0.16":"2026-05-29T08:09:08.102Z","0.0.17":"2026-06-01T11:18:31.499Z","0.0.18":"2026-07-15T11:02:54.712Z","0.0.19":"2026-07-22T07:31:33.572Z","0.0.20":"2026-08-04T15:37:52.539Z","0.0.21":"2026-08-07T02:43:53.048Z","0.0.22":"2026-08-07T03:33:14.389Z","0.0.23":"2026-08-07T16:05:38.453Z","0.0.24":"2026-08-08T06:21:52.065Z","0.0.25":"2026-08-08T09:52:10.326Z","0.0.26":"2026-08-08T11:44:00.021Z","0.0.27":"2026-08-08T17:09:37.338Z","0.0.28":"2026-08-09T09:11:19.948Z","0.0.29":"2026-08-09T10:16:32.208Z","0.0.30":"2026-08-09T11:28:06.918Z","0.0.31":"2026-08-09T13:05:50.595Z","0.0.32":"2026-08-10T07:26:03.857Z","0.0.33":"2026-08-11T12:06:56.588Z","0.0.34":"2026-08-11T18:04:26.727Z","0.0.35":"2026-08-12T20:29:39.700Z","0.0.36":"2026-08-15T02:40:24.562Z","0.0.37":"2026-08-16T07:54:51.181Z","0.0.38":"2026-08-16T13:07:55.516Z","0.0.39":"2026-08-17T05:11:14.460Z","0.0.40":"2026-08-17T06:38:03.635Z","0.0.41":"2026-08-18T10:51:32.870Z","0.0.42":"2026-08-18T11:53:01.019Z","0.0.43":"2026-08-18T17:50:27.847Z","0.0.44":"2026-08-19T09:41:33.423Z","0.0.45":"2026-08-19T14:37:43.066Z","0.0.46":"2026-08-19T18:39:46.140Z","0.0.47":"2026-08-20T08:06:31.092Z","0.0.48":"2026-08-20T10:15:10.723Z","0.0.49":"2026-08-20T15:33:00.201Z","0.0.50":"2026-08-21T05:09:50.480Z"},"bugs":{"url":"https://github.com/tiangong-ai/cli/issues"},"license":"MIT","homepage":"https://github.com/tiangong-ai/cli#readme","keywords":["tiangong","ai","cli","kb","research"],"repository":{"type":"git","url":"git+https://github.com/tiangong-ai/cli.git"},"description":"Tiangong AI command-line interface.","maintainers":[{"name":"linanenv","email":"linanenv@gmail.com"}],"readme":"---\ndocType: repo-readme\nscope: repo\nstatus: current\nauthoritative: true\nowner: cli\nlanguage: en\nwhenToUse: \"When installing, running, or validating the Tiangong AI CLI.\"\nwhenToUpdate: \"When package name, Node baseline, command examples, environment variables, or validation commands change.\"\ncheckPaths:\n  - README.md\n  - package.json\n  - bin/**\n  - src/**\nlastReviewedAt: 2026-08-20\nlastReviewedCommit: 4b5339bf7b2760d7ffd51827b87a820dd8f57ebe\n---\n\n# Tiangong AI CLI\n\nPackage: `@tiangong-ai/cli` Executable: `tiangong-ai` Node: `>=24`\n\n## Run From This Repository\n\n```bash\nnpm install\nnpm run build\nnode ./bin/tiangong-ai.js --help\nnode ./bin/tiangong-ai.js --version\n```\n\nUse Node `24.x`; this package declares `>=24 <25` and includes `.nvmrc` for\ncompatible version managers.\n\nAfter installation, print the package version with either top-level flag:\n\n```bash\ntiangong-ai --version\ntiangong-ai -v\n```\n\n## KB Ingest\n\nRequired environment:\n\n```bash\nTIANGONG_AI_API_KEY=\nTIANGONG_KB_DEFAULT_COLLECTION_NAME=\n```\n\nThe KB API server defaults to `https://thuenv.tiangong.world:7300` with path\nprefix `/api/v1/kb`.\n\nRun a resumable sliding-window ingest for one file or a folder:\n\n```bash\ntiangong-ai kb ingest bulk /path/to/document.pdf \\\n  --collection-path /course/thu_humanities \\\n  --poll-interval 30 \\\n  --health-poll-interval 60\n```\n\nRun a larger folder ingest:\n\n```bash\ntiangong-ai kb ingest bulk /path/to/folder \\\n  --collection-path /course/thu_humanities \\\n  --window-size 100 \\\n  --top-up-max 50 \\\n  --upload-concurrency 4 \\\n  --poll-interval 30 \\\n  --health-poll-interval 60\n```\n\nBulk scan a large folder and emit a structural JSON summary:\n\n```bash\ntiangong-ai kb ingest bulk scan /path/to/folder --json\n```\n\nDry-run a layered metadata map against a folder and collection schema:\n\n```bash\ntiangong-ai kb ingest bulk dry-run /path/to/folder \\\n  --collection-path /course/thu_humanities \\\n  --metadata-map metadata-map.yaml \\\n  --json\n```\n\nThe same dry-run is also available through the skill-facing alias:\n\n```bash\ntiangong-ai kb ingest metadata dry-run /path/to/folder \\\n  --collection-path /course/thu_humanities \\\n  --metadata-map metadata-map.yaml \\\n  --json\n```\n\nRun a resumable sliding-window bulk ingest with metadata:\n\n```bash\ntiangong-ai kb ingest bulk /path/to/folder \\\n  --collection-path /course/thu_humanities \\\n  --metadata-map metadata-map.yaml \\\n  --window-size 100 \\\n  --top-up-max 50 \\\n  --upload-concurrency 4 \\\n  --poll-interval 30 \\\n  --health-poll-interval 60\n```\n\n`tiangong-ai kb ingest bulk run /path/to/folder` is accepted as an explicit\nalias for wrappers that want a verb before the folder path.\n\nBulk ingest uses SQLite as its checkpoint source. By default, job files are\nstored under the OS app-data directory:\n\n- macOS: `~/Library/Application Support/tiangong-ai/kb-ingest/jobs/<job-id>.sqlite`\n- Linux: `~/.local/share/tiangong-ai/kb-ingest/jobs/<job-id>.sqlite`\n- Windows: `%APPDATA%/tiangong-ai/kb-ingest/jobs/<job-id>.sqlite`\n\nUse `--state /path/to/job.sqlite` to override the checkpoint path. Bulk ingest\ndoes not impose a client-side polling limit by default, so it can keep topping\nup the sliding upload window until all rows complete. Use `--max-polls <n>` only\nwhen a wrapper or operator needs a bounded run. Status checks and upload-window\ntop-up run every 30 seconds by default. Pipeline health is cached independently\nand refreshed every 60 seconds by default, so health backpressure does not slow\nstatus progress. Override the intervals with `--poll-interval` and\n`--health-poll-interval`, or with `TIANGONG_KB_BULK_POLL_INTERVAL` and\n`TIANGONG_KB_PIPELINE_HEALTH_POLL_INTERVAL`.\n\nBulk ingest scans and fingerprints files first, then lazily creates derived\nfiles only when a row enters the active upload window. `.docx` files larger than\n10MiB are uploaded through 300dpi-normalized ingest copies; smaller `.docx`\nfiles upload directly unless they are empty. Oversized PDFs are split into the\nfewest uploadable PDF parts when they enter the window, and the generated part\nrows are written back to SQLite so resume can reuse them. Derived files stay\nunder `.tiangong-kb-ingest-derived` by default, and that directory is excluded\nfrom future bulk scans. Upload metadata remains the user/business metadata\nproduced by the metadata map.\n\nManage bulk jobs:\n\n```bash\ntiangong-ai kb ingest jobs\ntiangong-ai kb ingest status <job-id>\ntiangong-ai kb ingest resume <job-id>\ntiangong-ai kb ingest export <job-id> --format csv\n```\n\nList uploadable collections:\n\n```bash\ntiangong-ai kb collections list --capability upload\n```\n\nResolve a collection and include the effective metadata schema:\n\n```bash\ntiangong-ai kb collections schema --collection-path /course/thu_humanities --json\n```\n\nCheck document status:\n\n```bash\ntiangong-ai kb ingest status <document-id>\n```\n\nRead course fulltext from the processed S3 bucket:\n\n```bash\ntiangong-ai kb course fulltext \\\n  --document-id 000125ed-c4d9-4fe3-9380-000000000000 \\\n  --tags thu_humanities\n```\n\nThe command lists exactly one `.txt` object under\n`s3://tiangong/processed_docs/course_pickle/<tags>_pickle/<document-id>/` and\nprints its content. Override the location with `--bucket`, `--prefix`, or the\n`TIANGONG_COURSE_FULLTEXT_S3_BUCKET` and\n`TIANGONG_COURSE_FULLTEXT_S3_PREFIX` environment variables. AWS credentials and\nregion are resolved by the AWS SDK, including `AWS_ACCESS_KEY_ID`,\n`AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`, `AWS_PROFILE`, `AWS_REGION`, and\n`AWS_DEFAULT_REGION`.\n\n## Research Workspaces\n\nCreate a bounded smoke-test workspace and register a question:\n\n```bash\ntiangong-ai research workspace init /absolute/path/to/workspace\ntiangong-ai research project init gpu-resource-impact \\\n  --workspace /absolute/path/to/workspace \\\n  --question \"How do advanced GPU process nodes change environmental resource burdens?\"\n```\n\n`smoke-test` is the default and is intended for deterministic fixtures and\nlow-cost canaries. Formal work must use `--mode production-research`, explicit\nproducer/reviewer model IDs and pricing in `config.json`, a requirements JSON\nfile, and budget confirmation when `maxCostUsd` exceeds\n`confirmationCostUsd`:\n\n```bash\ntiangong-ai research setup catalog \\\n  --workspace /absolute/path/to/workspace --json\n# Interactive and user-initiated: select external Skills, configure credentials\n# with hidden input/env/stdin, review licenses, choose scope, and run checks.\ntiangong-ai research setup \\\n  --workspace /absolute/path/to/workspace\ntiangong-ai research setup status \\\n  --workspace /absolute/path/to/workspace --json\ntiangong-ai research project preflight \\\n  --workspace /absolute/path/to/workspace \\\n  --question \"How do advanced GPU process nodes change environmental resource burdens?\" \\\n  --requirements /absolute/path/to/evidence-requirements.json --json\ntiangong-ai research project init gpu-resource-impact \\\n  --workspace /absolute/path/to/workspace \\\n  --question \"How do advanced GPU process nodes change environmental resource burdens?\" \\\n  --requirements /absolute/path/to/evidence-requirements.json \\\n  --confirm-budget --json\n```\n\nThe guided setup creates an immutable, hash-bound plan before mutation. No Skill\nis bundled or installed without an explicit Wizard confirmation or plan\nselection. The Wizard recommends a project-local `tiangong-auto-research`\norchestrator so ordinary research requests can enter the workflow from any\nuser-selected workspace directory. It pins the installer integrity, source\ncommits, Skill tree hashes, exact destinations, license acceptance, safe\ncredential bindings, settings, and checks. For every selected provider, the\nWizard offers hidden TTY input (recommended), a named owner environment\nvariable, preloaded bounded stdin/password-manager input, or an explicit skip.\nSecret values never enter the plan or terminal output. Required credential\npreflight and owner-only storage run before downloads. Project-local copy is\nthe default; global writes, network downloads, live provider checks, synthetic\ndocument uploads, and paid agent smokes each require their applicable\nconfirmation.\n\n### Declarative setup\n\nFor repeatable provisioning without a TTY, generate a safe workspace-local\ntemplate:\n\n```bash\ntiangong-ai research setup init \\\n  --workspace /absolute/path/to/workspace --json\n```\n\nThis no-overwrite command creates:\n\n- `.tiangong-research/setup.yaml`: every current catalog Skill, credential, and\n  setting with explicit enabled/disabled state, plus license acceptances, agent\n  routes, verification choices, and confirmations;\n- `.tiangong-research/setup.env.example`: every catalog credential variable\n  name with an empty value and matching requirement/enabled comments; copy it\n  to `setup.env` only when a file-based secret source is needed;\n- `.tiangong-research/.gitignore`: excludes `setup.env`.\n\nReview the catalog, edit `setup.yaml`, and never put a key or token in it. For a\nfile-based credential source:\n\n```bash\ncp .tiangong-research/setup.env.example .tiangong-research/setup.env\nchmod 600 .tiangong-research/setup.env\n# Edit setup.env locally. Keep disabled optional entries empty unless their\n# corresponding credentials.<id>.enabled flag is explicitly changed to true.\n```\n\nThen run the ordinary command:\n\n```bash\ntiangong-ai research setup \\\n  --workspace /absolute/path/to/workspace --json\n```\n\nBare setup checks only the fixed workspace-local `setup.yaml`; it never scans a\nparent directory. When the file exists, setup is fully non-interactive and does\nnot fall back to the Wizard after a parse, schema, permission, credential, or\nreadiness failure. Use absolute `--config` and `--env-file` paths only for an\nexplicit alternative. Use `research setup wizard` to explicitly choose the\ninteractive path even when a declaration exists.\n\nThe closed YAML declaration is `schemaVersion: 2`; the removed v1 shape is not\nmigrated or accepted. It requires `selection.skills`, `credentials`, and\n`settings` to contain exactly all current catalog entries. Skill entries expose\n`enabled` and the catalog license ID. Credential and setting entries expose the\ncatalog- and current-selection-derived `requirement`, catalog `appliesTo`, and\nan explicit `enabled` choice;\noptional omission is not a configuration state. Missing, extra, or drifted\ncatalog metadata, incomplete Brave profile combinations, a disabled required\nentry, or an enabled setting without a value fails before network access.\n\n`setup.env` must be a regular non-symlink file, no larger than 64 KiB,\nowner-only on POSIX, and may contain only credential variable names declared by\nthe YAML. Empty values keep disabled options visible without selecting them. A\nnon-empty value for a disabled credential is rejected; enable it in YAML or\nremove the value. The file is read as literal data without shell expansion. A\ndiffering value in the ambient environment and `setup.env` is also an error;\nsetup never chooses between them silently. Enabled secret values are imported\ninto the existing owner-only logical stores before downloads and never enter\nthe YAML, immutable plan, declaration binding, output, report, or journal.\n\nThe semantic YAML hash is bound to the immutable plan. Re-running unchanged\nconfiguration reuses that exact plan and reruns all verification. A changed\ndeclaration stops until the owner reviews it and sets\n`replaceExistingPlan: true`; the prior plan and declaration binding are archived\nbefore replacement.\n\nDeclarative setup requires live provider checks and the independent reviewer\nCLI agent smoke, including explicit cost authorization. Interactive setup\nrecommends both by default while retaining explicit quota/cost consent. Apply,\nstatus, doctor, and the Wizard return success only when\n`overallReadiness=READY`; skipped checks, warnings, missing dependencies, and\noptional selected-component failures remain visible as a non-zero incomplete\nsetup instead of a false success. The native producer is still not launched as\na child process.\n\nBefore project initialization, a setup-only audit can be exported without\nrerunning Doctor, contacting a provider, or launching a model. The exporter\ncreates a new portable directory atomically and verifies it before returning.\nThe independent verifier accepts the directory from any absolute location:\n\n```bash\ntiangong-ai research setup audit export \\\n  --workspace /absolute/path/to/workspace \\\n  --output /absolute/path/to/new-setup-audit --json\ntiangong-ai research setup audit verify \\\n  --bundle /absolute/path/to/new-setup-audit \\\n  --expected-manifest-sha256 <digest-from-trusted-export-record> --json\n```\n\nThe closed manifest binds portable projections of the immutable setup plan and\nstate plus every available setup report, runtime/capability lock, Doctor\nattestation, and declaration binding. It rejects missing, extra, symlinked,\nreordered, hash-drifted, or semantically disconnected entries. Credential\nvalues and environment-variable names, owner secret stores, source caches,\ninstalled Skill trees, browser/auth state, raw provider output, unrelated\nworkspace files, and host paths are never included. This setup proof is\nseparate from `research project audit`: readiness may honestly be `BLOCKED` or\n`PARTIALLY_READY` while bundle integrity still verifies.\nLocal capability locators, static-header values, credential prefixes, and\nfree-form Doctor runtime/telemetry strings are represented only by SHA-256\nbindings in their closed portable projections. Verification parses and checks\nthe exact bytes captured with each file hash, then rejects a tree or file that\nchanges before completion.\nThe manifest digest returned by export is an external trust anchor: retain it\nin a separate run record, CI record, or other trusted channel. Verification\nrequires that explicit digest and never trusts a digest read only from the\nmutable bundle itself.\n\nIf the full orchestrator was selected, accepted apply creates a separate\nproject-local `tiangong-auto-research-recovery` Skill after credentials are\nstored and before source checkout. This CLI-generated, plan-bound shim can only\ninspect context/status and execute the exact-version retry returned by setup; it\ncannot perform research, call standalone evidence, or access credentials. A\ncheckout or install failure therefore remains discoverable without falling back\nto a global Skill. After the full external orchestrator matches its reviewed\ntree hash, setup verifies the shim byte-for-byte and removes only that generated\ndirectory. Modified, symlinked, or ambiguous recovery bytes block cleanup.\n\nProduction admission requires at least one locked external capability with\n`brokered-network` and `discoveryScopes: [\"public-internet\"]`; an input plan or\nlocal files alone cannot represent internet coverage. The machine-readable\nsetup catalog contains only separately sourced external Skills and reports each\norchestrator, evidence, preprocessing, acquisition, and post-closure\nrecommendation; exact\nsource commit and tree hash; license and credential requirements; dependencies;\nand installed-byte status. Installation is never performed by a research\npackage.\n\nWhole-tree hashes are platform-stable: logical paths are NFC-normalized and\nordered by UTF-8 bytes rather than the host locale, and newly created detached\nsource checkouts disable Git line-ending conversion before checkout. A source\nhash mismatch remains fail-closed before `npx skills add`; its structured error\nreports only the Skill/source IDs, hash algorithm, and expected/observed hashes.\nIt never treats file existence as installation success or silently rewrites an\nimmutable plan. Plans created by an earlier CLI release are rejected at the\nexecution boundary; create and review a new plan with the active release. The\norchestrator additionally declares a `workspace-lock` runtime contract: every\nworkspace command goes through its bundled resolver, which accepts only the\nregular non-symlink `runtime-lock.json` exact stable CLI version. Setup and\nrelease CI reject a missing resolver or any stale exact CLI version in the\norchestrator's `SKILL.md` or `references/*.md`.\n\n### Top-journal Policy, scientific design, and publication gates\n\nA `top-journal` project starts with a human-reviewed Markdown Policy, not with\nmodel execution. After project-scoped setup reaches `READY`, use the guided\nWizard:\n\n```bash\ntiangong-ai research policy wizard top-journal-paper \\\n  --workspace /absolute/path/to/workspace\ntiangong-ai research policy status top-journal-paper \\\n  --workspace /absolute/path/to/workspace --json\n```\n\nThe Wizard resolves only the verified project-installed\n`tiangong-auto-research` tree. Before catalog use, the CLI parses every Markdown\ntemplate in every category of that exact locked tree; setup doctor performs the\nsame compatibility check before any provider live check or reviewer smoke. The\nbaseline must require the scientific-design contract, ordered early reviews,\nand real-record construct canary, and those safeguards must remain true in the\nresolved Policy. The Wizard then copies a baseline plus one article type, field,\njournal class, project brief, and four reviewer rubrics. Generic defaults are\nclearly reported and require a separate acknowledgement. An exact-journal\nPolicy additionally requires a current official HTTPS guideline URL, retrieval\ndate, and substantive human content for all journal-specific sections. Approval\nbinds the manifest and every document by SHA-256; edits, manifest tampering, or\nexpiry block preflight and all later stages until the Policy is reviewed and\napproved again.\n\nBefore search, the current native Codex, Claude, WorkBuddy, or CodeBuddy host must author a\nproject-specific scientific design. The CLI owns the closed schema and rejects\ndesigns that confuse model-to-model disagreement with observed truth, inflate\nindependent sample size through resampling, omit quantity/threshold semantics,\nleave blocking gaps unresolved, or cannot fit the complete review lifecycle.\nThe CLI validates, freezes, hashes, and routes this design; it does not author\nthe design or launch a nested producer.\n\nHash binding alone does not make a model executable. Each model declares raw\nimplementation bytes, a retrievable safe locator and entrypoint, exact\nenvironment-lock bytes, implementation/environment status, and a freeze gate.\nBefore authoring a design with frozen model objects, register each external\nregular non-symlink file through the public content-addressed intake:\n\n```bash\ntiangong-ai research scientific object register \\\n  --kind model-implementation \\\n  --path /absolute/path/to/model.py \\\n  --media-type text/x-python \\\n  --workspace /absolute/path/to/workspace --json\ntiangong-ai research scientific object register \\\n  --kind environment-lock \\\n  --path /absolute/path/to/requirements.lock \\\n  --media-type text/plain \\\n  --workspace /absolute/path/to/workspace --json\n```\n\nUse the returned `sha256` and `objectLocator` verbatim in the design. Registration\nis workspace-scoped because it must happen before project admission. It hashes\nraw bytes, atomically stores an immutable `lineage/objects/<sha256>/blob`, and\nrecords only deterministic non-path metadata. It never accepts a source inside\n`.tiangong-research`, a symlink as the selected file, an unsupported/binary\nmedia type, or invalid UTF-8. Canonical parent-directory aliases are resolved\nbefore containment checks, including macOS `/var` aliases and Windows\ncross-volume paths. Re-registration is idempotent, and `research scientific object inspect`\nrevalidates the record and blob before returning it. Do not hand-copy files into\nthe control directory.\n\nSource-derived uncertainty states also declare whether their values are frozen\nor pending, and every joint state maps exact parameter-state IDs. Pending model,\nenvironment, or uncertainty objects are allowed only when a planned Policy rule\nowns the same due gate. Pending implementations use `null` for implementation\nSHA-256, locator, and entrypoint; pending environments use `null` for lock\nSHA-256 and locator. They are exposed in every earlier review packet as\n`futureGateObligations` and become blocking mechanical errors at that gate.\nFreezing them requires a new authoritative generation; it never upgrades the\nold object in place.\n\nUse the same Policy project ID and exact design when preflighting and admitting\nthe research project:\n\n```bash\ntiangong-ai research schema show scientific-design --json\ntiangong-ai research project preflight \\\n  --question \"A specific, testable research question\" \\\n  --goal top-journal --policy-project top-journal-paper \\\n  --requirements /absolute/path/to/evidence-requirements.json \\\n  --design /absolute/path/to/scientific-design.json \\\n  --workspace /absolute/path/to/workspace --json\ntiangong-ai research project init top-journal-paper \\\n  --question \"A specific, testable research question\" \\\n  --goal top-journal \\\n  --requirements /absolute/path/to/evidence-requirements.json \\\n  --design /absolute/path/to/scientific-design.json \\\n  --design-producer-agent codex \\\n  --design-producer-session OPAQUE_NATIVE_SESSION \\\n  --confirm-budget \\\n  --workspace /absolute/path/to/workspace --json\n```\n\nThe base evidence lifecycle remains producer-authored in the current interactive\nCodex or Claude Code host, but its frozen control sequence is now\n`discover -> acquire -> typed decomposition/atoms -> content freeze -> inference freeze -> analyze -> Claim-Evidence Graph -> synthesize -> review -> close`.\nA fresh independent reviewer\nmust first pass three hash-bound scientific gates: `research-design` before\ndiscovery, a real-record and outcome-blind `evidence-construct` canary after\nacquisition and typed-content freeze, and `pilot-methods` after that canary and\nbefore analysis. Acquisition always freezes its exact result, including honest\ngaps; a stopped acquisition/content gate prevents inference without discarding\nthe acquired evidence. Evidence-construct coverage may cite only frozen\nsnapshot source IDs and exact content atoms. Its JSON canary artifacts are promoted and\ncontent-addressed through `--canary-artifacts`; reviewer prose cannot override\nan invented ID, unbound digest, or other mechanical failure.\n\n```bash\ntiangong-ai research schema show scientific-assessment-research-design --json\ntiangong-ai research project scientific review prepare top-journal-paper \\\n  --role research-design \\\n  --assessment /absolute/path/to/research-design-assessment.json \\\n  --reviewer-agent claude \\\n  --reviewer-session FRESH_OPAQUE_REVIEW_SESSION \\\n  --workspace /absolute/path/to/workspace --json\ntiangong-ai research schema show scientific-review-research-design --json\ntiangong-ai research project scientific review submit top-journal-paper \\\n  --role research-design --review /absolute/path/to/review.json \\\n  --workspace /absolute/path/to/workspace --json\n```\n\nRepeat the same prepare/submit route for `evidence-construct`, adding an\nowner-reviewed JSON array of absolute canonical canary paths with\n`--canary-artifacts /absolute/path/to/canary-paths.json`, and then for\n`pilot-methods` at its stage boundary. A top-journal fork or addendum is a\nnew authoritative generation and therefore requires a target-specific approved\nPolicy, design, and fresh native producer session; it cannot inherit scientific\napproval from a superseded generation.\n\nReview packet `stageInputs` identify promoted portable objects by purpose,\nowner, safe source locator, media type, object kind, registration-record hash,\nand SHA-256 over raw file bytes. Registered model code and environment locks are\ncopied as exact project-local `blob` bytes; they are never parsed as JSON merely\nbecause the packet is JSON. `packetSha256` is the\nlogical packet identity that excludes its own identity field; the portable\naudit manifest separately records the raw stored packet-file digest. This keeps\npacket identity and byte-level transfer verification explicit rather than\noverloading one hash with both meanings.\n\nAfter base closure, the current native host writes a final Markdown/plain-text\nmanuscript, schema-valid publication assessment, and an explicit submission\nmanifest. The manuscript must contain Abstract, Introduction, Methods, Results,\nDiscussion, Data availability, Code availability, and References. The\nsubmission manifest must bind distinct absolute files for cover letter, title\npage, reporting checklist, data availability, code availability, and source\ndata; figure/table index, extended data, and supplementary methods are optional.\n`research publication freeze` then content-addresses the Policy, scientific\ndesign and early reviews, acquisition/content/inference snapshots, reproduced\nanalysis, Claim-Evidence Graph, base outputs, manuscript, assessment,\nsupplements, role-complete submission files, and reproducibility manifest.\nExactly four fresh independent sessions review that frozen generation:\nevidence, methods/reproducibility, domain/novelty, and journal-editor. A revised\nmanuscript invalidates prior reviews. Every reviewer must use the configured\nagent family that differs from the native producer; changing only the session\nID is not independent. Reviewer-session reuse is rejected from the append-only\njournal even if mutable cache state is removed. The raw opaque\nproducer/reviewer session identifiers are accepted only at the command boundary;\ngeneration, packet, review, journal, and closure objects persist only their\nSHA-256 bindings.\n\n```bash\ntiangong-ai research schema show publication-assessment --json\ntiangong-ai research publication freeze top-journal-paper \\\n  --manuscript /absolute/path/to/final-manuscript.md \\\n  --assessment /absolute/path/to/publication-assessment.json \\\n  --submission /absolute/path/to/submission-package.json \\\n  --producer-agent codex --producer-session OPAQUE_NATIVE_SESSION \\\n  --workspace /absolute/path/to/workspace --json\ntiangong-ai research publication status top-journal-paper \\\n  --workspace /absolute/path/to/workspace --json\n```\n\nThe CLI returns a mechanically bounded ceiling:\n`top-journal-candidate`, `top-journal-class-ready`, or\n`target-journal-submission-ready`. Evidence and review failures can only lower\nit. None of these states predicts or guarantees editorial acceptance.\n\nBefore external handoff or archival, export and independently verify a portable\naudit directory. Export first revalidates the semantic acquisition, content,\ninference, graph, and publication objects; a copied but stale/tampered chain is\nrejected. Its manifest exposes their intrinsic IDs and hashes under\n`researchChain`. It contains the selected project, portable copies of admitted\ninputs, formal evidence and artifact bytes, Policy/design/review objects,\noutputs, environment fingerprints, and safe hash-preserving journal proof\nderivatives. Credentials, setup\nsources, browser profiles, native active state, capsules, unrelated projects,\nand host-specific absolute paths are excluded.\n\n```bash\ntiangong-ai research project audit export top-journal-paper \\\n  --output /absolute/path/to/new-audit-directory \\\n  --workspace /absolute/path/to/workspace --json\ntiangong-ai research project audit verify \\\n  --bundle /absolute/path/to/new-audit-directory --json\n```\n\n`research setup status --json` reports credential persistence separately from\nreadiness. It also reports the effective exact-npx CLI package/version/root,\nthe selected project orchestrator, any temporary recovery shim, ignored global\nsame-name Skills, legacy wrappers that still contain an unmanaged PATH CLI\nfallback, and the real failed source/immutable ref/cache state when checkout is\nretryable. A direct `research search` inside a managed workspace stops before\nnetwork access and returns the same broker-vs-standalone and setup provenance;\nit never converts a stored broker credential into an ambient credential.\n\nThe default `internet-research` profile selects Brave Web Search and News\nSearch. `internet-research-with-context` additionally selects the\nsubscription-dependent LLM Context endpoint, while\n`internet-research-with-media` also selects image and video discovery. A\nprovider-plan or authentication failure blocks the selected profile instead of\nsilently dropping a Skill. `credential set` accepts exactly one of `--prompt`,\n`--from-stdin`, or `--from-env <name>` and stores the value under the declared\nlogical ID; the value is never returned or journaled. For example:\n\n```bash\ntiangong-ai research setup credential set \\\n  --id brave.search.api-key --prompt \\\n  --workspace /absolute/path/to/workspace --json\n\nop read 'op://Research/Brave/api-key' | \\\n  tiangong-ai research setup credential set \\\n    --id brave.search.api-key --from-stdin \\\n    --workspace /absolute/path/to/workspace --json\n```\n\nThe pinned Brave checkout is verified at `skills/<skill-name>` before install.\nAn explicitly reviewed replacement plan reconciles the complete setup-managed\ncapability set and both owner-only credential stores: deselected Brave, SCI,\nreport, or patent declarations and lock records are removed, custom capability\ndeclarations are preserved, and installed Skill directories are never deleted\nimplicitly.\nProvider-dependent context/media choices never fall back silently; select the\nbaseline in a replacement plan when that is the intended operator decision.\n\nThe interactive Wizard uses restrained semantic colors and section markers\nonly when its terminal output is a TTY. Hidden credential input is not echoed.\nSet `NO_COLOR` or `TERM=dumb` for plain text; `--json` also disables Wizard\nstyling so structured output never contains ANSI escape sequences. Password\nmanagers may preload one line per logical ID with\n`--credential-stdin <id[,id...]>`; the remaining Wizard questions use the\ncontrolling terminal.\n\nOptional setup entries have explicit roles. Tiangong SCI, report, and patent\nsearch are distinct owner-whitelisted POST evidence capabilities with separate\nlogical credentials and discovery scopes; one cannot substitute for another.\nDocument decomposition is an input preprocessor; academic paper download is an\nacquisition adapter; document and\npresentation Skills are post-closure authoring only. Run selected preprocessors\nand acquisition adapters with `research setup companion run`, then admit their\nexact hash-bound output separately. Automatic paper OA exhaustion returns an\nexplicit browser handoff and never launches or chooses a browser silently.\nThe paper companion and its setup-doctor preflight both enter the verified\nSkill through `scripts/runtime.py`; the CLI never bypasses that lock by invoking\n`fetch.py` or importing `pypdf` from ambient Python. A missing runtime remains\nan actionable, non-installing failure until the owner explicitly runs the\nSkill's hash-locked bootstrap. Selected DOCX, PDF, PPTX, and XLSX authoring\nSkills bind one resolved Python and Node environment, check their complete\nPython/Node package and external-command matrices, and then run an exact-file\nfunctional canary through the installed pinned Skill helpers. The canaries\ncreate, validate, extract or recalculate, and render synthetic sentinel\nartifacts, including the PDF image helpers and both PPTX/XLSX MarkItDown paths,\nwithout scanning a directory for a newest file. A failed prerequisite\nor canary makes only that authoring component `BLOCKED`; research-core readiness\nremains independent. Setup reports the minimum owner action and never runs pip,\nnpm, Homebrew, apt, or another dependency installer.\nFor PPT creation, setup recommends `hugohe3.ppt-master` first;\n`anthropic.pptx` remains a compatible situational option, and both may be\nselected in the same explicit plan.\n\nEvery leaf command accepts `--help` before workspace resolution, so operators\ncan inspect `capability doctor`, `project preflight`, `project init`, and `run`\nsyntax safely from an empty or unrelated directory.\n\nThe requirements object declares `dimensions`, `sourceTypes`, optional\n`requiredCapabilityIds`, `requiredCompanionIds`, and\n`requiredDiscoveryScopes`, `minSources`,\n`minFullTextSources`, `minDatedSources`, and optional inclusive\n`publicationDateFrom` / `publicationDateTo` boundaries (`YYYY-MM-DD` or\n`null`). Explicit capability/scope requirements are exact: wildcard web or SCI\ncoverage cannot satisfy a required report database. Preflight returns both\nstable string gaps and structured `coverageGaps` with the affected dimensions,\nsource types, alternative-coverage decision, and minimum owner action. After\ndiscovery, a mechanical coverage gate verifies the declared\nsource, full-text, publication-date, and dimension summary before analysis.\nFor large local sources, pass an immutable `--input-plan` to both preflight and\nproject initialization. Each plan entry may expose either a separate\n`contextPath` or non-overlapping, one-based `contextRanges`; the producer sees\nonly that bounded context, while independent review receives the hash-verified\nfull source. Symlinks, duplicate content, changed hashes, and context above\n`maxInputContextTokens` are rejected.\n\nThe workspace stores its current protocol state under `.tiangong-research/`.\nEach project follows the evidence-first sequence: broad discovery, strict\nadmission, acquisition audit, immutable evidence freeze, analysis, synthesis,\nindependent review, and mechanical closure. Discover, acquire, analyze, and\nsynthesize run in the current interactive Codex, Claude Code, WorkBuddy, or\nCodeBuddy session. The CLI never launches a nested producer process. Independent review\nruns through the other configured agent family's CLI, and execution is blocked\nwhen the two roles use the same family.\n\nEvery workspace mutation is serialized by an owner-recorded directory lease\nwith a heartbeat. A later command immediately reclaims a lease whose same-host\nowner process is definitely dead; an unverifiable cross-host lease is reclaimed\nonly after its heartbeat expires. The CLI also recognizes and safely recovers\nthe single-file lock left by a killed earlier release. Recovery is appended to\nthe workspace journal using only the prior operation, time, reason, and a\none-way lock identifier—never a PID, hostname, or host path. A live or\nunverifiable owner returns `RESEARCH_WORKSPACE_LOCKED` with a minimum action and\nmust not be bypassed by manually deleting lock state. Idempotent commands such\nas an already-recorded download bind may then be replayed normally after safe\nrecovery.\n\nIndependent reviewer execution always requires `/usr/bin/sandbox-exec` on macOS\nor Bubblewrap (`bwrap`) on Linux. `reviewerExecution.transport=native-direct`\ncreates that capsule in the current process. `sandbox-bridge` sends one\nhash-bound request to an owner-started, exact-version sidecar outside an IDE\nsandbox; the sidecar creates the same capsule and returns an Ed25519-signed\nattestation bound to workspace/config/runtime/capsule/request/result/model and\npolicy hashes. The two transports are explicit and never fall back to each\nother. Windows can inspect and configure workspaces but\ndoes not launch reviewer packages; smoke-test setup reports a non-blocking\nwarning there, while production readiness fails closed. The current native producer remains governed\nby its host application's own permissions; the CLI supplies a hash-bound packet\nand deterministic broker commands, not a second nested sandbox or agent.\n\nAdd immutable local evidence, verify the workspace, and execute ready work:\n\n```bash\ntiangong-ai research project input add gpu-resource-impact \\\n  --workspace /absolute/path/to/workspace \\\n  --path /absolute/path/to/inventory.csv \\\n  --role primary\ntiangong-ai research workspace doctor --workspace /absolute/path/to/workspace\ntiangong-ai research workspace doctor --workspace /absolute/path/to/workspace \\\n  --agent-smoke --capability-smoke\ntiangong-ai research run --workspace /absolute/path/to/workspace \\\n  --project gpu-resource-impact --progress-jsonl\n# When stopReason is native-stage-required, perform the returned stage here:\ntiangong-ai research project stage prepare gpu-resource-impact \\\n  --stage discover --host-agent workbuddy \\\n  --workspace /absolute/path/to/workspace --json\ntiangong-ai research project stage submit gpu-resource-impact \\\n  --session SESSION_ID --output /absolute/path/to/discover.json \\\n  --confirm-model EXPECTED_MODEL \\\n  --workspace /absolute/path/to/workspace --json\ntiangong-ai research status --workspace /absolute/path/to/workspace --json\n```\n\nFor WorkBuddy/CodeBuddy, keep Default Permission and start the sidecar from a\nseparate native terminal with a private non-symlink state directory outside the\nworkspace:\n\n```bash\ntiangong-ai research reviewer serve \\\n  --workspace /absolute/path/to/workspace \\\n  --state-dir /absolute/private/reviewer-sidecar --json\n\n# From the sandboxed IDE:\ntiangong-ai research reviewer status --workspace /absolute/path/to/workspace --json\ntiangong-ai research reviewer doctor --confirm-agent-smoke-cost \\\n  --workspace /absolute/path/to/workspace --json\n```\n\nSidecar readiness includes real filesystem negative probes and a fixed\n`execute|fingerprint|status` protocol. It has no arbitrary-command endpoint;\nreviewer shell, browser, web, undeclared MCP, and Skill tools remain disabled.\nDo not use Full Access, sandbox-disable flags, unsandboxed-command exceptions,\nor silent transport fallback.\n\nWorkBuddy/CodeBuddy capsule teardown never requests recursive bulk deletion\ninside the outer IDE. Native stages remove only the single active-session\nbinding, while completed, aborted, handed-off, and reviewer/work-package\ncapsules are retained. The journal records\n`capsuleDisposition=retained-outer-sandbox` plus a non-sensitive capsule ID.\nNative Codex/Claude hosts normally keep automatic capsule deletion. On Linux/WSL,\nwhen Claude refreshes an owner-only `.credentials.json` capsule copy, the CLI\npersists it through a same-directory atomic replacement only while the configured\nowner path, real path, mode, and initial hash remain unchanged. Concurrent owner\nchanges or an unverifiable replacement fail closed and retain the capsule with\n`capsuleDisposition=retained-auth-reconciliation` plus a non-sensitive capsule ID\nfor owner recovery. Static environment credentials are never written back. No path\nsilently falls back to Full Access, and retained capsules are never reported as\nactive sessions.\n\nThe discover packet derives a bounded multi-channel plan from reviewed evidence\nrequirements. Required channels run first; exact repeated requests reuse the\nproject cache without another provider call but still consume a bounded context\nview; remaining views are spent only on explicit coverage,\ncounterevidence, date, applicability, or full-text gaps. Native Web/Browser\nleads may be registered as supplemental candidates, but they cannot be admitted\nuntil the same canonical URL/DOI has an immutable broker occurrence. Registered\ninputs are formal candidates under their own content-hash identity.\nThe acquire packet audits every provisional source and registers only explicit\nfiles—never a directory or “latest download.” PDF and Office artifacts are\nstructurally verified and content-addressed. A registered binary full file is\nreview-bound but is not counted as producer-readable full text unless an\nadmitted UTF-8 text/JSON/HTML/CSV/Markdown derivative exists. Such a derivative\nnames its registered parent and inherits that parent's canonical source URL;\nit does not invent a second network-download binding, and a conflicting URL is\nrejected.\n\nFor top-journal work, the frozen scientific design maps every required evidence\nrole to all applicable lawful acquisition routes in the configured environment.\nEvery declared agent route for a required role is mandatory, and every required\ncapability must map to an available locked broker route at preflight.\nEach broker call carries its exact `acquisition_route_id`; native activity and\ndownload records carry `acquisitionRouteId`. A missing or mismatched route ID is\nrejected rather than becoming evidence that a method was tried.\n\nInspect the live, hash-verified route state before declaring a material evidence\nceiling:\n\n```bash\ntiangong-ai research project access status gpu-resource-impact \\\n  --workspace /absolute/path/to/workspace --json\n```\n\nOnce all agent routes are terminal, the command first recommends assessing\nrequired evidence-role coverage. Its `ifEvidenceStillInsufficient` field is a\nconditional access/scope action, not a claim that purchase is always necessary.\n\nSuccessful broker/native/download completion, explicit broker authentication or\nentitlement denial, and validated deterministic no-OA download outcomes can be\nterminal. HTTP 422, malformed requests, configuration errors, timeouts, 429,\n5xx, cancelled downloads, and login/MFA/CAPTCHA/security challenges are not\nroute exhaustion. Challenges pause immediately through an\n`interactive-challenge` handoff.\n\nOnly after every required plan-bound agent route for a still-missing required\nevidence role has exact terminal event hashes may the native host submit a\nschema-v2 `evidence-exhausted` handoff. The durable handoff names each remaining\npurchase, subscription, institutional authorization, owner input, external data\nrequest, or field collection action with an official non-sensitive locator and\nresume criteria. Research then stops; it does not spend more budget on\nlow-yield substitutes. If no lawful remaining route exists, the user must narrow\nor abandon the unsupported scope before a new reviewed generation can resume.\n\nAcquisition freezes an immutable evidence snapshot even when lawful retrieval\nends with explicit gaps. Before inference, decompose every acquired PDF,\nspreadsheet, archive, or structured file into exact lineage-bound producer-\nreadable artifacts; register line-range or JSON-Pointer evidence atoms; then\nfreeze `content-snapshot.json`. `research status --json` exposes acquisition,\ncontent, inference, and graph state under `evidencePipeline` and does not direct\nthe operator to analysis while content preparation is missing or stopped.\nOnly passing acquisition/content gates and required scientific reviews can\nfreeze `inference-snapshot.json`. Analyze schema v2 binds that exact snapshot,\na reproduced analysis run, source IDs, atom IDs, and design claim IDs; the CLI\nthen creates `claim-evidence-graph.json` mechanically. The reviewer and\nmechanical closure bind and recheck the full chain, ledger, receipts, selected\nartifacts, excerpts, analysis, graph, and report. Refresh a\nclosed result with `research project addendum SOURCE --to TARGET`; the original\nclosure remains unchanged, the child snapshot records a mechanical delta, and\ndefault status hides the superseded project (`research status --all` shows full\nlineage).\n\nUse `research run --project <id>` for an auditable project-scoped run: only\nthat project is checked, scheduled, summarized, and bound to the top-level\nJSON/JSONL `projectId`, so historical blocked siblings do not alter its exit\nstatus. Omit `--project` and use `--max-parallel` only for an intentional\nworkspace-wide run.\n\nInputs are admitted by SHA-256. Native producer preparation creates an\nephemeral, hash-bound packet directory but does not copy agent authentication\nor start an agent. The independent reviewer runs with a dedicated capsule HOME\nin an ephemeral platform sandbox. Only the minimal supported reviewer auth file\nis copied into that HOME. A reviewer formatting repair reuses that capsule copy\nonly after its SHA-256 still matches the owner source; changed, symlinked, or\nnon-owner-only authentication stops execution instead of being overwritten. For Claude, an\nowner-only user `settings.json` is never\ncopied; only the whitelisted API key/token and HTTPS base URL fields from its\n`env` object are injected in memory. Permissions, hooks, additional directories,\nand unrelated settings are not admitted. Codex project-root discovery is\nterminated by a capsule-local marker/config override, so a parent workspace\n`.codex/config.toml` is neither required nor made readable. The workspace\ncredential file and the rest of the host home are not admitted. Production\ndoctor is blocked until `--agent-smoke` actually starts the independent reviewer\ninside this boundary. The native producer is verified as the current host and\nis never smoke-tested as a child process. A successful smoke creates a 24-hour\nattestation bound to workspace config, capability lock, output schema, and the\nresolved reviewer binary/wrapper fingerprints. Production review stops before\ninvocation if the attestation expires or any bound value drifts. While that\nattestation remains current, a plain `workspace doctor` revalidates its hashes\nand the current reviewer runtime fingerprint before reuse. Passing the smoke\nflags explicitly performs fresh checks instead; missing, expired, or drifted\nattestations remain blocking and include the refresh action. Use the exact\n`codex` / `claude` route by default. A custom reviewer wrapper must use an\nabsolute `binary` plus an absolute `wrapperTargetBinary`; the runtime injects\nthe resolved target path and independently hashes the target executable, route\nlauncher/wrapper, and internal adapter. A wrapper that performs an unpinned\nPATH lookup is not a reproducible route.\n\nThe CLI owns the authoritative JSON Schemas for discovery, acquisition,\nanalysis, synthesis, and review. Inspect one with\n`research schema show <stage> --json`.\nNative producer preparation returns the exact schema and prompt to the current\nhost; `stage submit` validates and atomically materializes its JSON. A rejected\nnative submission keeps the bound session for an explicit correction and never\nlaunches a repair model. The independent reviewer receives its schema through\nthe reviewer CLI's structured-output option; a reviewer syntax/schema or\nmechanical binding failure gets at most one separately budgeted formatting-only\nrepair with no research tools.\n\nTotal, per-package, output, repair, broker-response bytes, estimated broker\ncontext tokens, context items, wall-time, output-count, output-size, and attempt\nlimits live in `.tiangong-research/config.json`.\nNew production workspaces use generous but finite runaway ceilings: 50,000,000\ntotal tokens, USD 5,000, 30 days, and package ceilings of 12,000,000 for discovery, 2,000,000 for\nacquisition, 1,500,000 each for analysis and synthesis, and 2,500,000 for\nreview. Primary output is bounded at 32,000 tokens and a separately invoked\nrepair at 16,000. The production broker hard ceiling is 256 bounded views with\n32,000 context tokens per view; input context is bounded at 128,000 tokens.\nTop-journal admission additionally reserves three early scientific reviews at\n500,000 tokens each, four final publication reviews at 750,000 each, and one\n4,000,000-token revision cycle, including their finite wall-time allowances.\nThese values are not a target spend. Coverage-derived working plans and early\nstop control ordinary use, while the finite ceilings, three attempts per\npackage, and explicit confirmation above the cost threshold stop runaway work.\nSmoke-test workspaces retain their smaller low-cost defaults.\nBefore project initialization and every executable package, the control plane\nrequires the complete token and conservative price reservation to fit. Native\nproducer stages reserve prompt, schema, admitted context, bounded broker\ncontext, and output allowance, but the host app does not expose trusted\nper-stage usage telemetry to this CLI. A successful native submit therefore\ncharges the full reviewed package reservation and records\n`accountingMode=reserved-native-host`; submit still enforces the exact schema,\noutput bytes/tokens, provenance, coverage, hashes, and remaining project budget.\nIt does not claim a provider-side turn or output-token cap for the host app.\n\nIndependent review uses the pre-call reservation calculator and the reviewer's\nprovider-side structured-output/turn controls where available. Review admission\nreserves three maximum-size generated artifacts plus one globally bounded\nevidence-excerpt bundle, and formatting repair remains one separately budgeted,\ntool-free JSON correction. Production workspaces enforce a finite 256-view\nbroker ceiling mechanically, while each project derives a much smaller working\nbudget from its reviewed coverage requirements and stops early when they are\nsupportable. Every successful native evidence fetch reports the remaining\nworking budget; excess calls are rejected before another provider request or\nevidence promotion. Reviewer usage records separate input, cached-input, and\noutput tokens; configured pricing fills cost when the provider omits it. Run\nrecords and JSONL progress preserve sanitized accounting mode, event/item\ncounts, provider turns, tool calls, reasoning tokens, and bounded provider\nerrors.\n\nEvery evidence source must resolve to an admitted input or a completed broker\nreceipt. Successful broker bodies are immutable content-addressed objects under\n`.tiangong-research/evidence/objects`; receipts are project-scoped and verified\nfor existence, size, and SHA-256 before every capsule stages them. Independent\nreview binds the requirements, receipts, permanent evidence objects, inputs,\nand artifact hashes. Its exact packet and merged bounded evidence context are\nalso content-addressed under the project `review/packets/` and\n`review/contexts/` directories. Mechanical closure re-verifies the packet,\ncontext, broker objects, and registered local input hashes before recording\ntheir safe locators. Capsule deletion therefore does not delete the durable\nreview chain.\n\nNative discovery preparation embeds the exact staged capability manifest and\neach external Skill's top-level `SKILL.md`. The current host may fetch admitted\nevidence only with `research project evidence fetch`, whose bounded request file\ncontains logical IDs but no credential values. The manifest includes the locked,\nnon-secret HTTPS endpoint rather than only its host, and each response returns\nthe exact bounded context plus a hash-bound receipt while retaining the raw\nobject in the permanent evidence store. Host web/search/database tools cannot\nsubstitute for a required broker receipt.\nAnalyze and synthesize packets contain bounded, hash-verified prior-stage\nartifacts and require no external evidence calls. Review is tool-free and uses the\nreviewer's route-specific structured-output turn cap:\nits prompt embeds the complete generated artifacts and a deterministic,\nglobally bounded set of excerpts distributed across registered local contexts\nand broker receipts. Broker excerpts prioritize deterministic, sanitized\nprojections of the exact raw-response items selected by admitted evidence JSON\nPointers; uncited receipts retain metadata-only bindings, and unresolved\npointers receive a bounded-context fallback. The packet hash is schema-bound, but complete packet\nmetadata is not redundantly copied into model context. Full local files,\noriginal per-receipt bounded contexts, raw broker objects, and the complete\npacket remain hash-bound for durable human/mechanical audit; the model must not\nclaim to have read beyond the embedded excerpts.\nThe CLI mechanically derives local full-text availability, source types,\ncounts, date coverage, source IDs, and the coverage decision. A `partial`\ndimension is usable but incomplete; a missing dimension or unmet declared\nminimum blocks downstream work. Qualitative gaps remain visible without\nsilently changing those mechanical fields.\n\nMethod Skills are external to this project. Recommended Skills are selected\nthrough `research setup`; a custom owner-selected database, domain index, or\nother external method is admitted from an absolute reviewed definition:\n\n```bash\ntiangong-ai research capability import \\\n  --definition /absolute/path/to/external-capability.json \\\n  --workspace /absolute/path/to/workspace --json\n```\n\n`research capability catalog --json` returns the authoritative custom\ndefinition template. Its source must identify an external git, registry, or\nlocal artifact with an immutable reference, explicit `expectedTreeSha256`, and\nlicense. Git references must be full 40-character commits; registry references\nmust be exact versions; local references must equal\n`sha256:<expectedTreeSha256>`. Every source type must match the installed whole\ntree before a lock can be written. Skill trees reject symlinks and excessive\nfile counts/sizes. Project-owned Tiangong Skills are rejected through this\ngeneric import path; the setup catalog has separate reviewed first-party\nadapters for Tiangong SCI, report, and patent search. Configure/import refuses to rewrite the lock if any\nexisting capability has drifted; restore it or explicitly update its source\nidentity and expected hash first.\n\nExternal Skills use absolute paths and explicit permissions, then freeze\nbefore execution:\n\n```bash\ntiangong-ai research capability lock --workspace /absolute/path/to/workspace\ntiangong-ai research capability verify --workspace /absolute/path/to/workspace\n```\n\nA capability using `brokered-network` must declare exact `allowedHosts` and an\n`http` policy with a credential-free exact `endpoint`, `method` (`GET` or\nbounded JSON `POST`), one exact `accept` value, safe `staticHeaders`, `maxRequestBytes`,\n`allowedContentTypes`, `maxResponseBytes`, and `maxItems`. Its optional\n`coverage` block declares dimensions, source types, full-text availability,\npublication-date availability, and named discovery scopes for the preflight gap\nreport. Mark `requiredForDiscovery: true` for every public index or\nowner-whitelisted database the question must exercise. Downstream work is\nblocked unless each such capability produces its own verified broker receipt;\nanother local file cannot substitute for it. POST request bodies may contain\nonly documented non-secret fields; credential-like keys are rejected, only the\nbody hash is persisted, and redirects are refused. GET targets and every\nredirect must remain on the endpoint path (an explicitly declared `/` endpoint\ngrants origin-wide paths). A non-network external\nmethod-guidance Skill stages reviewed instructions but does not grant an\nundeclared tool or service call.\nOptional credentials declare logical IDs, exact host scopes, header names, and\nprefixes. Put only the logical value map in `.tiangong-research/.env`:\n\n```bash\nTIANGONG_RESEARCH_CAPABILITY_CREDENTIALS_JSON={\"source.example.api\":\"owner-provided-value\"}\n```\n\nPrefer the non-echoing configuration command over hand editing:\n\n```bash\ntiangong-ai research capability credential set \\\n  --id source.example.api --from-env OWNER_DATABASE_API_KEY \\\n  --workspace /absolute/path/to/workspace --json\n```\n\nThe broker injects declared credentials only for admitted HTTPS hosts. Agent\nprocesses do not receive this variable. Keep the file owner-only (`chmod 600`)\nand run the production setup/workspace doctor before a run. Setup doctor reuses\none capability probe and never starts the paid reviewer smoke while a blocking\nstatic or low-cost prerequisite is already failing.\nCapability doctor retries only one 429 response with bounded `Retry-After`\nbackoff; deterministic 4xx, missing subscription, authentication, drift, and\ncontent-type failures stop explicitly. It retains only a bounded sanitized\nprovider code/detail and safe request ID, with an actionable baseline-or-\nsubscription decision for `OPTION_NOT_IN_PLAN`. Required evidence/reviewer\nfailures make `researchReadiness=BLOCKED`. Optional preprocessing, acquisition,\nand authoring checks have separate readiness fields; they block only a project\nor operation that explicitly lists the exact component in\n`requiredCompanionIds`.\nCredential diagnostics distinguish standalone ambient absence,\nbroker-store absence, policy-rejected injection, and provider 401/403. Every\nsuch diagnostic identifies the execution mode, credential scope, whether a\nnetwork request occurred, and a minimum action without returning credentials\nor raw authentication responses. The optional Semantic Scholar resolver check\nalso performs only one bounded 429 retry. A second 429 leaves acquisition\n`DEGRADED`, does not block unrelated research, and never triggers a standalone\nfallback; the academic adapter can still use its unchanged Unpaywall → Semantic\nScholar OA → arXiv → explicit browser-handoff order.\nThe broker preserves a sanitized non-2xx excerpt, safe request ID, and\n`Retry-After`. It performs at most one inline 429 retry when the declared or\ndefault delay is at most five seconds; longer throttles return an actionable\nrate-limit failure instead of holding the agent call open. The journal records\nthe bounded retry decision without raw URLs or credentials. It supports JSON\nPointer extraction, bounded item and estimated-token views, and an explicit\npublic-response cache. For a JSON collection, use the returned\n`contextNextOffset` as the next `item_offset`; this creates a distinct bounded\ncontext receipt while reusing the same verified raw object instead of\nrefetching it. Follow upstream pagination with its next admitted HTTPS URL.\nThe recorded estimate is `ceil(contextBytes / 3)`. Use `cache_mode=bypass` for\na fresh public request and always for credentialed requests. Raw URLs and\ncredential values are never journaled.\n\nRetry policy is classified: deterministic configuration/4xx/output failures\nstop, schema failures use the formatting repair path, and rate limits or\ntransient server failures alone may schedule another attempt. Synthesis\nsemantic validation also rejects literal `/n` or double-escaped\n`\\\\n` markers immediately before Markdown block structures. This unambiguous\ncase is mechanically converted to the same number of line-feed characters and\nrecorded as a content-free `package.output.normalized` journal event before\nindependent review; URLs and other unmatched text are unchanged.\nExplicit recovery uses append-only management events:\n\n```bash\ntiangong-ai research project retry gpu-resource-impact --package analyze \\\n  --workspace /absolute/path/to/workspace\ntiangong-ai research project fork gpu-resource-impact \\\n  --to gpu-resource-impact-v2 --resume-through analyze \\\n  --workspace /absolute/path/to/workspace\n```\n\n## Research Search\n\nForward research-oriented search requests to SCI, report, patent, and ESG edge\nsearch sources:\n\n```bash\ntiangong-ai research search \\\n  --input ./sci-request.json \\\n  --sources all \\\n  --dry-run \\\n  --json\n```\n\nRequired environment:\n\n```bash\nTIANGONG_AI_APIKEY=\n```\n\n`--input <file>` reads a JSON object and forwards it unchanged as the POST body\nto every selected source. Use `--dry-run` to emit the exact request plan,\nincluding method, URL, masked headers, input path, body, and timeout\nmilliseconds, without remote calls.\nFor quick calls, `--query <text>` builds a minimal body with `query` plus\noptional `--top-k`, `--ext-k`, and `--get-meta`.\n\n`--sources` accepts concrete IDs and presets. `default` expands to `sci`; `all`\nexpands to `sci,report,patent,esg`. Use source-specific endpoint or credential\noverrides with `--sci-url`, `--report-url`, `--patent-url`, `--esg-url`,\n`--sci-api-key`, `--report-api-key`, `--patent-api-key`, and `--esg-api-key`.\nThe equivalent ESG environment variables are `TIANGONG_ESG_SEARCH_URL` and\n`TIANGONG_ESG_APIKEY`. When source URLs are not provided, `--api-base-url` or\n`TIANGONG_AI_API_BASE_URL` may be a Supabase project root, `/functions/v1`, or\n`/rest/v1`; the CLI derives the Functions base URL and appends `sci_search`,\n`report_search`, `patent_search`, or `esg_search`.\n\n## Education Search\n\nForward education-oriented search requests to course, education, and textbook\nedge search sources:\n\n```bash\ntiangong-ai education search \\\n  --query \"activated sludge process principles\" \\\n  --sources all \\\n  --json\n```\n\n`--input <file>` forwards the JSON request body unchanged. `--query <text>`\nbuilds a minimal body with `query` plus optional `--top-k` and `--ext-k`.\n`--sources default` expands to `course`; `--sources all` expands to\n`course,edu,textbook`. `course` search can use a scoped bearer token through\n`--bearer-token` or `TIANGONG_EDUCATION_BEARER_TOKEN`; all education sources can\nuse `--api-key` or `TIANGONG_AI_APIKEY`. When source URLs are not provided,\n`--api-base-url` or `TIANGONG_AI_API_BASE_URL` may be a Supabase project root,\n`/functions/v1`, or `/rest/v1`; the CLI derives the Functions base URL and\nappends `course_search`, `edu_search`, or `textbook_search`.\n\n## Boundary\n\nThe CLI owns local operator workflows. Research workspaces keep bounded local\nstate, capability locks, isolated agent runs, usage accounting, provenance,\nindependent review, and deterministic closure. Research capability credentials\nremain in the workspace broker and are not forwarded to agent processes.\n\nFor KB operations, the CLI sends bearer-token requests to the Tiangong KB\ningest API and records SQLite checkpoints for batch recovery. Ingest uses\nthe bulk runner and releases sliding-window capacity only when document status\nis `completed` and both `opensearchIndexed` and `pineconeIndexed` are true. If\nthe status API does not return those index flags yet, the file remains in\n`waiting_for_index_flags`. The backend owns authorization, collection\npermissions, duplicate detection, NAS raw writes, parse queueing, and status\ntransitions.\n\n## Validation\n\n```bash\nnpm run lint\nnpm test\nnpm run test:platform\nnpm run test:coverage\nnpm run audit:research-setup-pins\ndocpact validate-config --root . --strict\n```\n\n## Release\n\nPublishing is handled by GitHub Actions in `.github/workflows/publish.yml`.\nPush a `v*` tag that matches `package.json` version. The workflow publishes\n`@tiangong-ai/cli` to npm through npm Trusted Publishing after lint, tests,\ncoverage, immutable remote Skill pin/runtime-contract audit, version\navailability, and a package dry run pass.\n","readmeFilename":"README.md"}