{"_id":"ettore-ai-assistant","_rev":"32-1ddf93a8d4b38602d861f381d603e79f","name":"ettore-ai-assistant","dist-tags":{"latest":"1.10.0"},"versions":{"1.0.0":{"name":"ettore-ai-assistant","version":"1.0.0","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.0.0","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/re77/ettore#readme","bugs":{"url":"https://github.com/re77/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"eda9943bc04d07a07ebac85fe3547d79a6926384","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.0.0.tgz","fileCount":52,"integrity":"sha512-+RNP5leNyIKeboG9fxwZ0+MOL0ukjYTdzcQRq3g+HUHzaaNZ0NuFqharzp+X5vzrWEQP1pJx5jlML7mUfD4MQA==","signatures":[{"sig":"MEYCIQCW0NErD8mROXlBs9R33a/TDCmWEiYUKHkLgxF5R7nLmgIhAKBKPGsBNoQ+lSHswmti/m2lLJ/24/c+7NJBt2pgB+Fe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":629811},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"e49f93fc7f786db5686e6f70d299b3c83047d7ba","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","start":"node bin/cli.js","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/re77/ettore.git","type":"git"},"_npmVersion":"11.17.0","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.0.0_1782754687828_0.6816564707931876","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"ettore-ai-assistant","version":"1.1.0","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.1.0","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/re77/ettore#readme","bugs":{"url":"https://github.com/re77/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"75333ffc5df5c808a44079272d4dd8617ba6e570","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.1.0.tgz","fileCount":75,"integrity":"sha512-jwLv5l+l3UrNt9vdX+x5csFBxcmOpbZtCCLIaJciZSI9Dco/ag8FN8MVnA6y3OvrAPMAXs1DRr91yxMH5OytuA==","signatures":[{"sig":"MEUCIF+JkUHmy35JiX4Y21aBdCF/Jwm7fJ171aB2GB3AwPnQAiEAiDCzUryUDsqzKetNbE162qd2SoaxAobSlBJVGm7s3Tw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1127798},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"00f429dd03ef8f71ef9c75ba3310100a5b047e3a","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/re77/ettore.git","type":"git"},"_npmVersion":"10.9.8","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.1.0_1787587279452_0.8618179002375934","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"ettore-ai-assistant","version":"1.1.1","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.1.1","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/re77/ettore#readme","bugs":{"url":"https://github.com/re77/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"ace78163361c458e0a01c2111f0857bd044396b1","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.1.1.tgz","fileCount":75,"integrity":"sha512-f09S67q4BWkVN18+DonPZc9U8U5MTVA0XL+lB1B22NSeoRuJX6OwOm43u/GZ9NYjwdnexAotthR7ZFLl1Eo43g==","signatures":[{"sig":"MEYCIQC156dZyWOHdUGFYAs9h9f/w4OgJ3VnHPLxwT2J+4cHdwIhAJUlo4U59t6vab+p1ItsQzHc6L1Lx33ucdh8zCnuP/xr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1130882},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"00f429dd03ef8f71ef9c75ba3310100a5b047e3a","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/re77/ettore.git","type":"git"},"_npmVersion":"10.9.8","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.1.1_1787589963365_0.2440995284386629","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"ettore-ai-assistant","version":"1.2.0","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.2.0","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/re77/ettore#readme","bugs":{"url":"https://github.com/re77/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"8146f0663f0c3dd52a4fe8c32b52dfbac47fb86b","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.2.0.tgz","fileCount":81,"integrity":"sha512-vUO46DRMfyV2xjJnXg3f3TLRW68F7iC+ePRf3WRre2EBj2ilOXD262fGURCJjE+c+I82wmERD0Ux7h5y/RXN6g==","signatures":[{"sig":"MEUCIBaFHTLuZsO/ZjVdFQcKJkqE82g+8Ql2eo3Cfz7/lDBAAiEAyrolv3vi+/cY4vk6PUImqt0Rj/U5+1ubhG4QH538+Nc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIA4QpqUa1qA1OI3qwEZqdu80BNbjXQ8yJtLHBgpoLRFQAiADDBt7hzZD8m1cB2VLrovtwB7ywVbJ+SWADCtDrvaKKg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1252820},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"fe3a7c8fac8c3b178b26359617b15c5f7fd5f423","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/re77/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.2.0_1788600433104_0.7872896207365656","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"ettore-ai-assistant","version":"1.2.1","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.2.1","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/re77/ettore#readme","bugs":{"url":"https://github.com/re77/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"17920b03aaf76c6e84d4c8d19ec22cce2bc51dc9","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.2.1.tgz","fileCount":82,"integrity":"sha512-gw2oPyTETOl1+/p/L0JNIQRb85J+WPI/9hvVycnh4q0yQl8SEYieF6u0vuyy/LrLYXPjiN6noXMfZPPN7dFwJw==","signatures":[{"sig":"MEQCIEauVmgSNrYFzoGs9VSGUMNl4x4TMPaSXVpyD61Q9/uQAiBe/Wr+Jpy7rBnEruIg9p9yifG04qdZWdjdd1nc6HkwUQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDkz4wUgBldYjZs6vVpFmizy3NkluHRIMuZ+OM2/7JzYAiA3Gurtd3LsylsmRqKW4Map7mt9EQDs9p2khFfed4qFKA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1272422},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"1ed571d3ea3dc583882223b4bdc0eba07110928b","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/re77/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.2.1_1788602874775_0.32181594037186256","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"ettore-ai-assistant","version":"1.2.3","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.2.3","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/re77/ettore#readme","bugs":{"url":"https://github.com/re77/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"8fe3b196c307e6ed7894dc46b58c7c53fbcd8bec","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.2.3.tgz","fileCount":82,"integrity":"sha512-QwM9uioK8TE7A9AFbZev6dXjGSt5dsIIvMQM/Ks+zhhKu7VxhN1rtAr3FAD7I9gqVY5VTUGm4iwqdlClEEWakQ==","signatures":[{"sig":"MEUCIF5L2hmcg6mOE3UVt/xHlK6m/cYvzX7cfPizXd1ssogqAiEA62vAdegzrDfPk6p1maF8IwkR6H6yQW7hhx/2z1kCnPQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIC5+rYRk9uKeVM/U3+f6DlTd7R4oWf6BQPb7mqwpJF4sAiAeNDAZosHwiVNliz496CamgdFkYNQx98dvaDDjxe+Fwg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1273737},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"f70b76880e9702a8692376d6bd9720203d8a2526","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/re77/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.2.3_1788608959300_0.886791188691382","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"ettore-ai-assistant","version":"1.2.4","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.2.4","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/re77/ettore#readme","bugs":{"url":"https://github.com/re77/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"8b71bbf9b5c890681f0b91c82c23533c2b19ec43","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.2.4.tgz","fileCount":82,"integrity":"sha512-RSx5iFIGw2lcXVbXkEd1EcpuODIvKOj7BK+DToo/R3Yj+5BN0+yc3uHIYzniO6B4SpMQlu3cUgg8HAgld0REBQ==","signatures":[{"sig":"MEUCICZLwsGmEMFIYtzaXWRs0klnx2dVjpRZYABsA34vpfddAiEA24VdHpORTtjui9kYJifRW/bUcDcx06iJ1+HzjxptEm4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC6WT6ipRyAEmjfkP/taJPOcWuE7TtI21H9CImSBNJRWwIhAOGTbpiigQuJHCb/1iWQSPiRpYkCOUQmckvEum7R9dHA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1278144},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"f70b76880e9702a8692376d6bd9720203d8a2526","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/re77/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.2.4_1788615483458_0.5965459969988998","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"ettore-ai-assistant","version":"1.3.0","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.3.0","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/re77/ettore#readme","bugs":{"url":"https://github.com/re77/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"03be9bb829ccc1e1e87383240b015948063b9906","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.3.0.tgz","fileCount":84,"integrity":"sha512-jnveHkTf+ZwzpjRDdWH2GZgRUqox9TDuhUIUfISD4W0rJiKos1sH9ILAgWTf5XkHEeW5kIT6xAnyzljCe3P7oA==","signatures":[{"sig":"MEQCIG04BNH8JkZL70hqoQ0DNsea6Vbn3VTnUlwl/mcZlx/ZAiA5X40GocpGOEqAMl7k6ytHL8PXNjwc3+bOtCaep3bilw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC8z626vRVtpAKzv3zla0pkj1x/oH+exNKNwWhjOfYGiAIgfLlMIhnzHPedyny3GB3oS1wpl13f/8BwGSP0xdpWXnI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1318815},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"500f098d577f751d291fcf3fdc9ed202a0e65389","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/re77/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.3.0_1788626499998_0.07056692203680193","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"ettore-ai-assistant","version":"1.3.1","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.3.1","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/re77/ettore#readme","bugs":{"url":"https://github.com/re77/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"fa0176ace92ebaa59894fe208206a710712f7b28","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.3.1.tgz","fileCount":84,"integrity":"sha512-DSiLmWIIUEaq2nFG2X+odbobE66RK2UsZtXZSp6efGoKLw4QbiAlK1twJycQjS/YMjc6xjE2rC15vH+3aS2tAg==","signatures":[{"sig":"MEQCIFEsfdWL5/j0BmQE7us2fLXuGZZ+HydYItCoHSnEUkuNAiBGbyZjJUv4nrR+b7nCxaZOiG6RQZMFycuaZOiPggCAHA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICJ4T5D0INXeW/9PFvHblQoyMzdph2lCtz6bM0LRG7BCAiEA9zoZRM5d8jqhzl3J1FC80szny9qjIq7huZoNH8RsoN4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1320697},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"8b5562338611cf3da26071b4feec932d7b076f9b","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/re77/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.3.1_1788627265650_0.04356689940937497","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"ettore-ai-assistant","version":"1.3.2","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.3.2","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/re77/ettore#readme","bugs":{"url":"https://github.com/re77/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"f12204bfb102abaf36ff45d066e5d339179fc352","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.3.2.tgz","fileCount":84,"integrity":"sha512-rynuF6P5vpH96fug2W9eOdamlIe2cKqYJ0oo9qlN6qfq4dszSVJiQfCGg2wdZBtlwf07EMe9QdHwzwZJrmg6qg==","signatures":[{"sig":"MEYCIQCIAZfA+Pb1s4jcS9n0hJiavwB4+GL4cmfQJwXPU6r77gIhAMc/jwPCVorTNZNjKtC9q1EdlWprh6LvNo/rBkTmMcnl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEktzt+Ub/IX0KbPqVq8S9EbXgQgkV3YhCZAtzpdrEDKAiBii5GRuXxn+IWxS4tf6IL3JTcHsuUIvdCXAZ1d/u0DKg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1321175},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"c22bde642a2d6990eaa039834caee60b5759a8c9","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/re77/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.3.2_1788628040826_0.021024249228251524","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"ettore-ai-assistant","version":"1.3.3","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.3.3","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/re77/ettore#readme","bugs":{"url":"https://github.com/re77/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"6182ce9d99e2e410038f0adc32ae19f9dc1f164a","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.3.3.tgz","fileCount":101,"integrity":"sha512-Ka8xN9fjCJuNkt5T7gQ1fOGnsVBAyMlPrNdUyH3tjTujBRdgX04Qh7Sb0Ddw/QO4EEvJw309PxPu7629MTLEAA==","signatures":[{"sig":"MEUCIQDscnqqrscHRPPUxxZtw3drPCfbvdvlMpBqllRpUSUEIwIgXYiuEHHQjPdeQxM/3VsbUQ5tFTe6bOlaxn6CIOsfZjk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDiab5VdOwhS1RFEYzvBV5OK631pJ+eaN6zqYmnTZ98LQIhAMNI5a16674ndxj2BkCyRrItS1wwMNt0QHWU8oP7sg3j","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1502750},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"31e29b1fe7d9920af7efeebb99bf4748e4574f5c","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/re77/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.3.3_1788647127847_0.8538843846802824","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"ettore-ai-assistant","version":"1.3.4","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.3.4","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/re77/ettore#readme","bugs":{"url":"https://github.com/re77/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"064d0c174c22eec162fd6e208b8e4af1bcdefb54","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.3.4.tgz","fileCount":101,"integrity":"sha512-6BOjSoS//x1d18oaDnyPm//dQG3mYOyGz6NcrCltiO/AC3jtBb/zhNLoi5o2XYzTmFPxXAB2A1B06MYKG0pdDQ==","signatures":[{"sig":"MEYCIQC9CY1YUxnhUb4hNK8IvXEW6zehS73wmGd3Zifp2b+alwIhANzWRJo1Mb+tCw5OlC2YkO6OVvSXB1UFDbCx0Xh3P15l","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDTNOY3RRxWXifTjOlVpnPXCtt1UDYiXaKV3U5QiC9zlgIhALkwlRGWTAi4ucdbA9ZUfoABC0H3Mm+xmJCb3U6XY0fQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1503737},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"d4618d41354b5c7227a6d4f093ffaed8e89b2706","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/re77/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.3.4_1788647713676_0.867379470021115","host":"s3://npm-registry-packages-npm-production"}},"1.3.5":{"name":"ettore-ai-assistant","version":"1.3.5","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.3.5","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/re77/ettore#readme","bugs":{"url":"https://github.com/re77/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"c350b0eea54c5f374e1adb565cac55a7896e8b0d","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.3.5.tgz","fileCount":101,"integrity":"sha512-bLG2rrUj5IoGoZuGVnUY7Mv1tFQjxrmzON50yerSoEYcOA6YH/ZTvUUR/Gq5KPpFU+ZxcNA7/lLsOCvJuFp3hA==","signatures":[{"sig":"MEYCIQDxD20I2ZEkJStpac2sJyDhrI1laIsuFo+8xJlZTF2j7wIhANONsjLEhgg0mfDQ+b+0voi99e5TxTmDdS0PPiKyUvyJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIF73sCQS44LqwUPHi2B8LBnUxaIx4XQgmGKLxNqIH30sAiEAhptJhM9BBzKPJysxdrzcRbd+C/FHMKR6bCzftYuZeHM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1504085},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"8772cb0c25558209e2c40429c987b49abdf08041","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/re77/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.3.5_1788648416863_0.34462500902565796","host":"s3://npm-registry-packages-npm-production"}},"1.3.7":{"name":"ettore-ai-assistant","version":"1.3.7","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.3.7","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"512a899b6e57fead7020c3fe51a5686544a71dc8","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.3.7.tgz","fileCount":101,"integrity":"sha512-I2HMANM1HSNpUIzEfPGnkU949f3pQefB7nsxH/onDTyPmQVltcP23rl4f0on65f6wI02cEpsJPef1Ebixzgvhw==","signatures":[{"sig":"MEUCIQCEFPv+C9iYzZoCVW0lf2RYs5FEmbz60mowG46qUNcGYQIgYtC13hBSyXEjgDCbZRnXFheXTTOWP8Ptkn2SJq3t57c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDNnl2E8zCrFJ+HlvPChDVAF7J7jtT9QFMqb5919Le8VAiEA1AEdlS7Xj8PfsgTN0e/o9JOaeCZACOuAe1PzeU03Vjg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1513464},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"cb8b8075579a87062c8097733597e4a62105d71c","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"10.9.8","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.3.7_1788651178506_0.7224672472795985","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"ettore-ai-assistant","version":"1.4.0","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.4.0","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"3df07f972d15fc441ddd12d8282545be746ea27a","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.4.0.tgz","fileCount":104,"integrity":"sha512-fF26He97ps6mxB1VilT6Th72cwSNLEgOwXalLSlPMW/AGFtAEtsisQS2lBW9gNGroMaKZO/pMZx60fZwQLKv0A==","signatures":[{"sig":"MEQCIAwDpv8gG0kYeraRvif2x4Zqe9ERYLu0jeqD9Lq+juKCAiBiPKXvLSb0a736w0tu3JzuuzhZPdl44kDJE0N//xfa5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHZBN7Vn7b5o/FTkV7NGPbzy4uYRGSWMBaY6NPtQbwbZAiEAyGGr2B2W8hjTlGxaYf6afeYzBJf07BxUK+TrGjzP9QA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1540119},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"b8c68dc4b58999bc94918386bddc201e064ebdf1","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test \"tests/**/*.test.js\"","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"10.9.8","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.4.0_1788886696417_0.039163911406683294","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"ettore-ai-assistant","version":"1.4.1","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.4.1","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"4c349f8ad4091237bab18babc8ce75f462232416","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.4.1.tgz","fileCount":104,"integrity":"sha512-2CcYqvpDQZS9TCxt8bf6tnKolarzZZZu757D+KJNPNWnhw51lljyF4VCdGjpHjAR6Q3WrN4KDN7e0Ha+o4l/1A==","signatures":[{"sig":"MEUCIFex+qwKqHKS5b2RwaL9G9nmHkdL7HR14Q3kvqAp2jS/AiEA87m89mhFs2+hIvp7F2v+Q24meLxd80hjWNeka317vkI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICvTJDPIUyHvmd1285KfDOrnJJH/UGcXqcv0WyAncnY7AiAdZejtteGqvLfOIMUBh4IuCrK44WrgxhDjTFWfpMqyqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1549439},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"17f4dd46d9687822f447253a1d6befa663901641","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"10.9.8","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.4.1_1788889132091_0.6025622574369882","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"ettore-ai-assistant","version":"1.4.2","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.4.2","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"80502c3ff18e5d223a49e1fc48e8cc4af7b90e0c","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.4.2.tgz","fileCount":104,"integrity":"sha512-XhJkrGmrqebJEfBOof9Ea+yBdrxeWOdsSWTbkVLtXXwMqyQH2tAkD+bLXXJbb9b5BpVcdUIbdTJ3C/2kcnCP2w==","signatures":[{"sig":"MEYCIQCvj5rKZYug4fk4a66TjW0wiMJmLR1bhcqCYezGRd6NogIhAMNGqYu++j+w1wUm0OER+e1MEUWQHyXOFD1p8qM5k06u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCkd1lWHYVjsLuvMPLOOS1CvNqfu5+Vx1OGHdNSkREhcwIgWfudvN9Txuxwpq+AvPH7NYFbOq+80sI4U5ZpRwL3BMI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1553267},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"fea78f926e2c6248bb986b05ad792a6612523b8d","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"10.9.8","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.4.2_1788891228412_0.19268617052138248","host":"s3://npm-registry-packages-npm-production"}},"1.4.3":{"name":"ettore-ai-assistant","version":"1.4.3","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.4.3","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"8ba05e738b3a28d0b6ce02513a00c321bb507921","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.4.3.tgz","fileCount":104,"integrity":"sha512-CTtWBzfmiK8stAw0vWZUmbgftDqiEcT8snL7+ql7h1ZUE8yb0TGZxTjWWZHjAt51RxnWvkeAB1FAD9QREr8jXw==","signatures":[{"sig":"MEQCIAWjbQv+pz3PY91sZsC1xGXd6rCBIq3ZkcMH9jEmnzU2AiAqnV3zvzWEJUSXCA/jJ1KAiw6dg0d3S11zdZa2h07K7g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFSuOvwnbLZCPRNNesbLwQVBXMeI8u1jLUxVzutzPP2LAiEAqfFRKpws6vcN+LFbb6OhbvSknygKLf+Xy/oS6rAcgqU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1555421},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"d8f999830760062f70558e29b4208c966c95d2b5","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"10.9.8","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.4.3_1788892248662_0.9397444058253814","host":"s3://npm-registry-packages-npm-production"}},"1.4.4":{"name":"ettore-ai-assistant","version":"1.4.4","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.4.4","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"b48536a9c8641345f3496a31369ad92c45875ac9","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.4.4.tgz","fileCount":109,"integrity":"sha512-7pr0czpiXpRXViyczwXXebpkpfMuBrQWjhCBXnUyoB8Orf7pqhZUiTwxOjODGqoPxWEA/xz5bN8XlTg2Lp9N5A==","signatures":[{"sig":"MEUCIQD2hBuvp1Zu5crBBeCg/luVzMDhxxgawFCALShf+FotHQIgFIzar4YxP+r/kN1X3t1vq58DhLz01ZaWugpUYtuua7o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1725582},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"b58eb7d6fbc2671df47bf505e6ca1c7eef445238","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com","approver":{"name":"re77","email":"ettore.berardi77@gmail.com"}},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.4.4_1789293248641_0.8649036753908703","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"ettore-ai-assistant","version":"1.5.0","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.5.0","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"f6f5decb78b58487cfee25c8b472f47300180336","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.5.0.tgz","fileCount":108,"integrity":"sha512-rIcem+wyCByhmlXo1wpqn7G3rs2y9TYNCsvFCqb9rDf6/pZkG30DweGaOLf+VBR9JijSVMZFmlFsZiQBwlBKUQ==","signatures":[{"sig":"MEUCICJaVTFa9pCka8l1IwX3Mp6A1WUdcjfgCCg6i/ZnTvHRAiEAsff6HDiSbjtu7aClIQ+0QwGp4ncjUIZmaLWgEPZva7A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCbL+Y9boQ1uJv3r9EPLdyGtElk58uQXk53EzdbfCWVVQIhAORUBClVsIwznPe9Orqtn8pILeR5pBwxYAqQUCkOz8JF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1759382},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"4711056e4f6b8b01b61b540948577ff593c5bc08","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"deprecated":"No longer maintained. Please upgrade: npm i -g ettore-ai-assistant@latest","repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.5.0_1789490488359_0.33972546313191887","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"ettore-ai-assistant","version":"1.5.1","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.5.1","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"f63ae56a8289a92307790548d005540c574aa01b","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.5.1.tgz","fileCount":108,"integrity":"sha512-4EmkrCxqTHA1CbFj5/iFqkG+bzEJwun6hAkdfRO5ewm1qcS53dGZobJdnkTjUShCPm3PZ5UuNHYsJQAViISXqQ==","signatures":[{"sig":"MEUCIQCGHyTZ8kkZebJgjukwBpEZlS8SaYoI2lAUxqUDFRRYcAIgII4k4Coww3DdRA9qvBRfmlFSXe0VjCyxeDxEuHYavHA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIC+ozhdDSrlyCHyHZW7qu0yFOMAi2Dd53E5ZK1z4b5w7AiEAgml4dmzpqU1dTfJfVGF1ZmoNdIMScAlyv6hPp6cKwkk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1762319},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"26ee96bed589f75a71c1f8c7e42e3200a942adbc","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.5.1_1789491514192_0.9818172827922023","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"ettore-ai-assistant","version":"1.6.0","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.6.0","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"a4db7f3d2c4e45de30cd132ff07e9b1915fe6baa","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.6.0.tgz","fileCount":110,"integrity":"sha512-qhLogl1fus0RkDji0dBI12edIhpZEpz+MojWilPohUlxZzDS88snzgbzUImGv8ztnggV9inLUA4ltaVWa9tvag==","signatures":[{"sig":"MEUCIFaMV6Li8rWNe9fiEAS3xoIH7Zyn83dB++ndmX0IcGnjAiEAhdNvsU0lRLNC6bCJ+9pNjqp7Tt8Ee0W61W2ZR6hofzs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFmNosdYuqfqN05QRr32jHQMSYIIu9iVaKdX4EY0QUjgAiEA7oOfd5FCwLZ3ehck5fwCVh/A6Y1PmEZQkPSBNluHryw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1796494},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"15513064641be68b3e12c63d566d1fe5ec103088","scripts":{"dev":"node bin/cli.js","eval":"node --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.6.0_1789663860707_0.588165344371536","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"ettore-ai-assistant","version":"1.7.0","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.7.0","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"842e9c72a952fa9a85107f1a5fa86bdabee3c516","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.7.0.tgz","fileCount":116,"integrity":"sha512-8OKf1cvRwc02xzb7mVXwOZPRRvO50xGdeWRj4i4LV9gvfRJCqb8uDy3MRNInD0KcolKph7z6TVI/tJdammgc0w==","signatures":[{"sig":"MEUCID4Lk1ZhGXlhbI8tbSMkCFqXKuFsKA2dbezy7LCgX4YLAiEA477delfwBlAFmPrK9/lwjdWdCC/MvMWWv2R7D8fdnC8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDlSFHhfcTZHvGyHsr9URxw4EfLIRAiOj644Yzgzb3WRwIhAO4yVMyu8RAJQakVoNyq6Tf1pRcc+cy2Hvw/BjseGBiV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1851978},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"eec26d051233890c336b7e91d99d51df02c8a40b","scripts":{"dev":"node bin/cli.js","eval":"node --import ./tests/helpers/test-setup.mjs --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --import ./tests/helpers/test-setup.mjs --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.7.0_1789989615459_0.47363857884679583","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"ettore-ai-assistant","version":"1.8.0","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.8.0","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"8afd75bab2d4f739dcf2c729cf7741ececda526c","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.8.0.tgz","fileCount":117,"integrity":"sha512-PfaZfj9Lbtscyar90AnF9tRxv7Zp4Fn70t8MWnnqujx+MR4bf31oDb3S6lfFjw40IfUsIFN+/+rMe+4/HQtGQw==","signatures":[{"sig":"MEQCIEV6GA9+aqt/EJyXuwMoeTY143JdQUzPzpb5gULX/gc/AiAhMZj2WdEsEK1fFCmcs0xDLK4T5RZqdDwXkP7O0D58Og==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDUrnb6EBnuiBDIH5IUh+PdKgl6jrPEJf4bSb6MnTp71QIgFuUK2VgvermbawFSG70Ua6mqAo8txpOvY87O4Jh133M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1952827},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"d1241249b5b49a27e9384bbbe0aa421f3c28919a","scripts":{"dev":"node bin/cli.js","eval":"node --import ./tests/helpers/test-setup.mjs --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --import ./tests/helpers/test-setup.mjs --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.8.0_1789990791823_0.29662181278171507","host":"s3://npm-registry-packages-npm-production"}},"1.8.3":{"name":"ettore-ai-assistant","version":"1.8.3","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.8.3","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"ca73dadcf89d15a150f5db58ada436191626f171","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.8.3.tgz","fileCount":118,"integrity":"sha512-0R6+SIoKRUMhiiO/LRswcn2anbWqWtBDTTKH408oIUpWEuY3abKk94fPprKdRXrU9C2ia9HlgwQ1pME/m/aorw==","signatures":[{"sig":"MEYCIQCu4ddtfwCccQrz4Gn3FVc5aiyEPhOGj+OgzYeJBzg4MAIhAP4QEYOgKzmg1GrKkFvF7QbnOXxMHEUm0x8HgvA4eR3r","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD7aksjyl2ccdpJarieXqPXxBhLpsOIxAX00l9f0cSr5wIgKPxXX/1BYkL+efFoUs8R+vgQwLp1FLeLPaVnA2BOJQk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1964140},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"069d685f489cbe8919d79c798629fabbfd566a7a","scripts":{"dev":"node bin/cli.js","eval":"node --import ./tests/helpers/test-setup.mjs --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --import ./tests/helpers/test-setup.mjs --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.8.3_1790006313512_0.39789687155422704","host":"s3://npm-registry-packages-npm-production"}},"1.8.6":{"name":"ettore-ai-assistant","version":"1.8.6","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.8.6","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"6e641888a229eaf2cc75fae6996154992e2bcf5a","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.8.6.tgz","fileCount":118,"integrity":"sha512-oogyFYkoy/h1x1gbCsC72gRv9ISgwcFokmFd15OHYohyKVBOBLaPEMfELnrRI7fOiFoMAlmi1ixUhTw6Bn6bgA==","signatures":[{"sig":"MEUCIQCyZCD1MeqAzpxJeIcEHU1dVx8Z4qVctzqyrQw/uBA21AIgLnx3hesD7ULXVmTymblHu6yC5sVo2kftF2dR5rMtILI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCO4hFVlqcsC1OJmKIYJsOAB7LImdAkKQ5h3op9B4lzoQIgQB5d0Zi0labpF0v8FWPhp/uT6VKH4tIWHMwcv2KKI1I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1968349},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"e5c28e7189b9a5d2ab3a60817caf1c4f498fba3c","scripts":{"dev":"node bin/cli.js","eval":"node --import ./tests/helpers/test-setup.mjs --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --import ./tests/helpers/test-setup.mjs --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.8.6_1790008033372_0.060287901974349634","host":"s3://npm-registry-packages-npm-production"}},"1.8.7":{"name":"ettore-ai-assistant","version":"1.8.7","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.8.7","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"570beb4e24afd79d8eecf6bd854b52c3372770c3","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.8.7.tgz","fileCount":118,"integrity":"sha512-QtNk3tiUiCpQxLEU6rTHn/dXatLnba3H575ymjfUjJCMmr2yl2yC0JibALzxe1OxENQ3fOhCiQs8d8u72YdtpQ==","signatures":[{"sig":"MEUCID5IaVk3YwLH2bQRMAtaU/+BiNcYmmzOXmSdQ1SVCR1KAiEA4OvUp3IittPl9XND8lP4Zdh2LoYhmXJsf7t8jP6hf/c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIB/vlkznp41U8//1R46j91KkLm6mYafi487TOsC2IycgAiEAiv/BJm9l5R2vZ8AeGZzr0TX+c8Jk3iZFdsIl/6bQ4bs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1971018},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"b4d8ddfa428c0a1f1166ce1658d4900ba1b42be9","scripts":{"dev":"node bin/cli.js","eval":"node --import ./tests/helpers/test-setup.mjs --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --import ./tests/helpers/test-setup.mjs --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.8.7_1790010027047_0.662999503369202","host":"s3://npm-registry-packages-npm-production"}},"1.8.9":{"name":"ettore-ai-assistant","version":"1.8.9","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.8.9","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"15fbbbc4c8fe339cf5b3d418e84abc70e5382ad8","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.8.9.tgz","fileCount":122,"integrity":"sha512-3mxDpuv5Mgi+zvr70nQPiLEgj1HkjOHwny4XqoGeE20OyxpBIX4kPR1n0FsfLCa33Ww5HIMZbh0B4I9Q39TwHw==","signatures":[{"sig":"MEQCIF7926YtWTy5SbitjIntO7zov9hm1N7XWA+BNmKadFtwAiBrVGuBy7cF/TnOpMRqEbFyP1OAI7tOVhw1o1X2FrDNUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDD24HhHaNcFcV1IsFsw5DKf0YA2MQBqN+y7pSTwOu4tAiEAmgXOG4NSwRTQLcbFfxfOVxwFDWNj8N8M+BZoW/mbBiE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1995329},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"84298eff621211945e67abf742f7721d98ddf688","scripts":{"dev":"node bin/cli.js","eval":"node --import ./tests/helpers/test-setup.mjs --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --import ./tests/helpers/test-setup.mjs --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.8.9_1790014443053_0.6606797564243692","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"ettore-ai-assistant","version":"1.9.0","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"author":{"name":"re77"},"license":"MIT","_id":"ettore-ai-assistant@1.9.0","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"homepage":"https://github.com/Hberardi/ettore#readme","bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"bin":{"ettore":"bin/cli.js"},"dist":{"shasum":"9ecae65389bb58ef0c45c6ac72aa9a213fbdd35b","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.9.0.tgz","fileCount":125,"integrity":"sha512-89IxqvOFKOkGSufxnqdSwghbfdCNK/OUTu7wj8uiuhgEHPfvnWA+OnWA2M1qA7grZqXk4NhMO0rpik2a6Z4s8A==","signatures":[{"sig":"MEQCICe5yz9MH3KsmySRlFsl67CtzqDa27qm84eCv40Ph4k7AiAGtM1+BZ0xcR5OkOqY7LbBOzm9gi25wre8/g/ru3eUCA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC3NtTDOAlmrNqhBB/Ct1SsG9prsZLXkBk8hOltawSN+gIhAIzRDdyrv6sd7ThmZB8xN34pMsLRRq/trTeRZg2S0BID","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2053722},"main":"src/cli/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"dd3b19c05393c758454cc47befeec60476fa44a1","scripts":{"dev":"node bin/cli.js","eval":"node --import ./tests/helpers/test-setup.mjs --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --import ./tests/helpers/test-setup.mjs --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"_nodeVersion":"22.23.2","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"tmp":"tmp/ettore-ai-assistant_1.9.0_1790098346048_0.2464946480658825","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"_id":"ettore-ai-assistant@1.10.0","bin":{"ettore":"bin/cli.js"},"bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"dist":{"shasum":"9d6d24dbb41653f73f7e49d78e02ed90c11f79d3","tarball":"https://registry.npmjs.org/ettore-ai-assistant/-/ettore-ai-assistant-1.10.0.tgz","fileCount":126,"integrity":"sha512-V6Hb14p60cUrJ5f2DQnj0FySvWKc1GrS2zZfcXGLqBWrwKqaKS1jsMUvaM5MYJgdQBAfm2RBb3bUZglACIshnw==","signatures":[{"sig":"MEUCIGfGHCC20cStoXhtteTq4InpOFvnvUSk7R3fkJyzZIutAiEAh9rGK3LfDeXMBcih7fecRjWgcxt1RdB9W/X/UyIECV8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBmKZDR7sDkYXI3SMsF/bhzw6vXVrMSURaTHeISdUXj0AiEAtP2Nsi1r7lLlQKUjk2kt/w+hbSLHbEaVCX0dhjjPpR8="}],"unpackedSize":2075620},"main":"src/cli/index.js","name":"ettore-ai-assistant","type":"module","author":{"name":"re77"},"engines":{"node":">=18.0.0"},"gitHead":"46b781ff49e152992e2c932f83ae9383e3fe161f","license":"MIT","scripts":{"dev":"node bin/cli.js","eval":"node --import ./tests/helpers/test-setup.mjs --test tests/agent-evals.test.js","lint":"eslint src tests","test":"node --import ./tests/helpers/test-setup.mjs --test","check":"npm test && npm run lint && npm run test:display","start":"node bin/cli.js","format":"eslint src tests --fix","lint:fix":"eslint src tests --fix","preinstall":"echo 'Installing ETTORE...'","postinstall":"echo 'ETTORE installed! Run: ettore'","test:display":"python3 test_display.py","release:check":"npm run check","prepublishOnly":"npm run release:check"},"version":"1.10.0","_npmUser":{"name":"re77","email":"ettore.berardi77@gmail.com"},"homepage":"https://github.com/Hberardi/ettore#readme","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"_npmVersion":"12.0.2","description":"ETTORE - Advanced AI CLI Assistant","directories":{},"maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"_nodeVersion":"22.23.3","dependencies":{"ora":"7.0.1","conf":"12.0.0","glob":"10.5.0","chalk":"5.6.2","openai":"4.104.0","commander":"12.1.0","@anthropic-ai/sdk":"0.21.1"},"preferGlobal":true,"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","globals":"^15.15.0"},"optionalDependencies":{"pg":"8.13.1","exceljs":"^4.4.0","pureimage":"0.4.13","better-sqlite3":"11.3.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ettore-ai-assistant_1.10.0_1790272512229_0.6825934431080738"}}},"time":{"created":"2026-06-29T17:38:07.582Z","modified":"2026-09-24T17:55:12.491Z","1.0.0":"2026-06-29T17:38:08.042Z","1.1.0":"2026-08-24T16:01:19.654Z","1.1.1":"2026-08-24T16:46:03.557Z","1.2.0":"2026-09-05T09:27:13.225Z","1.2.1":"2026-09-05T10:07:54.947Z","1.2.3":"2026-09-05T11:49:19.398Z","1.2.4":"2026-09-05T13:38:03.544Z","1.3.0":"2026-09-05T16:41:40.103Z","1.3.1":"2026-09-05T16:54:25.731Z","1.3.2":"2026-09-05T17:07:20.935Z","1.3.3":"2026-09-05T22:25:27.942Z","1.3.4":"2026-09-05T22:35:13.769Z","1.3.5":"2026-09-05T22:46:56.966Z","1.3.7":"2026-09-05T23:32:58.619Z","1.4.0":"2026-09-08T16:58:16.548Z","1.4.1":"2026-09-08T17:38:52.202Z","1.4.2":"2026-09-08T18:13:48.538Z","1.4.3":"2026-09-08T18:30:48.756Z","1.4.4":"2026-09-13T09:54:08.745Z","1.5.0":"2026-09-15T16:41:28.451Z","1.5.1":"2026-09-15T16:58:34.328Z","1.6.0":"2026-09-17T16:51:00.823Z","1.7.0":"2026-09-21T11:20:15.646Z","1.8.0":"2026-09-21T11:39:51.929Z","1.8.3":"2026-09-21T15:58:33.614Z","1.8.6":"2026-09-21T16:27:13.471Z","1.8.7":"2026-09-21T17:00:27.153Z","1.8.9":"2026-09-21T18:14:03.185Z","1.9.0":"2026-09-22T17:32:26.145Z","1.10.0":"2026-09-24T17:55:12.347Z"},"bugs":{"url":"https://github.com/Hberardi/ettore/issues"},"author":{"name":"re77"},"license":"MIT","homepage":"https://github.com/Hberardi/ettore#readme","keywords":["cli","ai","assistant","llm","ettore","openai","anthropic","claude"],"repository":{"url":"git+https://github.com/Hberardi/ettore.git","type":"git"},"description":"ETTORE - Advanced AI CLI Assistant","maintainers":[{"name":"re77","email":"ettore.berardi77@gmail.com"}],"readme":"# ETTORE - Advanced AI CLI Assistant\n\n<p align=\"center\">\n  <img src=\"https://img.shields.io/badge/version-1.10.0-blue\" alt=\"Version\">\n  <img src=\"https://img.shields.io/badge/node-18+-green\" alt=\"Node.js\">\n  <img src=\"https://img.shields.io/badge/license-MIT-orange\" alt=\"License\">\n  <img src=\"https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey\" alt=\"Platform\">\n</p>\n\nETTORE is an advanced AI CLI assistant that helps with software engineering tasks. It's like having a smart assistant in your terminal.\n\nWhat changed in each release is in the [changelog](https://github.com/Hberardi/ettore/blob/main/CHANGELOG.md), which ships with the package as `CHANGELOG.md`.\n\n## Features\n\n- 🤖 **32 providers** - OpenAI, Anthropic, your Claude subscription, Gemini, Ollama (local), NVIDIA, Groq, DeepSeek, MiniMax, Kimi, OpenRouter — and any OpenAI-compatible endpoint\n- 💻 **Tool Execution** - bash, read, write, edit, grep, glob, web search, web fetch, image inspection, delegated codebase search\n- ✅ **Done means the tests pass** - when the agent changes code it runs your project's full test suite before handing the work back; a red suite goes back to the agent to fix, and it never reports \"done\" over failing tests ([details](#done-means-the-tests-pass))\n- 🖱️ **Runs your apps** - opens web apps in a real browser (reads the browser console: errors, exceptions, failed requests) and launches desktop apps (captures stdout/stderr, screenshots, clicks and types) to reproduce bugs before fixing them\n- 🎨 **Native TUI** - Custom ANSI renderer (no React/Ink) with themes and a sidebar that grows with the terminal (`/sidebar auto|wide|narrow|<n>`)\n- 🖼️ **Vision** - Reads local images; agent can discover, download, and inspect public web images\n- 📄 **Super OCR for PDF** - Extracts native text first, then automatically handles scanned and low-quality PDFs with preprocessing, deskew, denoise, adaptive thresholding, and multi-pass Tesseract OCR\n- 🪟 **Linux, macOS and Windows** - shell commands, code search and file edits work natively on each; on Windows the `bash` tool keeps PowerShell warm instead of starting it per command; see [Platform support](#platform-support)\n- 🔌 **Easy Setup** - `/connect <provider> <key>` or environment variables\n- 💾 **Persistent Config** - API keys saved in a per-user config directory, `0600` on Linux/macOS ([details](#configuration))\n- 🧠 **Context Tools** - compression, project memory, working memory, sessions, auto-approve\n- ⚡ **Fast on every provider** - requests are shaped so the provider can reuse its prompt cache, context summaries are written by a fast model of the same provider, and `--verbose-tokens` reports time-to-first-token and cached tokens per call\n- 🔍 **Delegated search** - `explore` answers one question about the codebase in a separate read-only context and returns a short report with `file:line` references; the greps and full-file reads behind it never enter the main conversation\n- 📋 **Explicit Planning** - non-trivial tasks get a structured `<plan>...</plan>` block on the first turn, and its steps drive the progress panel and the auto-continue, so a plan left half-done is resumed instead of dropped\n- ⚖️ **Optional judgment layer** - with a [TypeSafe](https://docs.typesafe.ai/introduction) key, Jev reads each request before the turn (asks you first when it is ambiguous, plans only when the work needs it, picks the tools and the reasoning effort the turn will actually use, and runs the `explore` sub-agent — several in parallel for independent parts — when a codebase-wide search is needed), watches the turn while it runs and steps in when it goes round in circles, keeps what the context compression was about to throw away, asks before risky shell commands the regex does not know, and judges each finished turn — one line per turn in the chat; off by default, `/jev active <key>` to enable ([details](#jev--an-optional-judgment-layer-typesafe))\n- 🧩 **Nine plugins included** - PostgreSQL, Excel, EDI over FTP, extended git, shell history, palette shortcuts, and a security-tool wrapper for authorised testing (`kali`) — installed with `/plugins install`, and you can write your own\n\n## Installation\n\n### Option 1: npm (recommended)\n\n```bash\n# Install globally\nnpm install -g ettore-ai-assistant\n\n# Verify installation\nettore --version\n```\n\nThe package is published as `ettore-ai-assistant`; the command it installs is\n`ettore`. (`npm install -g ettore` fetches an unrelated package by another\nauthor.)\n\n### Option 2: From source\n\n```bash\n# Clone or download\ncd ettore-cli\n\n# Linux / macOS\nchmod +x install.sh\n./install.sh\n```\n\nOn Windows, install from the checkout with npm instead — `install.sh` needs a\nPOSIX shell:\n\n```powershell\nnpm install -g .\n```\n\n> Paths written as `~/.config/ettore/…` below are the Linux and macOS form. On\n> Windows the same directory is `C:\\Users\\<you>\\.config\\ettore\\…`.\n\n## Platform support\n\nETTORE runs on Linux, macOS and Windows. The differences are handled for you,\nbut two of them are worth knowing about.\n\n### The shell the agent uses\n\nThe `bash` and `bash_session` tools run commands through the platform's shell:\n**bash** on Linux and macOS, **PowerShell** on Windows. The model is told which\none it has, so it writes `Select-String` rather than `grep` and `;` rather than\n`&&` when it is on Windows.\n\nPowerShell is preferred over Git Bash even when Git Bash is installed: a `bash`\nfound on a Windows `PATH` is often WSL's, and that one cannot see `C:\\…` the\nway the caller means. To override:\n\n```bash\n# Use Git Bash instead (must be on PATH)\nset ETTORE_SHELL=bash        # cmd\n$env:ETTORE_SHELL = 'bash'   # PowerShell\n```\n\nAccepted values: `bash`, `pwsh`, `powershell`, `cmd`, or a path to a shell.\n\nOn Windows the `bash` tool keeps up to three PowerShells warm instead of\nstarting one per command, which is most of what a command used to cost. Each\ncall still behaves like a fresh process — its own working directory and\nvariables, `$env:` changes undone, stdin closed. `ETTORE_WARM_SHELL=0` goes\nback to one PowerShell per command.\n\n### Running it from a terminal that works\n\nGit Bash and other MSYS terminals (mintty) do not give Node a real console\nhandle, so the TUI cannot start there and says so. Use **Windows Terminal**,\n**PowerShell** or **cmd** — or stay in Git Bash and prefix the command:\n\n```bash\nwinpty ettore\n```\n\n### What is not needed\n\nCode search works without `ripgrep` or `grep` installed — there is a built-in\nsearcher underneath both, so `grep` and `repo_find_symbol` work on a bare\nWindows box. Line endings are handled on both sides: editing a file checked out\nwith CRLF keeps it CRLF, so a two-line change stays a two-line diff.\n\nDesktop automation is platform-aware too: on Windows it drives the GUI through\nPowerShell (nothing to install), on Linux it needs `xdotool` or `ydotool` — see\n[Requirements](#requirements).\n\n## Tuning how hard the model thinks\n\nTwo settings decide how much room a turn gets. Both are optional, and both do\nnothing on a model that does not support them. Set `effort` from the CLI with\n`/config effort <level>` (add `--local` for this project only), or write either\nof them into `.ettore/config.json` by hand:\n\n```jsonc\n{\n  \"effort\": \"xhigh\",   // low | medium | high | xhigh | max\n  \"maxTokens\": 32768   // ceiling on one turn's output\n}\n```\n\n`effort` is unset by default, which means the API's own default. Raising it\nbuys depth on hard coding and agentic work and is paid in tokens — on a\nsubscription, in quota — so it is worth measuring on your own workload before\nmaking it permanent. Lowering it to `low` is the cheaper direction and often\ncosts nothing on routine turns. Plan mode already runs a step lower than build\nmode: it reads and reasons but writes nothing, so it is the one place a lower\nsetting is a saving rather than a trade. Context compression always runs at\n`low` — it is summarisation, and an extra call on top of the turn that\ntriggered it.\n\n`effort` reaches more than Claude: it is sent as `reasoning_effort` to OpenAI\no-series and GPT-5, to gpt-oss wherever it is hosted, and to Gemini 2.5+, and\nas OpenRouter's `reasoning` field for the same models routed through it. It is\ndeliberately not sent to hybrid models, where any effort at all switches\nthinking *on* and would make a `low` request slower than no setting at all. An\nendpoint that refuses the field gets the request again without it.\n\n`maxTokens` is a stop, not a target: you are billed for what the model writes,\nnot for the room it was given. It matters because on a model with adaptive\nthinking the budget covers reasoning *and* the answer, so a ceiling tuned for\nanswers alone cuts the thinking off first. ETTORE now resolves it per model —\nroom to think where the model allows it, and a clamp where it does not, since\nasking Claude 3 for 8192 is a rejected request rather than a longer answer.\n\n## Staying up to date\n\nAt startup ETTORE asks npm whether a newer release exists and tells you when\nthere is one:\n\n```\n↻ A new version of ETTORE is available: 1.3.0 → 1.3.1. Run `ettore update` to upgrade.\n```\n\nThe answer is cached in `~/.config/ettore/version-cache.json`. A known newer\nversion is kept for six hours, since re-asking about it changes nothing; \"there\nis nothing newer\" is kept for thirty, because that is the answer a release\nmakes wrong the moment it is published. `ettore update` never reads the cache\nat all, so it takes a release as soon as it lands.\n\nETTORE then installs it and restarts into the new build before running your\ncommand, so an install stays current without being told to:\n\n```\nettore 1.2.3\n↻ ETTORE 1.2.3 → 1.2.4: installing…\n✓ 1.2.4 installed — restarting\nettore 1.2.4\n```\n\n`ettore update` does the same thing on demand, and `--no-update-check` skips\nthe npm call altogether.\n\nThe install is skipped — and ETTORE tells you about the new version instead —\nwhen:\n\n- the new release is a **new major version**. A major bump is a declared breaking change, so it is taken deliberately with `ettore update`, never on a launch.\n- stdout is not a terminal: a pipe, a script, a CI job. Nothing is installed behind your back.\n- you passed `--no-auto-update`, or set `ETTORE_AUTO_UPDATE=0`. The flag outranks the environment, so a scripted run can refuse what a shell profile enabled.\n- you are running a git checkout **with uncommitted work, or on a branch that tracks no remote**. A checkout is never updated through npm — that would replace your link with a registry copy — so it is fast-forwarded with git instead (below).\n\n### A git checkout updates itself too\n\nA development checkout used to have no automatic path at all: npm was refused,\ncorrectly, and nothing took its place, so a linked install quietly stayed on\nwhatever commit it was on. It now takes the update that actually fits it —\n`git pull --ff-only` — before anything else loads, then restarts into it:\n\n```\nettore 1.3.6\n↻ checkout fast-forwarded — restarting\nettore 1.3.7\n```\n\nOnly when it is safe: a **clean** tree, on a branch that **tracks a remote**,\nand **fast-forward only**, so no local commit can be lost and nothing is ever\npulled over work in progress. Untracked files don't count — a working\ndirectory always has some. The pull is bounded (6s at startup, 12s on Windows),\nso an unreachable remote costs a pause, not a hang, and `--no-auto-update` /\n`ETTORE_AUTO_UPDATE=0` turn it off like everything else.\n\nIf the release you are running has been **deprecated** on npm, ETTORE says so\nat startup, quoting the publisher's own message:\n\n```\n⚠ ETTORE 1.2.3 is deprecated: <the message the publisher set>\n```\n\nnpm itself only shows that during an install, so a copy that was installed\nonce and never reinstalled would otherwise never hear about it.\n\n## Quick Start\n\n```bash\n# Start interactive mode\nettore\n\n# Or run a single prompt\nettore \"Hello, create a hello world in Python\"\n\n# Analyze an image (repeat --image to attach up to four images)\nettore --image ./screenshot.png \"Find the UI problem in this screenshot\"\n\n# Let the agent fetch and inspect a public image URL\nettore \"Analyze the image at https://example.com/screenshot.png\"\n```\n\nIn the interactive TUI, attach a local image with `@path/to/image.png`. Quote paths\nthat contain spaces, for example `@\"screenshots/home page.png\"`. JPEG, PNG, GIF,\nand WebP files up to 5 MiB are supported; the selected model must support vision.\nFor web pages, the agent can discover image URLs with `webfetch` and inspect them\nthrough its protected `web_image` tool. Redirects and resolved addresses are\nvalidated to block private-network access.\n\n## Commands\n\nRun `/help` inside the TUI for the full list. Most-used commands:\n\nIn the interactive CLI, press `Ctrl+O` or use the visible `📎 attach` control to\nadd local files and images to the next message. Images are sent multimodally;\ndocuments, audio, video, and other files are passed to the agent with their\nlocal path so it can choose the appropriate reader tool.\n\nFor Super OCR, install `tesseract-ocr` with the language packs you need (ETTORE\nautomatically uses `ita+eng` when both are available), plus Poppler's\n`pdftotext`, `pdftoppm`, and `pdfinfo` commands. If OCR dependencies are not\ninstalled, ETTORE keeps its native PDF and binary-text fallbacks.\n\n| Command | Description |\n|---------|-------------|\n| `/connect <provider> [key]` | Connect a provider (`openai`, `anthropic`, `claude-code`, `ollama`, `openai-compat`, `minimax`, ...) |\n| `/use [provider] [model]` | List connections, then set the active provider/model |\n| `/disconnect [provider]` | Drop a saved connection |\n| `/providers` | List supported providers and their default models |\n| `/models [provider] [refresh\\|stale]` | List models (with cache control) |\n| `/status` | Show active provider, model, and config |\n| `/doctor` | Diagnose setup, config, providers, and permissions |\n| `/keys list\\|add\\|remove` | Manage saved API keys |\n| `/reconnect [provider]` | Re-validate saved keys and reconnect |\n| `/theme <name>` | Switch theme (`default`, `midnight`, `matrix`, `forest`) |\n| `/sidebar [auto\\|wide\\|narrow\\|<n>]` | Width of the right panel: `auto` follows the terminal (about a third of it), `wide` nearly half, `narrow` the old 32 columns, or exactly `n` columns. Saved across sessions. |\n| `/auto-approve [edits\\|installs] on\\|off` | Skip approval prompts (sensitive commands still prompt) |\n| `/config [key] [value] [--local]` | Show/set configuration; `--local` writes `.ettore/config.json` |\n| `/config max-iterations <1-200> [--local]` | Set the agent loop budget (default: 50) |\n| `/config max-tools <4-28> [--local]` | How many tool schemas reach the model per turn (default: 20) |\n| `/config tool-routing on\\|off [--local]` | Route a relevant subset per turn, or hand over every tool |\n| `/config effort <low\\|medium\\|high\\|xhigh\\|max\\|default>` | How hard the model thinks, on models that accept it |\n| `/memory show\\|add\\|clear\\|edit\\|export\\|path` | Persistent project memory |\n| `/ecosystem show\\|prune\\|export\\|path` | Learned playbook memory, reused across turns |\n| `/skills list\\|show\\|create\\|reload` | Global skills with automatic prompt activation |\n| `/mission [status\\|history\\|clear]` | Live execution graph: plan, waves, tools, files, tokens |\n| `/compress [preview\\|apply\\|auto\\|stats\\|threshold\\|history\\|undo]` | Manage context compression |\n| `/compress model <id\\|default\\|main>` | Which model writes context summaries (default: a fast one from the same provider) |\n| `/agent [stats\\|memory\\|clear]` | Inspect agent runtime memory |\n| `/caveman [level\\|off]` | Toggle compressed reply style (saves tokens) |\n| `/approvals [list\\|clear] [project\\|system\\|download]` | Inspect or reset session approvals |\n| `/sessions` / `/resume` / `/new` | Session management |\n| `/history [n]` | Show recent commands |\n| `/alias list` | Show command aliases |\n| `/team [create\\|list\\|show\\|delete] [name]` | Multi-agent team orchestration |\n| `/loop [start <goal>\\|stop\\|status\\|list\\|run\\|clear]` | Run a goal repeatedly until it is done |\n| `/video_music` | Open the music-video web studio (mp3 + photo → video) |\n| `/plugins [list\\|available\\|install\\|enable\\|disable\\|reload\\|info] [name]` | Manage plugins; `install` with no name offers a picker |\n| `/select [provider]` | Pick a model interactively |\n| `/system` | Platform and runtime info |\n| `/init` | Reload project memory and reset the conversation |\n| `/version` | Show ETTORE version |\n| `/help [command]` | Show help for a specific command |\n| `/clear` | Clear the screen |\n| `/exit` | Exit interactive mode |\n\n## Global Skills\n\nSkills are Markdown playbooks. They add focused instructions to the agent when\na prompt matches their description or triggers; they do not load or execute\nJavaScript. Skills created through the web wizard are global and live in\n`~/.config/ettore/skills/<name>/SKILL.md`, so they can be used in every project.\n\n```bash\n# in the TUI\n/skills list\n/skills create\n/skills show api-review\n/skills reload\n```\n\n`/skills create` opens ETTORE Skill Studio in the browser. The form asks for\nthe skill name, the workflow it should follow, and the final output format.\n\nEach `SKILL.md` can use this frontmatter:\n\n```markdown\n---\nname: api-review\ndescription: Review REST API endpoints and contracts\ntriggers: endpoint, openapi, contract\nenabled: true\n---\n\nCheck validation, compatibility, and focused regression tests.\n```\n\n`triggers` are worth writing, and worth writing in the language you type your\nprompts in. They are matched as substrings and weigh more than anything\ninferred from the description, so they are what makes a skill fire reliably; a\nskill with none depends on your prompt happening to reuse the words of its\ndescription. A skill named in English will not match an Italian prompt on its\nname alone.\n\nETTORE activates at most three matching skills per turn and keeps the base\nsafety rules and tool permissions higher priority than skill instructions. The\nsidebar names the skills a prompt activated, or says `none of N` — a turn that\nran without the guidance you expected otherwise looks exactly like one that ran\nwith it.\n\n## Mission Control\n\nMission Control tracks the current task directly in the TUI sidebar: plan\nprogress, parallel tool waves, changed files, decisions, and token usage.\n\n```bash\n/mission\n/mission history\n/mission clear\n```\n\n## Delegating a search\n\nFinding an answer in a large codebase is cheap; what it leaves behind is not.\nTwenty grep hits and six full file reads stay in the transcript for the rest of\nthe session, are re-sent on every turn, and are the first thing the context\ncompressor discards — so by the time the edit gets written, the context is full\nof the search and short of the code.\n\n`explore` moves that somewhere else. The agent hands it one question; it\ninvestigates in a throwaway read-only context of its own and returns a short\nreport with `file:line` references. None of the searching reaches the main\nconversation — only the answer does, and the report says so, so the agent opens\nthe files it cites before editing them rather than trusting evidence it never\nsaw.\n\nIt is for questions like *where is X implemented and who calls it*, *how does\nthe Y flow work end to end*, *which files would a Z change touch* — not for\nsomething a single read of a path you already know would settle. It runs in plan\nmode, so it cannot write, run commands or install anything; it cannot delegate\nagain; and it is bounded at twelve iterations and eight minutes.\n\nYou still see it working: the sub-agent's own `repo_map`, `grep` and `read`\ncalls scroll past in the running-tool display like any others, while the\n`explore` call that started them stays open.\n\n## Done means the tests pass\n\nAn agent that says \"done\" over a failing test suite is worse than one that does\nnothing: you find out later, somewhere else. So when a turn in build mode\nchanges code, ETTORE does not let it end until the project's **full test suite\npasses on the final code**.\n\n1. The agent changes the code and is told to run the suite before finishing.\n2. If it tries to finish without a green run on its latest edit, ETTORE runs the\n   suite itself — you see `run_tests` in the running-tool display.\n3. If any test fails, the failures go back to the agent as work still to do:\n   find the cause, fix the code (not the test, unless the task changed that\n   behaviour on purpose), run the suite again.\n4. Only a green suite releases the answer: `✓ Test verdi`.\n\nIt counts only what really verifies the current code:\n\n- **The whole suite.** A narrowed run — `pytest tests/test_x.py`, `-k`,\n  `--grep` — is useful while working but does not release the code, because it\n  cannot catch a regression somewhere else.\n- **After the last edit.** Any change after a green run needs a new run.\n- **The real result.** A failing run is a failure even when the exit code is\n  hidden by a pipe (`npm test | tail`): the output is read too.\n\nAfter five fix-and-rerun rounds the turn ends anyway, but the answer says so\nplainly — *⚠️ Codice NON verificato: la suite di test è ancora rossa* — instead of\nclaiming success. Change the number of rounds in `.ettore/config.json`:\n\n```json\n{ \"maxReleaseGateRetries\": 8 }\n```\n\n| Project | What has to pass |\n|---|---|\n| `package.json` with a `test` script | `npm test` |\n| `pytest.ini`, `conftest.py`, or pytest in `pyproject.toml` | `pytest` |\n| `go.mod` | `go test ./...` |\n| `Cargo.toml` | `cargo test` |\n| No test suite | at least one check since the last edit — `node --check`, `py_compile`, running the program |\n| Only docs or images changed | nothing |\n\nIf your suite is already red before the agent starts, every turn that changes\ncode will end with the warning: fix or skip those tests first.\n\n### The agent sees the code it is fixing\n\nA fix is only as good as what the model can see. Three things make sure it\nsees it:\n\n- **Reads arrive whole.** A `read` of a normal-sized range reaches the model\n  complete. A very large one is cut only at the end, with the exact `offset` to\n  continue from — never with a silent hole in the middle.\n- **The working set is not forgotten.** In a long session, old tool output is\n  shortened to save tokens, but the latest read of each file being worked on and\n  the latest failing test output stay whole.\n- **Test failures keep their tail**, where runners print the failing test and\n  the summary.\n\nAnd `edit` helps when it misses: a block copied with the wrong indentation still\napplies, \"not found\" quotes the closest region of the file with line numbers,\nand a successful edit shows the changed lines.\n\n### When a turn runs out of tool calls\n\nA single turn may make up to 80 tool calls. When a big job reaches that, the\nturn is not thrown away: the agent gets one last step without tools to report\nwhat it did, and the turn ends with what was done, which files changed, and\nwhat to do next. If the provider ignores that and asks for another tool\nanyway, the turn still closes the same way rather than on an error.\n\nThe advice depends on the cause. When one call has taken a real share of the\nturn — the same command over and over — it is a loop, and the answer names\nthe call and says a bigger budget would only make it longer. Otherwise the job\nis simply large: type `continua` to pick up where it stopped, split it, or give\nthe project more room in `.ettore/config.json`:\n\n```json\n{ \"maxToolCallsPerTurn\": 160 }\n```\n\n## Jev — an optional judgment layer (TypeSafe)\n\n[Jev](https://docs.typesafe.ai/introduction) is TypeSafe's System One model. It\ndoes not generate text: it evaluates typed questions against a state and returns\nstructured answers with calibrated probabilities — a yes/no with its\nprobability, a choice from a list you define, a score on a rubric you define.\n\nETTORE uses it for the judgments the harness has to make about a turn, which\nuntil now were regexes over Italian and English phrasing. Wording is a proxy for\nmeaning, and both errors cost: a false yes re-prompts a model that was already\nfinished, a false no ends a turn with the job half done.\n\n**Jev is off unless you turn it on, and nothing about ETTORE changes while it is\noff.** You need a TypeSafe API key; it is a paid service, billed per input token.\n\n### Turning it on and off\n\n| Command | What it does |\n| --- | --- |\n| `/jev active <api key>` | Turns Jev on and saves the key, encrypted. Get a key at [console.typesafe.ai/keys](https://console.typesafe.ai/keys). |\n| `/jev active` | Turns it back on with the key already saved — no need to retype it. |\n| `/jev out` | Turns it off. The key stays saved. |\n| `/jev out forget` | Turns it off **and** deletes the saved key. |\n| `/jev status` | Whether it is on, which model, and the traffic so far this session. |\n| `/jev test` | Makes one real call and reports the round trip. |\n\n`/typesafe` is an alias for the same command.\n\nThe key can also come from the environment, which is what a script, a sandbox,\nor an already-running session needs:\n\n```bash\nexport TYPESAFE_API_KEY=your-key\n```\n\nExporting it is enough on its own — no command required. An explicit `/jev out`\nstill wins over the variable, so turning Jev off never means hunting down where\nthe export lives.\n\nWhile Jev is on, the sidebar carries a `jev on` row with the last call's\nlatency.\n\n### What it does\n\n**1. It judges every finished build turn.** Four yes/no questions, asked in a\nsingle request and evaluated in parallel: did the model announce work without\ndoing it, hand the remaining work back to you, show code instead of writing it\nto a file — and was the request actually carried out? Each answer either\nconfirms or overrides the regex ETTORE would have used alone. Every judged turn\ngets one line, including the ones where Jev only agrees — a judgment layer that\nspeaks only when it overrules looks absent most of the time:\n\n```\n◆ Jev (814ms) — completata: no (0.12) · lavoro annunciato ma non fatto (0.91) · approccio: diretto 0.88\n```\n\n**2. It lets a turn continue without a declared plan.** Auto-continue normally\nneeds a `<todo>` list, and a model that writes \"task completo\" suppresses it, so\nrestarting a half-finished turn fell to you. Measured on real sessions, 56% of\nthe prompts sent were restarts rather than requests — the same sentence typed 28\ntimes. When Jev is sure the request has not been carried out and the turn\nactually ran tools, ETTORE continues by itself: at most three rounds, stopping\nthe moment a round changes nothing. A turn that ran no tools is never pushed —\nanswering a question is not unfinished work.\n\n**3. It picks the skills that actually apply.** Skill activation scores words\n— stems, exact hits, thresholds — so `funziona` matches `funzionale` and \"questo\nnon funziona\" could wake a web-design skill. Jev reads the request against each\nskill's description instead. A decisive answer wins in both directions: it adds\na skill the words missed and drops one they matched by coincidence. You see it\nwhen it differs:\n\n```\n◆ Jev (210ms) — skill: +debug · −web-design\n```\n\n**4. It explores before the first step.** ETTORE has a read-only sub-agent\n(the `explore` tool) that answers one question about the codebase in a context\nof its own and returns a short report, so the greps and reads behind it never\nfill the main conversation. Offered as a tool, models still searched by hand.\nWhen Jev is confident a request needs a codebase-wide search, ETTORE runs the\nsub-agent itself, before the main model's first step, and the turn opens with\nits report. If the sub-agent comes back empty, the turn falls back to a nudge.\n\n```\n◆ Jev (240ms) — ricerca estesa: lancio explore prima di iniziare (confidenza 0.88)\n```\n\n**5. It reads the request before anything happens.** In the same call:\n\n- *ambiguous* — the request cannot be carried out without something only you\n  can supply. The model asks you one question (`ask_user`) before touching\n  anything, and nothing is explored for a request not yet understood.\n- *several steps* — the planning reminder the word heuristics missed is added,\n  so the turn starts from a plan. Not when planning is switched off.\n- *no code needed* — a concept question or a chat message is answered directly\n  instead of opening with a tour of the codebase.\n\n**6. It decides what the turn costs.** Three choices that used to be made by\nword matching, in the same pre-turn call:\n\n- *Which tools the model is handed.* The router picks tool families with\n  regular expressions over the request, so \"foto\" reaches for the web tools and\n  \"app\" for the runtime ones — padding every request with schemas the turn\n  never uses, and sometimes leaving out the one it needed. Jev reads what the\n  request is for, and a decisive answer adds or removes a family. A turn that\n  has already edited keeps its edit tools regardless: what happened outranks a\n  prediction.\n- *How much thinking to buy.* A trivial request runs at low effort, a hard one\n  at high. An effort you set yourself always wins.\n- *Whether the plan is worth a round trip.* The heuristic asks for a `<plan>`\n  by length and trigger words, so a one-line rename buys a whole planning turn.\n  Jev drops the reminder when the work is trivial, and adds one when the work\n  is hard and the words did not notice.\n\n**7. It explores independent parts at the same time.** When the request names\nseveral files and Jev is sure what is found about one does not change what has\nto be found about another, up to three explore sub-agents run together instead\nof in sequence, and the turn opens with one report per part.\n\n**8. It says what to keep when the context is compressed.** Older tool results\nare cut to a one-line stump by age and shape, and the wrong cut is paid twice —\nin the tokens spent fetching it again, and in the step the user waits through.\nJev is asked about the handful of results actually about to be cut, against the\ngoal of the turn; a decisive \"still needed\" keeps one whole. Each result is\njudged at most once, and only once a batch has piled up.\n\n**9. It watches the turn while it runs.** Every eight tool calls, after two\nbatches that all failed, or when one call keeps coming back, Jev is shown the\nlast ten calls and asked whether the agent is going round in circles, stuck on\nthe same error, or working on something the request did not ask for. The first\ntime it is sure, the model is told to change course; if it is still circling\nafter that, the tools are taken away and the turn closes with what it has.\n\n```\n◆ Jev (380ms) — dopo 9 tool l'agente gira a vuoto: gli chiedo di cambiare strada\n```\n\n**10. It reads shell commands before they run.** The `bash` tools already ask\nbefore `rm -rf`, `git push --force`, `sudo` and the other spellings a regex\nknows. Jev reads what a command would *do*, so `Remove-Item -Recurse -Force`,\n`find … -delete`, `curl … | sh` or `> config.json` get the same question. It\ncan only add a confirmation, never remove one, and commands that plainly only\nread — `ls`, `git status`, `Get-Content`, a test run — are never sent.\n\nDecisions 3 to 7 are made before the first token, and they travel in a single\nrequest — Jev evaluates every question in parallel against one state, so asking\nabout the approach, the request, seven tool families and six skills costs one\nround trip. The pre-turn call runs only for a fresh, non-trivial build request —\nnever for a continuation, a short message, or a lite model.\n\nItems 2 to 10 exist only with Jev on. They are reached through a decisive\nverdict, and there is no verdict when Jev is off, unreachable or unsure.\n\n### Checking it is really working\n\nA label in the sidebar proves nothing, so `/jev status` reports the traffic:\n\n```\nJev: on — model jev-latest, key apik...d2ed.\n\nCalls this session: 3 ok, 0 failed.\nAnswered by: jev-1.13.0 (reported by the server, not by ETTORE).\nLast call: 814ms at 11:28:44.\nTokens billed: 1184 in, 62 out.\n```\n\nThe model id and the token counts come back from the API — ETTORE cannot print\nthem without having made the call. You asked for `jev-latest`, an alias; the\nserver answered with the version it resolved to. For a check that does not rely\non ETTORE at all, watch the request counter in the TypeSafe console.\n\nAsking the agent whether Jev is on does not work, and that is deliberate: Jev is\npart of the harness, not the model's context. A model told it is being judged on\nwhether it announced work without doing it can learn to word its way around the\ncheck instead of doing the work.\n\n### Why it is safe to leave on\n\n- **Jev decides, it never writes.** No text of its own ever reaches you or the\n  transcript. It answers yes/no questions; what happens next is ETTORE's.\n- **It can make a turn cheaper, never less safe.** Where speed is the point —\n  the plan, the tool list, the effort, what survives compression — a decisive\n  verdict may also *remove* what a heuristic added. Confirmations are the\n  exception and stay one-way: Jev can add one, never take one away.\n- **It only acts when it is sure.** An answer near the middle — the model saying\n  \"could go either way\" — is discarded, and the check ETTORE already had stands.\n- **Failure changes nothing.** No key, no network, a rate limit, a timeout: the\n  turn proceeds on exactly the checks it used before, and one line tells you Jev\n  was unreachable.\n- **The key is stored like a provider key** — encrypted in the config directory,\n  never written in plaintext and never echoed back in full.\n\n## Plugins\n\nETTORE ships nine plugins and can load your own. A plugin adds **tools** the\nagent can call and **slash commands** you can type — they merge with the\nbuilt-in set rather than replacing it.\n\n```bash\n# in the TUI\n/plugins available             # what is installed, and what ships with ETTORE\n/plugins install               # pick one from a list; installed and enabled\n/plugins install pgadmin       # or name it outright\n/plugins list                  # what is enabled right now\n/plugins info pgadmin          # what it adds\n/plugins disable pgadmin\n```\n\n### What ships\n\n| Plugin | Adds | Needs |\n|---|---|---|\n| **pgadmin** | PostgreSQL from the terminal: list and describe databases, schemas, tables, views, indexes, constraints and functions; run queries; `EXPLAIN`/`ANALYZE`; `pg_dump` and `pg_restore`, the latter through a local web wizard | `pg` |\n| **excel-full** | Read, create and edit `.xlsx`: formulas, cell styles, number formats, sheet management, charts, one-page reports | `exceljs`, `pureimage` |\n| **edi-ftp** | EDI files over FTP, FTPS or SFTP: list a remote directory, fetch or peek a file, inspect an undocumented tracciato, and parse fixed-width, delimited or EDIFACT/X12 into records — with a saved layout or with the structure inferred. Connection profiles are stored locally, password encrypted at rest | — for FTP/FTPS; `ssh2`, installed separately, for SFTP |\n| **git-helpers** | Beyond the built-in `git_status` / `git_diff`: blame, log, diff stat, branch audit | — |\n| **git-history** | Read-only history: commit log, line-range blame grouped by change, single-commit inspection | — |\n| **bash-monitor** | Times every shell command, warns on slow ones, keeps a queryable history | — |\n| **command-palette-shortcuts** | `/last-bash`, `/kill-bash`, `/replay-last`, `/where` | — |\n| **hello-world** | The minimal shape of a plugin, to copy from | — |\n| **kali** | Drives installed security tools (nmap, whatweb, nikto, gobuster, dnsrecon, sslscan) for **authorised testing only** — every scan is refused against a host outside an explicit, session-only authorisation scope. Installs nothing; wraps tools you install yourself | the tools themselves, installed separately |\n\nThe dependencies are declared as `optionalDependencies`, so a normal\n`npm install` brings them and a plugin whose dependency is missing says which\none rather than failing obscurely.\n\n### You can see when a plugin is running\n\nA tool from a plugin is marked wherever tools are shown — the running-tool\nline, the sidebar, the one-shot output, and the `/mission` summary:\n\n```\n○ pg_query ⧉pgadmin [2s]\n✔ git_log ⧉git-helpers\n✔ read\n```\n\nA built-in gets no badge. Running code you installed yourself is worth seeing,\nand it is what tells you which tool to blame when something misbehaves.\n\n### Which tools reach the model\n\nThe agent is offered a bounded set of tools each turn — 20 by default, out of\nnearly forty. What the prompt asks for decides the **order**; it does not decide\nwhat exists. Whatever the prompt looks like, the agent always has the tools to\nfind code, change it, and run something; whatever slots are left over are filled\nwith the tools whose absence hurts most, and only the priced or narrowly\nspecialised ones (music-video generation, desktop automation) wait to be asked\nfor by name.\n\nThat distinction matters more than it sounds. Asked \"controlla se il progetto\ncompila\", an agent routed purely by keyword gets no shell, no `run_checks` and\nno `run_tests` — and answers by reading the source and guessing, confidently.\n\nPlugin tools take a guaranteed share of the set and are ranked by how well their\nname and description match the request, so asking about a database restore\nsurfaces `pg_restore_wizard` rather than whichever plugin happened to load first\n— and the core toolset is never crowded out.\n\nPlan mode is read-only, and that is enforced by the router, not by the prompt:\nnothing that writes, runs a command or launches a process is offered there. Since\nETTORE cannot inspect what a plugin's handler does, a plugin tool is offered in\nplan mode only if it declares `risk: 'low'`, which is the author stating that it\ndoes not write.\n\nRaise or lower the budget with `/config max-tools <4-28>` (add `--local` to\nkeep it to this project), or set `\"maxToolsPerRequest\"` in\n`.ettore/config.json` directly. `/config tool-routing off` hands the model\nevery tool instead.\n\n### Writing one\n\nA plugin is a directory under `~/.config/ettore/plugins/<name>/` (override with\n`ETTORE_PLUGINS_DIR`) containing:\n\n1. **`plugin.json`** — the manifest: `name`, `version`, `apiVersion`, `main`,\n   optional `description` / `author` / `license` / `permissions`.\n2. **`<main>`** (default `index.js`) — an ES module exporting `tools`,\n   `commands`, and `hooks` (`onLoad`, `onUnload`).\n\n```js\nexport const tools = {\n  say_hello: {\n    description: 'Greet someone by name.',\n    risk: 'low',                       // admits it to plan mode\n    parameters: {\n      type: 'object',\n      properties: { name: { type: 'string' } },\n      required: ['name'],\n      additionalProperties: false,\n    },\n    handler: async ({ name }, ctx) => `Hello, ${name} — from ${ctx.plugin}.`,\n  },\n};\n```\n\nIt is an ES module: use `import`, and `createRequire(import.meta.url)` if you\nneed to reach an optional dependency. Handlers receive a controlled `ctx`\n(`{ plugin, tool, signal, workspace, agentMode, safetyProfile }`) and never see\nthe agent's internals. `examples/plugins/README.md` has the full guide and the\nreserved tool names a plugin cannot override.\n\n**A plugin runs with your privileges.** The `permissions` in the manifest state\nintent; they are not a sandbox. Enabling a plugin is the moment you decide to\nrun its code, so read one you did not write, as you would any script.\n\nAn installed plugin is a copy: the one under `~/.config/ettore/plugins/` is what\nruns, and it does not change when a new ETTORE ships a newer version of it.\n`/plugins available` says which copies have fallen behind, and\n`/plugins install <name> --force` updates one.\n\n## Examples\n\n```bash\n# Start interactive mode\nettore\n\n# Run a single prompt\nettore \"Hello, create a hello world in Python\"\n\n# Connect a provider (API key optional for Ollama)\nettore /connect openai sk-...\nettore /connect anthropic sk-ant-...\nettore /connect ollama                # local, no key\nettore /connect claude-code           # Claude subscription, no key\n\n# Select active model\nettore /use openai gpt-4o\nettore /use openai gpt-5.6-luna       # fast, cost-efficient OpenAI model\n\n# One-shot with image and provider\nettore --provider openai --image ./screenshot.png \"Find the UI problem in this screenshot\"\n```\n\n## Debugging a running application\n\nETTORE does not have to guess from the source why an app misbehaves — it can\nopen the app and watch it break.\n\n**Web apps** — `browser_app` drives a real Chrome/Chromium over the DevTools\nProtocol and keeps every console message, uncaught exception, failed request\nand HTTP 4xx/5xx in a buffer:\n\n```\nopen a browser on http://localhost:3000, click \"Salva\" and tell me what the console says\n```\n\nThe agent runs `browser_app` `open` → `snapshot` → `click`/`type` →\n`console`/`errors`/`network`, fixes the code, then `reload`s and re-reads the\nconsole. Every click and keystroke already reports the console errors it just\ncaused. `localhost` is allowed (unlike `browser_check`, which only fetches\npublic pages). `action=\"attach\"` with `port=` connects to an app that is\nalready running with `--remote-debugging-port` — that is how the renderer\nconsole of an Electron desktop app is read.\n\n**Desktop apps** — `desktop_app` starts a GUI program while capturing its\nstdout/stderr (tracebacks, crashes, Qt/GTK criticals), lists and screenshots\nits windows, and clicks/types into it:\n\n```\nstart \"python3 app.py\", click Save and show me the error it prints\n```\n\nScreenshots are written to `.ettore/screenshots/` (gitignored). Both tools\nclean up their processes when the CLI exits.\n\n## Configuration\n\nAPI keys live in a per-user config directory. Use `/keys` to manage them, and\n`ETTORE_CONFIG_DIR` to point somewhere else for tests or CI.\n\n| Platform | Location | Protection |\n|---|---|---|\n| Linux, macOS | `~/.config/ettore/keys.json` | directory `0700`, file `0600` |\n| Windows | `C:\\Users\\<you>\\.config\\ettore\\keys.json` | the ACL your user profile already carries — NTFS has no POSIX mode bits, so the `chmod` is skipped there |\n\nFor env-only usage, set the provider key before starting ETTORE. The variable\nnames are the same everywhere; only the syntax differs:\n\n```bash\n# Linux / macOS\nexport OPENAI_API_KEY=sk-...\nexport ANTHROPIC_API_KEY=sk-ant-...\nexport OPENROUTER_API_KEY=sk-or-...\nexport MINIMAX_API_KEY=...\nettore\n```\n\n```powershell\n# Windows PowerShell\n$env:OPENAI_API_KEY = 'sk-...'\nettore\n```\n\n```bat\n:: Windows cmd\nset OPENAI_API_KEY=sk-...\nettore\n```\n\nPrefer environment variables or `/connect` over `--api-key`; command-line\narguments can be exposed in shell history and process lists.\n\nOther variables ETTORE reads: `ETTORE_SHELL` (which shell the agent's commands\nrun in — see [Platform support](#platform-support)), `ETTORE_WARM_SHELL`\n(`0` turns off the warm PowerShells on Windows), `ETTORE_CHROME_BIN`,\n`ETTORE_AUTO_UPDATE`.\n\n### Claude without an API key\n\nThe `claude-code` provider reaches your Anthropic account through the Claude\nCode CLI that is already logged in on this machine, so no key is stored and\nusage draws on your Claude subscription instead of API credit.\n\n```bash\nnpm i -g @anthropic-ai/claude-code   # if not installed yet\nettore /connect claude-code          # signs you in if you are not already\nettore /use claude-code sonnet       # or opus, opusplan, claude-opus-5, ...\n```\n\nIf no Anthropic account is signed in yet, `/connect claude-code` hands the\nterminal to `claude auth login` and reconnects when the browser flow finishes.\nOnce connected it prints which account and plan the session will draw on.\n\nModels: the aliases `sonnet`, `opus`, `haiku`, `opusplan` and `default` always\nresolve to the current model of that tier; pinned ids (`claude-opus-5`,\n`claude-sonnet-4-6`, …) are listed too, and `/use claude-code <id>` accepts any\nid the CLI knows, listed or not. Models billed against usage credits rather\nthan the subscription (`claude-fable-5`, `sonnet[1m]`) are flagged in the\npicker.\n\nETTORE drives `claude --print` as a bare model: its own tools, MCP servers,\nsettings and slash commands are disabled, and ETTORE's system prompt and tools\nreplace them. On a headless machine, `claude setup-token` or\n`CLAUDE_CODE_OAUTH_TOKEN` work too; point `ETTORE_CLAUDE_BIN` at the binary if\nit is not on `PATH`.\n\nCompared with an API key, this transport drops image attachments and offers no\n`temperature` control. Prompt caching does apply despite each turn being a\nfresh headless session: measured on a warm turn, 12,300 of ~12,306 prompt\ntokens came back as a cache read. The output ceiling is set for you and can be\noverridden with `CLAUDE_CODE_MAX_OUTPUT_TOKENS`, and `effort` is passed through\nto the CLI on models that accept it.\n\n## Requirements\n\n- Node.js 18+ (Node 22+ for `browser_app`, which uses the built-in WebSocket client)\n- Linux, macOS or Windows — tested on CI against Node 20 and 22 on Linux and Windows\n- An API key for OpenAI, Anthropic, or another supported provider (Ollama runs locally and `claude-code` reuses your Claude login — both without a key)\n\nBundled plugins declare their own dependencies as `optionalDependencies`, so\n`npm install` brings them. `pgadmin` also needs `psql`, `pg_dump` and\n`pg_restore` on `PATH` for the dump and restore tools; everything else in it\nworks without them.\n\nOptional, only for driving applications. On **Windows** none of this needs\ninstalling: the desktop backend drives the GUI through PowerShell, which ships\nwith the OS, and Chrome or Edge is found wherever the installer put it —\nincluding a non-admin install under `%LOCALAPPDATA%`.\n\n| Capability | Needs (Linux/macOS) | Install (Debian/Ubuntu/Mint) |\n|---|---|---|\n| Web apps + browser console (`browser_app`) | Chrome or Chromium | `sudo apt install chromium` (or set `ETTORE_CHROME_BIN`) |\n| Desktop windows: list/focus (`desktop_app`) | wmctrl or xdotool | `sudo apt install wmctrl` |\n| Desktop screenshots | ImageMagick, gnome-screenshot, scrot… | `sudo apt install imagemagick` |\n| Desktop clicks and typing | xdotool (X11) / ydotool (Wayland) | `sudo apt install xdotool` |\n| Headless desktop apps (no display) | Xvfb | `sudo apt install xvfb` |\n\n`desktop_app` with `action=\"capabilities\"` reports which of these are present on\nthe current machine.\n\n## Development\n\n```bash\nnpm test\nnpm run lint\npython3 test_display.py\n```\n\nRun `python3 test_display.py` after TUI rendering changes. It should finish with\n`Total issues: 0`.\n\nBefore publishing a release, run the complete release gate:\n\n```bash\nnpm run release:check\n```\n\nThis command runs the full test suite, ESLint, and the TUI layout validator.\n`npm publish` runs the same gate automatically through `prepublishOnly`; a\nregression blocks publication. Releases tagged as `v*` also execute the gate in\nGitHub Actions and validate the package contents with `npm pack --dry-run`.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}