{"_id":"@mnemonica/tactica","_rev":"29-9020606b514dd7bf89cb0b9f27ea641d","name":"@mnemonica/tactica","dist-tags":{"latest":"0.4.4"},"versions":{"0.1.0":{"name":"@mnemonica/tactica","version":"0.1.0","keywords":["mnemonica","typescript","language-service","plugin","types","intellisense"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.0","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"contributors":[{"name":"Roo AI","email":"ai-assistant@example.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"5af215f3c1fedbc4c2aa623b662800def054a8de","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.0.tgz","fileCount":27,"integrity":"sha512-QYqf+szhQ1B7Ean4LuSHPERhtASI84ApZXhxDxmyWnW8VmdFbyOZomt48YeTuH7pDYk30ln5kaTsE+FqUpaZQg==","signatures":[{"sig":"MEQCIFlJ5oebV7p56uNsST5+BP6VbcaFLhj/ZFqt50DIkDH8AiBf6vemZlKNpbQSv0v1Imglhm5+AhGMVY/xu5qBLS6zqw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110999},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"aa770ac9ff4a9cf3a08533b20b70385f02ab0b16","scripts":{"lint":"npx eslint --fix ./src","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"TypeScript Language Service Plugin for Mnemonica - generates types for nested constructors","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.5.0","@types/chokidar":"^2.1.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^17.1.0","chai":"^4.3.10","mocha":"^10.2.0","ts-node":"^10.9.0","mnemonica":"^0.9.99780","typescript":"^5.3.0","@types/chai":"^4.3.0","@types/node":"^20.0.0","typeomatica":"^0.3.57","@types/mocha":"^10.0.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^0.9.0","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.0_1772059734259_0.4501295482889365","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@mnemonica/tactica","version":"0.1.1","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.1","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"80f084e51a880165439482f1693768a342a008c0","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.1.tgz","fileCount":27,"integrity":"sha512-mTCYHnB5VtwL5Vr3wa5pM5i7DLeSO78g52ocvJE6kwm52ZpvjjkBoNvCzDhEDjtmdKVjazf7dKjVqU/w3X+Ucg==","signatures":[{"sig":"MEUCIQDdhrMUnKCjzlMU46+dSqYhZ0iCMEeg3tJAAmCZAtEqeQIgRv+3ByeluEf3FkVPkx9+S+AiAE6k8RShmccRxXMNDgI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":311578},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"597423aa6f6b99450b5c39fc850066b3bae41acf","scripts":{"lint":"npx eslint --fix ./src","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.0.1","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^17.1.0","chai":"^4.5.0","mocha":"^10.8.2","ts-node":"^10.9.2","mnemonica":"^1.0.1","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.41","typeomatica":"^0.3.57","@types/mocha":"^10.0.10","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.0.1","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.1_1780403726916_0.1936407356095342","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@mnemonica/tactica","version":"0.1.2","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.2","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"ffb2644ef04e2e6d3d19dc1f0ac5a22744ea0054","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.2.tgz","fileCount":27,"integrity":"sha512-F/+EGbXjiDUDectzf26iIV6kOyUtvrQ7ntPgCvehGZs4+8Vkwx3/FftMgbBftV20/GjWu5nksAw4o09Dev182w==","signatures":[{"sig":"MEQCIE9svX76Ge9hLbEDxN0s508cvbR01f5NHsw92NGorkL0AiBL2FROyOapI+lhDicSezQyxS0A3DKn75pmlS+VhU9A1g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":311385},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"66c0e965f759eeecb826b4006512060b06e990e0","scripts":{"lint":"npx eslint --fix ./src","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.0.6","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","mocha":"^8.1.3","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.57","@types/mocha":"^10.0.10","@istanbuljs/nyc-config-typescript":"^1.0.0"},"peerDependencies":{"mnemonica":"^1.0.6","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.2_1781975543753_0.8818488888260863","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@mnemonica/tactica","version":"0.1.3","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.3","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"6ddfff639d5c18b1f0669f96052c0e329f1bda01","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.3.tgz","fileCount":27,"integrity":"sha512-sxebfVY1u4OkymIYFSZ6XVIdou3MiTn2UzLzc8+imRGBKyh+arEy0TyLOyzP7DyqAlTg+EPAqxGTNVgWvnTPjQ==","signatures":[{"sig":"MEUCIDnnIsvEVUpfw+PDGSLDZqPkdyhPRcQdDdxscweFT9JRAiEAqh95NbFMwZJm8Y0BhTCK9Exb4PLxp6Yp+vKFiExpHFs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315497},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"c60a8815ac0b315d48b4d0e1069e3a4a62d9941c","scripts":{"lint":"npx eslint --fix ./src","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.0.8","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","mocha":"^8.4.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.59","@types/mocha":"^10.0.10","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.0.8","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.3_1782499962002_0.4878039492447199","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@mnemonica/tactica","version":"0.1.4","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.4","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"230f8ec41d3f45ec46d6fc9e5ce380cb63c7baa9","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.4.tgz","fileCount":27,"integrity":"sha512-HNfdf+Uf6UDYVMBvQHTwKZ5lT+Jdd3KbRISaMYZkOxBNA2291W57VJzOjwAStZUf8TrOKOW5UtjKKDTkvSH2ow==","signatures":[{"sig":"MEQCIFBvhkGSXKZCqYqjkim7qR8s9Ux6PFMg4KEVAmszyHBqAiAjLMyUOFgEiGR1NVL1YB6ovueaEJrfEZ0cGQiNKxe1Xg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":319897},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"5c385cf58de9ab4aac8ade7b6aabc77c8681f329","scripts":{"lint":"npx eslint --fix ./src","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.0.9","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","mocha":"^8.4.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.59","@types/mocha":"^10.0.10","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.0.9","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.4_1784185941619_0.34873333361655723","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@mnemonica/tactica","version":"0.1.5","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.5","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"5ba2427a81f9b20fae507063cf1e95b8350af31d","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.5.tgz","fileCount":27,"integrity":"sha512-jsFZQcNYyvmBFVh4SwKB6CqyFCBB4oXasAZV01diFzkMMstDohZK0pipJoIyhGefruBHo3wdf1MvHyQnWzHysg==","signatures":[{"sig":"MEQCIFUPmmzvrhcEOJse3/+++56OlS7gPbGKD8tTPi3kBiajAiAg8JsFt7F5WoclJle/IY0GXqQzKVd4IFtbgB4PHRx9aQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":392785},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"4c00d93264ed2d44f7bde740497875f390375402","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.2.1","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.59","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.67.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.67.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.2.1","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.5_1786521828791_0.5851994655153239","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@mnemonica/tactica","version":"0.1.7","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.7","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"9a37764c272c73fffb439afa72a1e7a2d767fe29","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.7.tgz","fileCount":27,"integrity":"sha512-57rJDdkpPolDy6atlg3bcZaXx6X2Dn0Q2TNeUGvDgrwgModiIgFEJNe4AE1G5B+jkwnxOfeFU3CVVOyYek/JZQ==","signatures":[{"sig":"MEYCIQCdV7L3CSz0If8dYmDKQz48G0PcpiqGRaVVJ9xNVNPd6AIhAK1SQrwv4GB3UJbFQ84DXpPVVPX4E75kJexlXpwPbP8a","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":394415},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"4ef6fd8e7bf43a28a9b9af23eaebae74ea0d8f7f","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.2.3","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.60","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.67.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.67.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.2.3","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.7_1787307911856_0.7203220093891043","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@mnemonica/tactica","version":"0.1.8","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.8","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"633c1a34bc40069d3d9e30973f5b8a6f7fbca402","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.8.tgz","fileCount":27,"integrity":"sha512-3IW/BUE2mQqO7SwfwcDvssS2ATAI1RAgshydXkS6sXSawr0A+oo6dYo1EiebOXr4vnU/BtXoc7FThh/fncn1zA==","signatures":[{"sig":"MEUCIATAd0EQAcw+59gWmWdyi7zQeGRK1rHRGFfLrJMP8Q4ZAiEA6iE6fHF3gBILoQrbWuNAZYz5EP7TudytI4K3QN0HKFk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":394553},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"07dfc7ec27774cf61f70a486d8e099e6e2cedaa4","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.2.5","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.62","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.67.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.67.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.2.5","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.8_1787337640526_0.06426809476395468","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@mnemonica/tactica","version":"0.1.9","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.9","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"d8950946442901e28c2636af6309b3354690e784","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.9.tgz","fileCount":19,"integrity":"sha512-4lQQk/3cwU8cdkfrtsGXlMrVVGpf5ghD7h8cdTbDpMjj3vZJLdiF2oW3YtoGf06irRpacETMLDTkZKHFOLirXA==","signatures":[{"sig":"MEYCIQDd2mimp6Y4K9UL4NC4cjEdh7mHpt2bD3h9X3ZbFy9awQIhAJ/vuKrcYcNgQDrOeycXdvR+uJs9su2NPJgvEDZdcFUq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":687938},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"5c9111d554a79671498f5d7884d3beb003358502","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.2.5","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.62","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.67.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.67.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.2.5","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.9_1787339175719_0.05047623873245799","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@mnemonica/tactica","version":"0.1.10","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.10","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"156a0f456ba41bb4d1db01f83389ff0d1b5e6415","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.10.tgz","fileCount":19,"integrity":"sha512-xDYal3o64vlR3bICXVkcxYw2WNWbbYcCKNZSAl3IzY1Htx1N3GedJHQdrQxNJN+Pjs0CpM9ighFPKvJHCeh/lA==","signatures":[{"sig":"MEYCIQDL5BozygGtdZsEzmxAXKfP4GgNbrikaW9tgrK9THGHCAIhALvjNE/gfphbDmjrLPrZ+YXYzn8bPmALKE0ygNCmrxGV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":690174},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"357387c2c00789a416af7d07e1d770bdee852bc7","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.2.7","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.62","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.68.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.68.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.2.7","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.10_1787663251778_0.0949266975226637","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@mnemonica/tactica","version":"0.1.11","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.11","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"232a0266e5d49ddb9937981c894e73ed0ddc6f2b","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.11.tgz","fileCount":19,"integrity":"sha512-9zMtTqDrQjGm20wulhAKfJV0XBW0TX55Fv+FqYp8T7/63Qstd2yHFxgc06wGQzv8E6uTc69UtewJAuzcPta0oA==","signatures":[{"sig":"MEUCIQC3LesBR+mXEm9PHbZocOFmwCkQEnWdGGTFQPD/dTtZlwIgDvBEuXgpuMg3+2TNHaSsmFX5P+jg3tFD26j37Sggv8w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":686467},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"919a31192c77ae1c185a9549acb69a6c753007ec","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.2.8","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.62","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.68.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.68.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.2.8","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.11_1787831974724_0.6898570152986652","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"@mnemonica/tactica","version":"0.1.12","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.12","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"0b6c643d5abe2669e3472c09bcf757c7360e09df","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.12.tgz","fileCount":19,"integrity":"sha512-sbkZl8XjACrD/Y+rXzVi+gCdBp3DaCGfum4m1SImCfRny0aqEZaDLP12XEohGS8cPbOroueN4s7Dh+S/f8dcdw==","signatures":[{"sig":"MEUCIQDDrGbDDa3rasQIQe0Aog7LwKvwot+g17kGvEfoV9qqMAIgcpC4eXMyYdsMl7Ix15vb2N9vTxvj82308bCKbo0CZMw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":686467},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"f98a75043119979fbc9a22cb8d29e9bd9ff2b5ab","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.2.8","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.62","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.68.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.68.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.2.8","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.12_1788103847640_0.14059863648326032","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"@mnemonica/tactica","version":"0.1.14","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.14","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"45e0707e34aa083c92d6cad728ca6f130ff9bb75","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.14.tgz","fileCount":19,"integrity":"sha512-bRqUFXHPF8GLwkMPTAuGmZJga+8Q8MZ4I2ostBEDEDxqgvWJOJFgd+GfZYxMFkXsIOpiK3leroL6ioc7eOpfwA==","signatures":[{"sig":"MEYCIQDuir1JXJIdAr4Qt6k9J+8AOei88duI66gKuP+z29W6dgIhAOaYzR7+Ufr29oEZ+8f/ThO0XGPmeFjxvpIDLq8rmm8d","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":692710},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"93afc88bfa370fab087a2648073f36a7039abd3d","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.2.8","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.62","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.68.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.68.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.2.8","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.14_1788106611234_0.32060508521342546","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"@mnemonica/tactica","version":"0.1.15","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.1.15","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"8f09f42840d4f7beeb8132985e7fe4ad0fd73f19","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.1.15.tgz","fileCount":19,"integrity":"sha512-jyr0tEfnWrJmvFJhwncJFZZorTLzl1lLOSBwUEENdHNo+0EbT8GYKyZuoqyHmDt5tufW4zjpcL0LU+PxOoqOKg==","signatures":[{"sig":"MEUCIDdGQHOopf8VPUsXhC1PWOaxriuzSf8xpn3t2jToMj61AiEAikJppnaOIueLyIjw7EhUsX867u+gkI3WvaviENXHBuk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":719799},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"ac42de478187f6ade7288ff7c4bd35114765531a","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.16.0","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.2.8","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.62","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.68.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.68.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.2.8","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.1.15_1788127578802_0.7270444675620382","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@mnemonica/tactica","version":"0.2.0","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.2.0","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"96a1e3bae05d28df3856f35c379cf42f69f469cd","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.2.0.tgz","fileCount":27,"integrity":"sha512-PAu4+KaXiaVD77x3LcxbfVPoRVTL/xmfVLs5OLDVLZp5/Ea99uCGTKrskBdlIw4OIiMTAnAcCeUe/ifeN5UsMg==","signatures":[{"sig":"MEUCIES1LVs28FD8RW7YMEfC4vklPMT6+ltFakYeH8gJThztAiEA3fzuWUv8Ic0Yl2votEs2TGdlTNLBRXIU+izxprcJmqw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1115066},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"2f9acfc943ec2173911d3b9c106fee36322b9ae1","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.8","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.2.8","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.62","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.68.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.68.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.2.8","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.2.0_1788726342642_0.38903293327195043","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@mnemonica/tactica","version":"0.3.0","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.3.0","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"bb8d62a2121cd9fe902c6a9c76ba72e67f070ca6","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.3.0.tgz","fileCount":27,"integrity":"sha512-OIouObUJBgckgkPxume5QqmKBVr4e1/kNmUnFl3hPRHB+vDX4BFH5nTyhB0PUKl1E8aXsu0tXrZbEQIdMUkB8g==","signatures":[{"sig":"MEUCID25H4AG15r0+p6At+hTbdSntBlFoq9RUjcu4viwtIyxAiEAv6hrfaXRuhX69+NxYnrfej1jUtwJNqfGLFXowTJXKxM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1115066},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"3b0c9de22cac21eb8f63079bcd9abe86c623b230","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.8","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.3.0","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.62","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.70.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.0","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.3.0_1788821824000_0.7635038051140166","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@mnemonica/tactica","version":"0.3.5","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.3.5","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"9ba82913aed123bec9e6f91103cb47ed985ac6da","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.3.5.tgz","fileCount":27,"integrity":"sha512-Ypr3rS6j7bWtU7wnNN5QBYizNmLH4PSAPoSYCetTWHHbLnlfb3q5riau7eXrqQOqwzFMrJzvnzszwow+s7eQOA==","signatures":[{"sig":"MEQCIFRgU9DMb6RnYLWKsE4QiHAmuEGdtCYcevV2Fx9V2B5/AiARvOUVG/SghTBWabjsa4n5tukrZ1jkM3An7rArwrk+eQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1355584},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"bdaebaafaba37ade8170c2dfaf30d3f2d1e80639","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.8","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.3.0","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.63","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.70.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.0","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.3.5_1789034990802_0.8492336092127086","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@mnemonica/tactica","version":"0.3.7","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.3.7","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"7233e1b51d3dac80844e5f937dd383cb0af57e8c","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.3.7.tgz","fileCount":27,"integrity":"sha512-dqNzgUebtQ9UKh3higiZLH3EiCXI870OSXFPujuYzpTiGuKPt1p3UHLzJNFLIkDcaUQSGIBkxY8m5+Kkfk1Gjw==","signatures":[{"sig":"MEUCIDPR5EaC4uTtbcPU2PD3IC8cwBQBp6n46coP/QC2eroeAiEAs8nk4vMSJsk/jGlTA/8ONwSszj6Dr7FOJKtR9UMbCEk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1392141},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"d0645bc238bc65194414590a76f0852a8f608823","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.8","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.3.0","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.63","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.70.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.0","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.3.7_1789110812305_0.6018234672318823","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"@mnemonica/tactica","version":"0.3.8","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.3.8","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"83ac04b2bad52dbe1ab67412ec775b751a61122d","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.3.8.tgz","fileCount":27,"integrity":"sha512-U9VxIZiEzq8WBsbXt4C5dtVSh4hIFL6YymzLnO0QWkWWjQKoOx9QPqAnvkY37D3DhDh2UUAowhDiLLJnUmUDSg==","signatures":[{"sig":"MEQCIEiwLft04Lb1hx0ZYCxiauha1HZbjCBgYO9tAL6uHOywAiA7L7hatjFZGmeHn+Q4ZXXoWpe6Lxa8jWEUKMRbjJgCmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1399570},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"94f30a43972380304e6f0296a4ead01a2ddc578d","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.8","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.3.0","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.63","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.70.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.0","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.3.8_1789114249923_0.5262350372975668","host":"s3://npm-registry-packages-npm-production"}},"0.3.9":{"name":"@mnemonica/tactica","version":"0.3.9","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.3.9","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"23cb17be99f8571ed767064767613523b1282b85","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.3.9.tgz","fileCount":27,"integrity":"sha512-bnI7OIJAMqzr2BPSOTbQxfgouNBge/QzaGlaeVyP07OQ8L9ATXXis1Y4wnExyLNo3CK1Pfz3pBVVjs+n0E0nPQ==","signatures":[{"sig":"MEUCIGVgzajyzEWEaot+pU9Qb2GIyg/7i7dcI+JGqucuWml1AiEAorKUEitekPQbhpsbgzNYyL7fsSPy3XMmsDb0zUFTdH4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1475891},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"4930ec68357034a87f21d288ee507bc32190d16c","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.8","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.3.0","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.63","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.70.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.0","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.3.9_1789133748698_0.6825666438116937","host":"s3://npm-registry-packages-npm-production"}},"0.3.10":{"name":"@mnemonica/tactica","version":"0.3.10","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.3.10","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"228b33813a93edc32cd63944aeda941fb1d0a56b","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.3.10.tgz","fileCount":27,"integrity":"sha512-Pi10YVFO6gmlwpKY1DDYx5aIAc8kn5JshFviC1fQNVgkyaaWhAR/Ts8rC/tpwSyDyG60QA2O8FWSvFbQt18Ryg==","signatures":[{"sig":"MEUCIDIFQg/319bMwGdq9BKDRIYymjy+H6oKqcJlWZ9JA8B4AiEAyIbHyjPMv5Ij03oSVIu0wf4Zbz3CX5YA98OqyM6ksNE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1487294},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"8b946a617d39f29e77b03fa7d60b8ef9ed3bbdf5","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.8","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.3.0","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.63","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.70.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.0","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.3.10_1789134933026_0.32417516462286744","host":"s3://npm-registry-packages-npm-production"}},"0.3.11":{"name":"@mnemonica/tactica","version":"0.3.11","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.3.11","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"835a575dd76f8993d8c135ff798ee9a887fb7b7d","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.3.11.tgz","fileCount":28,"integrity":"sha512-mCe5QxUaV7o835lpDgDNLq2fiBWvSQ3Gd0onmz9JzIhNl2AUlds/cOCUWhDoU8/szTCAKErVM8+JYJxVMYNzAg==","signatures":[{"sig":"MEUCIG0boeBX6q+N6mk2cDiiaaFTMl8aCXtsL6cGQ+k/WXbwAiEAgraIsVnFKzIYKsqpLfVWKzoX2kCKtfaOfzqmYy6b3QY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1519566},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"4f07f26d32542241d1d032ce978457b1d1cc9126","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.8","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.3.0","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.63","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.70.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.0","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.3.11_1789152136319_0.6532932356136305","host":"s3://npm-registry-packages-npm-production"}},"0.3.12":{"name":"@mnemonica/tactica","version":"0.3.12","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.3.12","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"f2b1607bc555f2a9237f5703d21431fcfb244c93","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.3.12.tgz","fileCount":28,"integrity":"sha512-FnEAOh4vCOJYUneuHDyWQt7w1f4BCJUh8uJZqoFDgb0NiiO+1O06OwYjOD0J0CumUbmjWiKrQjVr6HsfbMYD8Q==","signatures":[{"sig":"MEUCIQCX7DDKyziXaoF7ARgSrwmdXXU+MmCZH/TuegA/vug6swIgZK4+OQY20f0CM7mz8BYmBWLtoWNQNR4hfRFfuzT/TQ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1531806},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"86139ef00ac598a7185d0d34c6512cf3c11955e6","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"10.9.8","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.3.0","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.63","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.70.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.0","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.3.12_1789154014507_0.4783972678972468","host":"s3://npm-registry-packages-npm-production"}},"0.3.15":{"name":"@mnemonica/tactica","version":"0.3.15","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.3.15","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"d6a1fb51485b3d87a873f58201dbefc0f6c67676","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.3.15.tgz","fileCount":28,"integrity":"sha512-3FgSmWTm8oXidQrHg8OTzJZRRjg6wKXx5NRVd1CtyM82R8yFJVcz7+0lKCGZ4fkzk5TBhDMsqdWMQKhBIeK3gw==","signatures":[{"sig":"MEUCIHz9Km9Z/BmSoYVxTU3Pvs1be7KydBY1i0YveLAORZFYAiEA8fdt1aoYqslwUpXbATSwHCFMSs2DyL46tyawUydZkQ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD+DBjsRnAnFrWvN+53q31HU3U45enZEuMcefM6osrifgIgLH2VJlhNCyI2bs1ZJmbs08bqmhGFZT9IoC/KatYemtQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1539496},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"5a0b48f77a6b02d668d48d5596b148220c1c91f5","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"12.0.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.3.0","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^5.9.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.63","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.70.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.0","typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.3.15_1789545555824_0.6739254801157548","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@mnemonica/tactica","version":"0.4.0","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.4.0","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"976701ecfb028c08d8e3d143c116d4f41473ae28","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.4.0.tgz","fileCount":28,"integrity":"sha512-IlzO/37b/y5qkL2ZclsnbgPrBP3ZTUlMblgekhEAlfrPU77hC4Ublx7nshow1CsE6mY9IQidQsdttXvhKINZ7Q==","signatures":[{"sig":"MEQCICkTFGVyMNwGqHNLFrP0DmP2vpXPrFYxMbF33csI+1t+AiB4B67KuDo0LlfMxDvBJaTUcqgKQpfuMdK1XlusfiBl+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD2EP2JNCbUA6mpev1cm8BRc3GPLdYfnHFobKEu0EOM/AIhAOFnHxOK5+wj9RkSA3n7K4dFu7cnfj9x8z6GqzInKdoX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1549276},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"4e1b9a3e75d937aad6810322a6b660305f31521d","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"12.0.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.3.1","typescript":"^6.0.3","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^6.0.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.63","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.0","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.70.0","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.1"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.4.0_1790022259222_0.36338531671867824","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@mnemonica/tactica","version":"0.4.1","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.4.1","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"c66527a877e99e53b9f49c13cc322fa2745a82f4","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.4.1.tgz","fileCount":28,"integrity":"sha512-n4hrdQbJ5D/0XkWmdZBqsH4e1zZ86epu5q2kuTDpEJW7+mRTywSgsL+tNJQ32UOlO5lwYqJF5hb8dUw7gfkoyQ==","signatures":[{"sig":"MEYCIQDKDgpSb1VeY1Gdy86FKBgh++2RnNoqDFYznmaaRFh4bAIhANmu9/KWBcjiGnGcIkuDUGaaH4nOONpZLKYKL/3WYqTt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDs1n98PzuwJTDof4XhRGJqfCvhznxtXxBoGEGWetqZgAiB1Sy8oBy4fS6+7kJxOZAXYWzpHTSfPH3aZgwZ7/IbUiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1574184},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"ce790d75750a8c5880ca7facd56d82ab56b5336c","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"12.0.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.3.1","typescript":"^6.0.3","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^6.0.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.63","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.1","eslint-plugin-no-arrow-this":"^1.2.0","@typescript-eslint/eslint-plugin":"^8.70.1","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.1"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.4.1_1790076002984_0.842040289626071","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@mnemonica/tactica","version":"0.4.2","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.4.2","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"54f92d03e7ae620639d7a55b2cf087b8c2f9969c","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.4.2.tgz","fileCount":28,"integrity":"sha512-TghF9Szo0Xpn+HyUAGm26vdYW5TImtSiM1O3004RvWKrP0nW7pyCQIvSVkWsUJ5T2c/8uz3LaCN6AplF2EPUWA==","signatures":[{"sig":"MEUCIQDbQtcm49DNziKqLlw/6yb10q5O73tm7p2GJ1BDVo6GVwIgTsA/kkaW3nVP6Xx5KHIDgDEREiJUSueZ+JszuvSDXS8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDgZmClbFeIL/XCDEOWjaA91/padr5S1tpyn5+HNL2/2QIhAJUGPEnya1IQp/VkvmdOLXnzTct+OLtC2OQ9brAJNPrL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1585358},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"5f7eae4961aadaacce793d797cb5506a48f4b49d","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"12.0.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.3.3","typescript":"^6.0.3","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^6.0.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.63","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.1","eslint-plugin-no-arrow-this":"^1.3.0","@typescript-eslint/eslint-plugin":"^8.70.1","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.3"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.4.2_1790390139063_0.09103060621476367","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@mnemonica/tactica","version":"0.4.3","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"author":{"name":"went.out@gmail.com"},"license":"MIT","_id":"@mnemonica/tactica@0.4.3","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"homepage":"https://github.com/mythographica/tactica#readme","bugs":{"url":"https://github.com/mythographica/tactica/issues"},"bin":{"tactica":"lib/cli.js"},"dist":{"shasum":"8e0f62edf5601b7ef290b46dd8de2ecf7f131e93","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.4.3.tgz","fileCount":29,"integrity":"sha512-faBAOT486sRv5w0JPXW7+6i5k3no0jkwXt7vPc3c+qcryJ6K8OedKvztkLd3f7QrOcy50i/FpZbbCLhQd16m8g==","signatures":[{"sig":"MEUCIQDEuMtScEjJKbWJpcTu3J226g8SX3+YWWkT8xScqynXRQIgAoXUdX43Hk1Vd1MGjAGn7QODr9/iIPBfGa06UIM+Nis=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDQUxj+IUFZRMMVCACd0la+E1GtkE9OffiSk/n6YhUsiAiBqmpR8MpYD05Bk8bJP3NVjdowC02INaN9EMDQy45dDZg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1598299},"main":"lib/index.js","types":"lib/index.d.ts","gitHead":"18ba803a6d2ace55099cb792510f4c9a77f9099c","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"12.0.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","mnemonica":"^1.3.5","typescript":"^6.0.3","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","typescript":"^6.0.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.63","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.1","eslint-plugin-no-arrow-this":"^1.3.0","@typescript-eslint/eslint-plugin":"^8.70.1","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.5"},"_npmOperationalInternal":{"tmp":"tmp/tactica_0.4.3_1790538629275_0.16276368903254013","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"_id":"@mnemonica/tactica@0.4.4","bin":{"tactica":"lib/cli.js"},"bugs":{"url":"https://github.com/mythographica/tactica/issues"},"dist":{"shasum":"ac187453b18e4b37f39b2ddbcd42b719508d7b44","tarball":"https://registry.npmjs.org/@mnemonica/tactica/-/tactica-0.4.4.tgz","fileCount":29,"integrity":"sha512-bLJcpqCjiSCaCcRyJ7y1nH85MVSzBpnt94vdAH+E5xDQPrLf2YpITM771Zu14tx+JDkyPxub/XzQA710uOOXdA==","signatures":[{"sig":"MEUCIA8X7okGbx8owsUiEXM6S6ihmzo7PMcAYbFTFSOzC6wdAiEA2kt5/CFjehl4S8VsRLiD3eTNbADu3DC0J3zxDXy5Ijo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIF3ohXZi1+B41IHmd6ejLREoRatbAEL+42HhzCokliDMAiEAhTzJ5YMU5i1ENfvxQge5La5BxQxZeDjlfwNf5Eh/zbQ="}],"unpackedSize":1598371},"main":"lib/index.js","name":"@mnemonica/tactica","types":"lib/index.d.ts","author":{"name":"went.out@gmail.com"},"gitHead":"ba2e4f243396e316a498d112e6d37aa7cf955a9f","license":"MIT","scripts":{"lint":"npx eslint --fix ./src ./test","test":"TS_NODE_PROJECT=./tsconfig.test.json mocha test/**/*.test.ts","build":"rm -rf ./lib && npx tsc --pretty && npm run fix-permissions","watch":"npx tsc --pretty -w","prepare":"husky","use:local":"node -e \"const fs=require('fs'),p=JSON.parse(fs.readFileSync('package.json','utf8'));p.peerDependencies.mnemonica='file:../core';p.devDependencies.mnemonica='file:../core';p.devDependencies.typeomatica='file:../typeomatica';p.dependencies.mnemonica='file:../core';fs.writeFileSync('package.json',JSON.stringify(p,null,'\\t')+'\\n');console.log('Switched to LOCAL file: dependencies');\"","lint:check":"npx eslint ./src ./test","use:public":"rm -rf node_modules package-lock.json && npm install mnemonica@latest typeomatica@latest --save && npm install mnemonica@latest --save-dev && npm install mnemonica@latest --save-peer && echo 'Switched to PUBLIC npm dependencies (latest)'","test:coverage":"npx nyc npm test","fix-permissions":"chmod +x lib/cli.js","test:coverage:html":"npx nyc --reporter=html npm test"},"version":"0.4.4","_npmUser":{"name":"went.out","email":"went.out@gmail.com"},"homepage":"https://github.com/mythographica/tactica#readme","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"_npmVersion":"12.0.2","description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","directories":{},"maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"chokidar":"^3.6.0","typescript":"^6.0.3","@types/chokidar":"^2.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","chai":"^4.5.0","husky":"^9.1.7","mocha":"^8.4.0","eslint":"^9.39.5","globals":"^15.15.0","ts-node":"^10.9.2","mnemonica":"^1.3.5","typescript":"^6.0.3","@types/chai":"^4.3.20","@types/node":"^20.19.43","typeomatica":"^0.3.63","@types/mocha":"^10.0.10","eslint-plugin-mocha":"^10.5.0","@typescript-eslint/parser":"^8.70.1","eslint-plugin-no-arrow-this":"^1.3.0","@typescript-eslint/eslint-plugin":"^8.70.1","@istanbuljs/nyc-config-typescript":"^1.0.2"},"peerDependencies":{"mnemonica":"^1.3.5"},"peerDependenciesMeta":{"mnemonica":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tactica_0.4.4_1790540785502_0.4220902398071966"}}},"time":{"created":"2026-02-25T22:48:54.184Z","modified":"2026-09-27T20:26:25.792Z","0.1.0":"2026-02-25T22:48:54.400Z","0.1.1":"2026-06-02T12:35:27.155Z","0.1.2":"2026-06-20T17:12:23.890Z","0.1.3":"2026-06-26T18:52:42.143Z","0.1.4":"2026-07-16T07:12:21.749Z","0.1.5":"2026-08-12T08:03:48.939Z","0.1.7":"2026-08-21T10:25:12.009Z","0.1.8":"2026-08-21T18:40:40.736Z","0.1.9":"2026-08-21T19:06:15.954Z","0.1.10":"2026-08-25T13:07:31.989Z","0.1.11":"2026-08-27T11:59:34.905Z","0.1.12":"2026-08-30T15:30:47.778Z","0.1.14":"2026-08-30T16:16:51.410Z","0.1.15":"2026-08-30T22:06:18.973Z","0.2.0":"2026-09-06T20:25:42.869Z","0.3.0":"2026-09-07T22:57:04.173Z","0.3.5":"2026-09-10T10:09:50.957Z","0.3.7":"2026-09-11T07:13:32.462Z","0.3.8":"2026-09-11T08:10:50.112Z","0.3.9":"2026-09-11T13:35:48.875Z","0.3.10":"2026-09-11T13:55:33.182Z","0.3.11":"2026-09-11T18:42:16.459Z","0.3.12":"2026-09-11T19:13:34.658Z","0.3.15":"2026-09-16T07:59:15.920Z","0.4.0":"2026-09-21T20:24:19.348Z","0.4.1":"2026-09-22T11:20:03.089Z","0.4.2":"2026-09-26T02:35:39.171Z","0.4.3":"2026-09-27T19:50:29.364Z","0.4.4":"2026-09-27T20:26:25.589Z"},"bugs":{"url":"https://github.com/mythographica/tactica/issues"},"author":{"name":"went.out@gmail.com"},"license":"MIT","homepage":"https://github.com/mythographica/tactica#readme","keywords":["mnemonica","typescript","codegen","types","type-generator","ast"],"repository":{"url":"git+https://github.com/mythographica/tactica.git","type":"git"},"description":"Type definition generator for Mnemonica — statically analyzes define() calls and emits .tactica/ types, registry, and metadata","maintainers":[{"name":"went.out","email":"went.out@gmail.com"}],"readme":"# @mnemonica/tactica\n\n**Type definition generator for Mnemonica.**\n\nTactica is a CLI tool and Node library that statically analyzes TypeScript / JavaScript source code and generates type definitions, navigation metadata, and runtime-flow data for projects that use [mnemonica](https://github.com/wentout/mnemonica) — the instance-inheritance system that creates types dynamically at runtime through `define()` and `decorate()` calls.\n\nOutput lives in `.tactica/` and is consumed by:\n\n- **`tsc`** — so TypeScript can understand `user.AdminType` after `UserType.define('AdminType', …)`.\n- **`mnemonica.lookup<K>()`** — type-safe runtime lookup via the generated `TypeRegistry` module augmentation.\n- **[mnemographica](https://github.com/mythographica/mnemographica)** (VS Code extension) — for Go to Definition, Find References, and the type-hierarchy graph view.\n\n## The Problem\n\nMnemonica enables instance-level inheritance:\n\n```ts\nconst UserType = define('UserType', function (this: { name: string }) {\n    this.name = '';\n});\n\nconst AdminType = UserType.define('AdminType', function (this: { role: string }) {\n    this.role = 'admin';\n});\n\nconst user = new UserType();\nconst admin = new user.AdminType(); // works at runtime\n```\n\nTypeScript can't infer that `user.AdminType` exists, because `UserType.define()` is a runtime operation.\n\n## The Solution\n\nTactica parses your source, builds the type hierarchy, and emits `.tactica/types.ts` + `.tactica/registry.ts`. Once those files are part of your `tsc` compilation, TypeScript understands the full hierarchy — without runtime changes.\n\n## Installation\n\n```bash\nnpm install --save-dev @mnemonica/tactica\n```\n\n`mnemonica` is a peer dependency (>= 1.0.1).\n\nTactica bundles its own TypeScript compiler (6.x) as a regular dependency, so it installs and runs regardless of the TypeScript version your project uses — including TypeScript 7, whose npm package no longer exposes the classic compiler API. Your `tsconfig.json` is only ever *parsed* (never emitted), so TS5-era options like `baseUrl` keep working even though TS6 marks them deprecated.\n\n## Usage\n\n### CLI\n\n```bash\n# One-shot generation\nnpx tactica\n\n# Watch mode (regenerate on file changes)\nnpx tactica --watch\n\n# Custom output directory\nnpx tactica --output ./types/mnemonica\n\n# Custom tsconfig\nnpx tactica --project ./src/tsconfig.json\n```\n\n### Library\n\n```ts\nimport { MnemonicaAnalyzer, TypesGenerator, TypesWriter } from '@mnemonica/tactica';\nimport * as ts from 'typescript';\n\nconst program = ts.createProgram(['./src/index.ts'], {});\nconst analyzer = new MnemonicaAnalyzer(program);\n\nfor (const sourceFile of program.getSourceFiles()) {\n    if (!sourceFile.isDeclarationFile) {\n        analyzer.analyzeFile(sourceFile);\n    }\n}\n\nconst generator = new TypesGenerator(analyzer.getGraph());\nconst writer    = new TypesWriter('.tactica');\n\n// Default mode — exportable type aliases in types.ts + a TypeRegistry augmentation in registry.ts.\nwriter.writeTypesFile(generator.generateTypesFile());\nwriter.writeTo('registry.ts', generator.generateTypeRegistry().content);\n\n// Legacy mode — single global augmentation file index.d.ts.\n// writer.writeGlobalAugmentation(generator.generateGlobalAugmentation());\n```\n\n### Project setup\n\nAfter running `npx tactica`, add `.tactica` to your `tsconfig.json` so the generated files are part of the compilation:\n\n```json\n{\n  \"compilerOptions\": {\n    \"paths\": {\n      \"~tactica/*\": [\"./.tactica/*\"]\n    }\n  },\n  \"include\": [\"src/**/*.ts\", \".tactica/**/*.ts\"]\n}\n```\n\nThen use `lookup` for type-safe access (see \"Type-Safe Lookup\" below).\n\nYou should commit `.tactica/` if you want type information to flow through CI without re-running tactica; alternatively, add `.tactica/` to `.gitignore` and regenerate as part of your build. Tactica does **not** modify `.gitignore` for you.\n\n## CLI Options\n\n| Option | Short | Description |\n|---|---|---|\n| `--watch` | `-w` | Watch mode — regenerate on file changes |\n| `--project <path>` | `-p` | Path to `tsconfig.json` (default: nearest ancestor) |\n| `--output <dir>` | `-o` | Output directory (default: `.tactica`) |\n| `--include <patterns>` | `-i` | Comma-separated include patterns |\n| `--exclude <patterns>` | `-e` | Comma-separated exclude patterns |\n| `--topologica <dirs>` | `-t` | Comma-separated Topologica directories to scan |\n| `--module-augmentation` | `-m` | Legacy mode — emit a single global-augmentation `index.d.ts` instead of `types.ts` + `registry.ts` |\n| `--esm` |  | Append `.js` extensions to relative imports in generated files (for ESM / NodeNext module resolution) |\n| `--eds` |  | Force-enable EDS (Execution Data Storage) tracking |\n| `--no-eds` |  | Force-disable EDS tracking |\n| `--verbose` | `-v` | Verbose logging |\n| `--help` | `-h` | Show help |\n\nEDS tracking is **auto-enabled** when `@mnemonica/dive` is present in `package.json` dependencies; otherwise it is off. `--eds` / `--no-eds` override the auto-detection.\n\n## Generated Files\n\nTactica writes everything under the `--output` directory (default `.tactica/`). All file paths inside the JSON files are emitted **project-relative** (anchored at the tsconfig directory) so the output is portable across machines; consumers resolve them against the directory holding `.tactica`. Earlier versions emitted absolute paths, so consumers should accept both.\n\n| File | When | Purpose |\n|---|---|---|\n| `types.ts` | default mode | Exportable type aliases — one per discovered type. Uses `ProtoFlat<Parent, Self>` for nested types. |\n| `registry.ts` | default mode | `declare module 'mnemonica' { interface TypeRegistry { … } }` augmentation — powers `lookup<K>()`. |\n| `index.ts` | default mode | Re-exports everything from `types.ts` and `registry.ts`. |\n| `index.d.ts` | with `--module-augmentation` | Single global-augmentation file (legacy mode). |\n| `definitions.json` | always | One entry per discovered type: `{ name, location, kind: 'define'\\|'decorate', parent, strictChain, blockErrors }`. Consumed by `mnemographica`'s Go to Definition. |\n| `usages.json` | always | One entry per type, value is an array of `{ location, kind, code, holderScopeId?, constructorText? }` records — where each type is instantiated, referenced, accessed, or looked up. `holderScopeId` points into `scopes.json` (the innermost scope holding the usage); `constructorText` (instantiations only) is the constructor expression text actually used. Consumed by `mnemographica`'s Find References. |\n| `flow.json` | always | Native instance-flow patterns (property reads/writes, method calls, destructuring, returns, spreads, etc.) per type. |\n| `instrumentation.json` | always | v2 envelope. `points`: framework lifecycle crossroads (interceptors, guards, pipes, filters, middleware) detected via **plugin-supplied vocabulary** — heritage declarations, decorator sites, provider-token registrations, `consumer.apply()` wiring. Syntactic only — no dive dependency; with no plugins loaded, `points` is `[]`. `creationGraph`: the inside-out walk from every instantiation site out to the starters — see \"Creation graph\" below. |\n| `modules.json` | always | Module-scope graph: every module's `exportedBindings`/`importedBindings` (functions, classes, consts, types — not only mnemonica types), project-internal `dependencies`, `builtinSpecifiers` (Node builtins are skipped entirely — both `'path'` and `'node:path'` forms), `unresolvedSpecifiers`, circular-import `cycles`, and cross-module mnemonica-type `edges`. Resolution uses `ts.resolveModuleName` with the project's compilerOptions (tsconfig `paths`, extensionless imports, index files) — no type checker. Bindings resolved into `node_modules` are marked `external: true` and never enter `dependencies`. |\n| `scopes.json` | always | Local-scope graph: function/method/arrow scopes only (no block scopes) plus one module scope per file; variables with `typePath` (mnemonica type when known), `isParameter`, `isMutable`, and `reassignments` — each reassignment of a mutable binding is a flow-termination point. `lookup()` initializers resolve through the same tier law as the analyzer (scope-chain receiver first, then the analyzer's source-relative/root law), so scopes metadata never disagrees with the hard-fail verdicts. |\n| `eds.json` | when EDS enabled | Execution-flow patterns (`wrap`, `current`, `getFlow`, `attachHooks` lifecycle wiring). Consumed by tools that visualize execution chains. |\n\n### Default mode (types.ts + registry.ts)\n\n```ts\n// .tactica/types.ts\nexport type UserType = {\n    name: string;\n    email: string;\n    AdminType: new (data: { role: string }) => UserType_AdminType;\n};\n\nexport type UserType_AdminType = ProtoFlat<UserType, {\n    role: string;\n    AdminType: undefined;\n}>;\n```\n\n```ts\n// .tactica/registry.ts\ndeclare module 'mnemonica' {\n    interface TypeRegistry {\n        'UserType': new (data: { name: string; email: string }) => UserType;\n        'UserType.AdminType': new (data: { role: string }) => UserType_AdminType;\n    }\n}\n```\n\n**Recommended for new projects.** Explicit imports, better tree-shaking, no global namespace pollution.\n\n**Async constructors.** When the construct handler is an `async function` (or async arrow), `new` resolves to a Promise at runtime, so the emitted constructor shapes resolve to `Promise<InstanceType>`: the subtype property on the parent emits `{ new (…): Promise<X>; (…): Promise<X> }` (both twins) and the registry entry emits `new (…) => Promise<X>`. The instance type `X` itself is unchanged, so `await new` yields `X`. Async CLASSES (a class constructor returning a Promise) are not detected — the syntactic shape carries no reliable signal without a type checker — and stay typed as the plain instance type; type them yourself in userland if you need `Promise<X>` there.\n\n**Avoid arrow handlers — use the ESLint plugin.** Construct handlers must be regular functions or classes so the instance can be substituted as `this`. Core rejects sync arrows at `define()` time, but async arrows cannot be detected at runtime and never receive the instance — the failure surfaces far from the cause. The early guard is [`eslint-plugin-no-arrow-this`](https://www.npmjs.com/package/eslint-plugin-no-arrow-this), which flags `this` inside arrow functions before the code runs:\n\n```javascript\nplugins: ['eslint-plugin-no-arrow-this'],\nrules: {\n\t// default: warn on `this` inside ANY arrow function\n\t'no-arrow-this/no-arrow-this': 'warn',\n\t// or restrict to the global/window capture case:\n\t// 'no-arrow-this/no-arrow-this': ['warn', { onlyGlobals: true }],\n},\n```\n\nRecommended in every mnemonica project.\n\n**Instance-type inheritance.** Nested instance types flatten the WHOLE ancestor chain: each nested type is `ProtoFlat<ParentInstance, Self>` (mnemonica's `ProtoFlat` keeps every parent key except the ones `Self` overrides), and the parent instance type is itself a `ProtoFlat` over its own parent — so the ROOT's own constructor-arg fields (`serial` in `WidgetRoot`) are directly present on every descendant instance type, at any depth, alongside intermediate ancestors' fields. If a root field appears missing on a nested type, the usual cause is a stale `.tactica` — regenerate; the composition itself is transitive by construction.\n\n### Legacy global-augmentation mode (`--module-augmentation`)\n\nEmits one `.tactica/index.d.ts` whose contents live inside `declare global { … }`. Reference it from your code with:\n\n```ts\n/// <reference types=\"./.tactica/index\" />\n```\n\nor by adding `./.tactica` to `compilerOptions.typeRoots`. Kept for backwards compatibility with older tactica integrations.\n\n## Type-Safe Lookup with `lookup()`\n\nMnemonica core exposes `lookup<K>()` against an empty `TypeRegistry` interface. Tactica's `registry.ts` augments that interface with all of your discovered types:\n\n```ts\n// .tactica/registry.ts  (generated)\ndeclare module 'mnemonica' {\n    interface TypeRegistry {\n        'UserType': new (data: { name: string; email: string }) => UserType;\n        'UserType.AdminType': new (data: { role: string }) => UserType_AdminType;\n    }\n}\n```\n\nOnce `registry.ts` is in your `tsc` compilation, the lookup is fully typed:\n\n```ts\nimport { lookup } from 'mnemonica';\nimport './.tactica/registry'; // or via tsconfig \"include\"\n\nconst UserType  = lookup('UserType');\nconst AdminType = lookup('UserType.AdminType');\n\nconst user  = new UserType({ name: 'John', email: 'j@x.dev' });\nconst admin = new user.AdminType({ role: 'admin' });\n```\n\nNo `as unknown as` casts required. See [`docs/lookup-pattern.md`](docs/lookup-pattern.md) for the consumer-side guide.\n\n## What Gets Analyzed\n\n### `define()` calls\n\n```ts\nconst UserType  = define('UserType', function (this: { name: string }) {\n    this.name = '';\n});\n\nconst AdminType = UserType.define('AdminType', function (this: { role: string }) {\n    this.role = 'admin';\n});\n```\n\nChained calls (`define('A').define('B')`) and nested calls via variable references (`const A = define('A', …); A.define('B', …)`) are both supported. A const holding a multi-hop initializer binds the LAST hop — `define()` returns the defined type's constructor, so `const Branch = Root.define('A', …).define('B', …)` makes `Branch` denote `Root.A.B` and `Branch.define('C', …)` nests C under B, exactly as the runtime does.\n\n**Call-site ergonomics (recommended pattern):** annotate the root constructor's `this` with the generated instance type alias — `define('Widget', function (this: TWidgetInstance, data: …) {…})`, with `TWidgetInstance` imported from the generated types file. The common form is an intersection — `type TWidgetInstance = TWidgetArgs & TGeneratedRootInstance`. Tactica tolerates the self-reference: the annotation is never emitted into the generated type (so no circularity can form), and it is **ergonomic-only** — its members are never expanded, so the root's fields must be carried by the constructor body: `Object.assign(this, args)` (the identifier form extracts every field from the named args type) or explicit `this.x = …` assignments. Property extraction falls back to the body / data parameter whenever the alias is not analyzable (it lives in the excluded `.tactica/`). With the generated `types.ts`/`registry.ts` in place, `new (lookup('Widget'))(args)` — and `new Widget(args)` where the const merges with the generated type — is directly assignable to the instance type at call sites, zero casts. Regenerate `.tactica` after adding the annotation.\n\n### `lazy()` definitions\n\n```ts\nconst AdminType = UserType.lazy(() => class AdminType {\n    role: string;\n    constructor (role: string) {\n        this.role = role;\n    }\n});\n```\n\nAll forms are recognized: free `lazy('Name', getter)`, method `Type.lazy(...)`, and chained `define('A').lazy('B', getter)`. The getter is followed, and the returned constructor is analyzed like a direct `define()` handler — properties and constructor parameters are extracted and emitted in `types.ts` / `registry.ts` like any other type.\n\n### Construction shapes beyond plain `new`\n\nThese usage shapes are recognized and attributed within the existing output contract (the `instantiation` usage kind and value-scope bindings — no new output fields):\n\n- **Chain construction** — `new Root(...).Child(...)` and the single-await form `await new Root(...).A(...).B(...)`: the chain-tip call records an `instantiation` of the tip type (`Root.A.B`), supplying the creation-graph anchor, and the result variable binds to the TIP's type, not the root's. `await` is transparent everywhere on this page — `await call(...)`, `await apply(...)`, `await entry.fork(...)`, and async `bind` recognition all work identically.\n- **`instance.fork(...)` / `instance.clone()`** (call forms) and **`instance.clone`** (the property form — core types it `readonly clone: this`) — runtime returns `this`, so the result variable binds to the source instance's type. Fork re-runs construction (hooks fire, a distinct instance on a distinct line), so these record an **`instantiation` usage** at the site — byte-indistinguishable from `new` until the deferred mechanism-kind revision; the result binding and the generic `methodCall`/`propertyRead` flow entries stay.\n- **`utils.merge(a, b, ...)`** (also the direct named import, and the curried `utils.fork(instance)(...)`) — the result binds to **arg 0's type**: the runtime answer is a's lineage over b's context, and a's fullPath is the honest approximation within the contract. Merge is `fork(a)` over b's context, so it records an `instantiation` for a's type too; the curried `utils.fork` records at the invocation site, and the inner `utils.fork(instance)` binding line records its own entry — one per distinct source line.\n- **`call(entity, Ctor, ...)` / `apply(entity, Ctor, args)`** — the mnemonica construction exports (import-aware: only actual `'mnemonica'` imports or members of a tracked module-object alias match; userland `call`/`apply` never do). The Ctor argument (arg 1) records an `instantiation`, and the result variable binds to the Ctor's type (runtime `InstanceResult<Merge<E, T>>` approximated by T). **Decorated classes resolve as the Ctor** through the same graph tiers — `@decorate() class C` is a known type, so `call(parent, C)` records and binds; an undecorated plain class has no graph entry, so the call binds nothing and records no usage (never a bare name). The free-call `decorate(Class)` form is not tracked (tactica recognizes the `@decorate` decorator syntax only).\n- **`bind(entity, Ctor)`** — records no usage (it constructs nothing); the bound variable binds to the Ctor's type. Invoking the bound function later (`f(...)`, including `await f(...)`) is not followed.\n\nThree boundaries stay deliberate: bindings surface only for references lexically AFTER the binding statement (a binding made inside a constructor body is not yet visible to that same handler's property extraction); a construction nested inside a class or function body of the initializer does not bind the outer variable (`const X = define('X', class { m = new Map() })` binds X to the defined type, never to `Map` — scope boundaries are not crossed); and the mechanism distinction (`new` vs fork vs call) is not carried in the outputs — fork/clone/merge record as plain `instantiation` entries, byte-indistinguishable from `new`, until the deferred mechanism-kind contract revision lands. Consumers counting constructions should expect fork sites among them.\n\n### Builder pattern on the imported module object\n\nThe analyzer also recognizes the chainable `mnemonica` module object and aliases of it:\n\n```ts\nimport { mnemonica } from 'mnemonica';\n\nconst App = mnemonica\n    .define('UserType', function (this: { name: string }) {\n        this.name = '';\n    })\n    .define('AdminType', function (this: { role: string }) {\n        this.role = 'admin';\n    });\n\n// Builder .lookup() results are followed\nApp.lookup('UserType').define('GuestType', function (this: { token: string }) {\n    this.token = '';\n});\n```\n\nIt also recognizes the explicit-source APIs:\n\n```ts\nimport { define, lookup } from 'mnemonica';\n\nconst AdminType = define(UserType, 'AdminType', function (this: { role: string }) {\n    this.role = 'admin';\n});\n\nconst AdminCtor = lookup(App, 'UserType.AdminType');\n```\n\n### Custom collections via `createTypesCollection()`\n\nTypes defined on a collection created with `createTypesCollection()` are tracked by the analyzer. By default they are **not** emitted in `.tactica/types.ts` and are **not** added to the global `mnemonica.TypeRegistry` augmentation because they live in an isolated runtime collection. Use the collection variable directly in your own code to get typed constructors.\n\nAll common import styles are recognized:\n\n```ts\nimport { createTypesCollection } from 'mnemonica';\n\nconst AppCollection = createTypesCollection();\n\nAppCollection.define('UserType', function (this: { name: string }) {\n    this.name = '';\n});\n```\n\n```ts\nimport { mnemonica } from 'mnemonica';\n\nconst AppCollection = mnemonica.createTypesCollection();\n```\n\n```ts\nimport * as mnemonica from 'mnemonica';\n\nconst AppCollection = mnemonica.createTypesCollection();\n```\n\n```ts\nimport { createTypesCollection as ctc } from 'mnemonica';\n\nconst AppCollection = ctc();\n```\n\nSubtypes defined from a collection type inherit the same collection membership:\n\n```ts\nconst UserType = AppCollection.define('UserType', function (this: { name: string }) {\n    this.name = '';\n});\n\nUserType.define('AdminType', function (this: { role: string }) {\n    this.role = 'admin';\n});\n```\n\nTwo independent collections may define root types with the same name without colliding in the analyzer graph.\n\n#### Option B — user-provided registry interface\n\nTo get fully typed `.lookup()` and `.decorate()` for a custom collection, export an empty interface and pass it to `createTypesCollection<Registry>()`:\n\n```ts\nimport { createTypesCollection } from 'mnemonica';\n\nexport interface AppCollectionRegistry {}\n\nconst AppCollection = createTypesCollection<AppCollectionRegistry>();\n\nconst UserType = AppCollection.define('UserType', function (this: { name: string }) {\n    this.name = '';\n});\n\nUserType.define('AdminType', function (this: { role: string }) {\n    this.role = 'admin';\n});\n```\n\nTactica then emits:\n\n- Prefixed instance types in `.tactica/types.ts`, e.g. `AppCollectionRegistry_UserType` and `AppCollectionRegistry_UserType_AdminType`.\n- A `declare module '<relative path to this file>'` block in `.tactica/registry.ts` that augments `AppCollectionRegistry` with `'UserType'` and `'UserType.AdminType'` entries.\n\nOnce `.tactica/registry.ts` is part of your `tsc` compilation, `AppCollection.lookup('UserType')` and `AppCollection.lookup('UserType.AdminType')` are fully typed. Constructor-relative lookups resolve too: a variable bound to `AppCollection.lookup('UserType')` resolves `.lookup('AdminType')` relative-first (the type's own subtypes, then the collection root) — the same law as for default-collection types.\n\nCustom collections also support `decorate()` for root types:\n\n```ts\n@AppCollection.decorate()\nclass UserType {\n    name: string = '';\n}\n```\n\nDecorated root types are included in the same per-collection augmentation.\n\n```ts\n@decorate()\nclass User {\n    name: string = '';\n}\n\n@decorate(User)\nclass Admin {\n    role: string = 'admin';\n}\n\n@decorate({ blockErrors: true, strictChain: false })\nclass Configurable {\n    value: string = '';\n}\n```\n\nDecorate-class instances need a cast to the generated instance type to access nested constructors at the type level:\n\n```ts\nconst gadget = new Gadget() as Gadget_EnhancedGadget; // … or whatever your generated alias is\nconst sub   = new gadget.EnhancedGadget();\n```\n\n### `Object.assign(this, data)` pattern\n\n```ts\nconst UserType = define('UserType', function (this: any, data: { name: string }) {\n    Object.assign(this, data); // properties inferred from `data` type\n});\n```\n\n### `TypeConstructor` casting (from mnemonica)\n\n```ts\nimport { define } from 'mnemonica';\nimport type { TypeConstructor } from 'mnemonica';\n\nconst MyFn = function (this: any) {\n    this.field = 123;\n} as TypeConstructor<{ field: number }>;\n\nconst MyFnType = define('MyFnType', MyFn);\n```\n\n(In older mnemonica documentation this helper was called `ConstructorFunction`; the analyzer still recognizes that name in source code for back-compat.)\n\n### Typeomatica integration\n\nTactica recognizes [typeomatica](https://github.com/wentout/typeomatica) patterns alongside mnemonica:\n\n```ts\nimport { decorate } from 'mnemonica';\nimport { Strict, BaseClass } from 'typeomatica';\n\n@decorate()\n@Strict({ someProp: 123 })\nclass StrictDecorated {\n    someProp!: number;\n}\n\n@decorate()\nclass MyBaseClass {\n    base_field = 555;\n}\n\nObject.setPrototypeOf(MyBaseClass.prototype, new BaseClass({ strict: true }));\n```\n\n### Topologica directory structures\n\n[Topologica](https://github.com/mythographica/topologica)-style directory hierarchies are scanned for handler files, and a type tree is built from the directory layout:\n\n```\nai-types/\n├── Sentience/\n│   ├── index.ts            // exports SentienceHandler(this, data)\n│   └── Consciousness/\n│       └── index.ts        // exports ConsciousnessHandler(this, data)\n```\n\nAuto-discovered directories (relative to `tsconfig.json`): `./ai-types`, `./types`, `./topologica-types`, plus the same names under `./src/`.\n\nAdd custom directories with `--topologica`:\n\n```bash\nnpx tactica --topologica ./src/ai-types,./custom/topologica\n```\n\n## Property Type Inference\n\nThe analyzer infers property types from constructor bodies and class members. Supported expression patterns:\n\n| Pattern | Inferred type |\n|---|---|\n| `this.x = 'foo'` | `string` |\n| `this.x = 123` | `number` |\n| `this.x = true` | `boolean` |\n| `this.x = []` / `new Array()` | `Array<…>` |\n| `this.x = {}` | `object` |\n| `this.x = new Date()` | `Date` |\n| `this.x = new Map()` / `new Set()` | `Map<unknown, unknown>` / `Set<unknown>` — a bare generic is never emitted (TS2314); explicit arguments survive: `new Map<string, number>()` → `Map<string, number>` |\n| `this.x = Date.now()` | `number` |\n| `this.x = parseInt(…)` / `parseFloat(…)` | `number` |\n| `this.x = String(…)` / `Number(…)` / `Boolean(…)` | `string` / `number` / `boolean` |\n| `this.x = a + b` (where `a, b: number`) | `number` |\n| `` this.x = `${a} ${b}` `` | `string` |\n| `this.x = data.field` | type of `data.field` from the parameter annotation |\n| `this.x = data.field` where `data: SomeNamedType` (alias/interface/class) | type of the field from the resolved declaration — import-aware, inherited members included; a bare `this.x = data` keeps the full expanded shape |\n| `this.x = data.field \\|\\| []` | type of the fallback expression |\n| `this.x = data.field ? a : b` | type of the truthy branch |\n| `this.x = (<const>['a', 'b'])[0]` / `this.x = ([…] as const)[1]` / `this.x = trackedList[2]` | the element's literal type (`'a'`) — const-asserted literal arrays either spelling, or a tracked module const array (`const trackedList = <const>[…]`); non-numeric/out-of-range/spread/non-literal elements and general `<T>` assertions stay `unknown` |\n| `Object.assign(this, data)` | all fields of `data`'s type annotation — inline literal or named alias/interface/class, resolved import-aware (F14 machinery) |\n| `this.x = boundVar` where `boundVar` holds a construction result (`new`/`lookup()`/chain/fork/merge/call) | the bound type's instance type (value-scope binding) — bindings surface lexically AFTER the binding statement; within the same constructor body a fresh binding is not yet visible to the handler's own extraction |\n| async / sync constructor functions | same rules |\n\nAn existing annotation always beats a weaker inference: `unknown` (and `unknown`-bearing guesses like `Array<unknown>`) never overwrites a known type — `Record<string, unknown>` IS a known type — and an overwrite never drops an optionality modifier.\n\n**Method/member return annotations** follow an emission law (0.2.0 behavior, restored after the F10 bare-name ban overshot): an annotation — or any type argument inside it — that resolves to a mnemonica graph type emits the generated alias (`SomeEntry[]` → `Array<EDSRoot_SomeEntry>`; generated-alias spellings resolve via the underscore→dotted law). `InstanceType<typeof X>` — directly or through a local alias (`XInstance = InstanceType<typeof X>`) — drops the wrapper and emits the generated alias (`Definitions_DefinitionEntry`), since the alias already IS the instance type; when X does not resolve to a graph type the WHOLE expression degrades to `unknown` — `InstanceType<unknown>` is invalid TypeScript (TS2344) and is never emitted. An outer generic that is a non-graph **ambient/lib** construct (`MapIterator`, lib helpers — not declared in any analyzed project file) is emitted **verbatim** with inner graph aliases resolved, since it needs no import in the generated file. A **project-local** non-graph name stays `unknown` — the self-contained `types.ts` can carry neither the bare name nor an import (ambiguity between same-named project declarations is the fatal class, as elsewhere). This law covers method/member return annotations; constructor-signature parameters keep their accepted mirror policy.\n\nWhen inference fails the property's type falls back to `unknown` (or `any` in some Topologica paths) — safe, and you can refine manually.\n\n### Referenced types in constructor signatures\n\nA constructor parameter that references a named type (`record: SharedShape`) resolves **through the importing file's own import statements** — relative and tsconfig-paths imports are followed to the declaration (chasing re-export barrels), and imported classes/interfaces/type aliases with extractable fields are expanded inline, **inherited members included**: `extends` chains are walked (depth-bounded, cycle-guarded) and parent fields merge with the declaration's own fields overriding on name clash. A field typed by a `typeof` query over a module-level const array (`status?: typeof statusList[number]`) expands to the element literal union (`status?: 'active' | 'closed'`); the value-level twin — element access over a const-asserted literal array (`(<const>['active', 'not_active', 'hold'])[0]`, `([…] as const)[1]`, or a tracked module const used as `x[0]`) — infers the element's literal type the same way; any other `typeof` source degrades that field to `unknown` — a bare `typeof name` is never emitted, since the generated file has no imports to resolve it against. An import is never shadowed by a same-named declaration elsewhere in the program. A reference that resolves not at all (a ghost name, declared nowhere) emits `unknown` — generated `.tactica/types.ts` carries no import statements of its own, so a bare unresolvable name is never emitted. A reference that resolves *ambiguously* — several of your project's files declare the name and no import chooses between them — is **fatal** like the mnemonica-graph identity law below: tactica prints the reference site and every declaration site, exits non-zero, and writes no output. An import anchoring the reference is never ambiguity (the import wins, duplicate declarations or not), and package-declared same-named types never count — a user-local declaration always wins over a node_modules `.d.ts`. Two same-named interfaces in one file are legal TypeScript merging, not ambiguity (see Known Limitations for the last-wins caveat).\n\n**Ambiguous plain-TypeScript reference — fails, and how to fix it.** Two plain interfaces named `SharedShape` exist in different files, and a third file references a bare `SharedShape` with nothing anchoring it:\n\n```ts\n// a.ts                              // b.ts\nexport interface SharedShape {      export interface SharedShape {\n\ta: string;                       \tb: number;\n}                                    }\n\n// consumer.ts — FATAL: which SharedShape?\nimport { define } from 'mnemonica';\n\nexport const Crate = define('Crate', function (this: Crate, data: SharedShape) {\n\tthis.item = data;\n});\n```\n\n```\ntactica: Ambiguous reference to type 'SharedShape': 2 declarations share the name and no import disambiguates — import the one you mean\n  at src/consumer.ts:6:67\n  at /abs/path/src/a.ts:1:1\n  at /abs/path/src/b.ts:1:1\ntactica: aborting — 1 resolution failure(s); no .tactica output written\n```\n\nFix it by importing the declaration you mean — the file's own import wins over every other tier:\n\n```ts\n// consumer.ts — OK: the import anchors SharedShape → a.ts\nimport { define } from 'mnemonica';\nimport { SharedShape } from './a';\n\nexport const Crate = define('Crate', function (this: Crate, data: SharedShape) {\n\tthis.item = data; // item: { a: string }\n});\n```\n\nQualified references through a namespace import resolve one level per segment: `models.SharedShape` finds the declaration in the namespace import's module; multi-level paths (`holders.Inner.Crate`, `barrel.Deep.Gadget`) descend through namespace declarations, `export * as ns from '…'` barrels, and named re-exports of namespaces — each segment disambiguates, so two namespaces may declare the same name without colliding. What is *not* followed: ambient string-named modules (`declare module '…'`), default-export shapes behind a namespace segment, and type-only constructs with no extractable fields (unions of literals, mapped types) — those emit `unknown` like any other unresolvable reference.\n\nReferences to **mnemonica graph types** (types declared via `define()`, as opposed to plain TypeScript declarations) follow the runtime lookup law instead: the file's own value bindings and imports anchor the name first, then the defining type's own chain relative-first, then its collection's roots, then a program-wide search that must be unique. Same-namespace duplicate definitions (which the mnemonica runtime rejects with `ALREADY_DECLARED`) and graph references that stay ambiguous or unresolved are fatal: tactica prints every location, exits non-zero, and writes no `.tactica` output at all.\n\n**Ambiguous reference — fails, and how to fix it.** Two types named `Token` exist under different parents, and a third file references a bare `Token` with nothing anchoring it:\n\n```ts\n// defs.ts\nexport const Holder = define('Holder', function (this: Holder) { /* … */ });\nexport const Token = Holder.define('Token', function (this: Token, data: { mark: string }) { /* … */ });\n\n// other.ts\nexport const Other = define('Other', function (this: Other) { /* … */ });\nOther.define('Token', function (this: Token, data: { hue: string }) { /* … */ });\n\n// consumer.ts — FATAL: which Token?\nexport const Crate = define('Crate', function (this: Crate, data: Token) {\n\tthis.item = data;\n});\n```\n\n```\ntactica: Ambiguous reference to mnemonica type 'Token': 2 types share the name and neither the parent chain nor the imports disambiguate\n  at src/consumer.ts:7:67\n  at src/defs.ts:8:29\n  at src/other.ts:9:7\ntactica: aborting — 1 resolution failure(s); no .tactica output written\n```\n\nFix it by anchoring the reference — either import the constructor you mean (the import wins over every other tier), or use the full generated name:\n\n```ts\n// consumer.ts — OK: the import anchors Token → Holder.Token\nimport { Token } from './defs';\nexport const Crate = define('Crate', function (this: Crate, data: Token) {\n\tthis.item = data;\n});\n\n// or — OK: fully-qualified generated type name\nexport const Crate = define('Crate', function (this: Crate, data: Holder_Token) {\n\tthis.item = data;\n});\n```\n\n**Duplicate in one namespace — fails, and there is only one fix.** Two types with the same name under the same parent (or two same-named roots) are what the mnemonica runtime rejects with `ALREADY_DECLARED`; tactica fails the generation instead of emitting a wrong graph:\n\n```ts\n// dup-a.ts                     // dup-b.ts\nexport const A = define(        export const B = define(\n\t'DupRoot', …);              \t'DupRoot', …);\n```\n\n```\ntactica: Duplicate definition of 'DupRoot' in one namespace — the mnemonica runtime would throw ALREADY_DECLARED\n  at src/dup-a.ts:3:22\n  at src/dup-b.ts:6:23\ntactica: aborting — 1 resolution failure(s); no .tactica output written\n```\n\nRename one of them. Same-named types under **different** parents (`User.Address` and `Company.Address`) are legal mnemonica and never reported.\n\n**Unresolved `lookup()` path — fails, with a did-you-mean.** Literal `lookup()` paths are validated against the complete graph after analysis. A path matching no type is what the runtime answers with `undefined` — the `TypeError` arrives one line later at the `new` — so it is fatal too, and same-named types elsewhere in the graph are listed as candidates:\n\n```ts\n// consumer.ts — FATAL: no root 'Token'; Holder.Token and Other.Token exist\nconst TokenCtor = lookup('Token');\nexport const instance = new TokenCtor({ mark: 'x' });\n```\n\n```\ntactica: Unresolved lookup of mnemonica type 'Token': the runtime would return undefined — 2 graph type(s) carry the name off-root (Holder.Token, Other.Token); use the full dotted path\n  at src/consumer.ts:6:19\n  at src/defs.ts:8:29\n  at src/other.ts:9:7\ntactica: aborting — 1 resolution failure(s); no .tactica output written\n```\n\n```ts\n// OK: dotted absolute path, or receiver-relative resolution\nconst ByPath     = lookup('Holder.Token');\nconst ByReceiver = Holder.lookup('Token');\n```\n\nNon-literal lookup arguments (computed strings) stay best-effort and are not validated.\n\n## API Reference\n\n### `MnemonicaAnalyzer`\n\n```ts\nclass MnemonicaAnalyzer {\n    constructor(program?: ts.Program, plugins?: TacticaPlugin[]);\n\n    analyzeFile(sourceFile: ts.SourceFile): AnalyzeResult;\n    analyzeSource(sourceCode: string, fileName?: string): AnalyzeResult;\n\n    resetUsages(): void;                    // call between definition pass and usage pass\n    addTopologicaType(fullPath: string, node: TypeNode): void;\n\n    getGraph(): TypeGraphImpl;\n    getDefinitions(): Map<string, DefinitionInfo>;\n    getUsages():      Map<string, UsageInfo[]>;\n    getEDSUsages():   Map<string, EDSInfo[]>;\n    getFlowUsages():  Map<string, FlowInfo[]>;\n    getInstrumentationPoints(): InstrumentationPoint[];\n    getResolutionErrors(): ResolutionError[];  // fatal duplicate/ambiguous graph + plain-TS references (hard-fail law)\n}\n```\n\n### `TopologicaAnalyzer`\n\n```ts\nclass TopologicaAnalyzer {\n    analyzeDirectory(directoryPath: string): { types: Map<string, TypeNode>; errors: string[] };\n    getGraph(): TypeGraphImpl;\n    getErrors(): string[];\n}\n```\n\n### `TypeGraphImpl`\n\n```ts\nclass TypeGraphImpl implements TypeGraph {\n    roots:    Map<string, TypeNode>;\n    allTypes: Map<string, TypeNode>;\n\n    addRoot(node: TypeNode): void;\n    addChild(parent: TypeNode, child: TypeNode): void;\n    findType(fullPath: string): TypeNode | undefined;\n    findTypeByName(name: string): TypeNode | undefined;\n    getAllTypes(): TypeNode[];\n    clear(): void;\n\n    *bfs(): Generator<TypeNode>;\n    *dfs(node?: TypeNode): Generator<TypeNode>;\n\n    static createNode(name, parent, sourceFile, line, column, collectionId?): TypeNode;\n}\n```\n\n### `TypesGenerator`\n\n```ts\nclass TypesGenerator {\n    constructor(graph: TypeGraphImpl, esm?: boolean);\n\n    generateTypesFile():           GeneratedTypes; // default mode → types.ts\n    generateTypeRegistry():        GeneratedTypes; // default mode → registry.ts\n    generateGlobalAugmentation():  GeneratedTypes; // legacy mode  → index.d.ts\n    generateSingleType(node: TypeNode): string;\n}\n```\n\n### `ModuleGraphBuilder`\n\nModule-scope walker. Tracks every export/import binding of every module —\ngenerically, not only mnemonica types — and resolves specifiers with\n`ts.resolveModuleName` driven by the program's compilerOptions\n(no `getTypeChecker()`).\n\n```ts\nclass ModuleGraphBuilder {\n    constructor(program?: ts.Program, compilerOptions?: ts.CompilerOptions);\n\n    addFile(sourceFile: ts.SourceFile): ModuleInfo;   // call per file (definitions pass)\n    build(definedTypesByFile?: Map<string, string[]>): ModuleGraph;\n}\n```\n\n`ModuleGraph` = `{ modules: Map<absPath, ModuleInfo>, edges: CrossModuleUsage[], cycles: string[][] }`.\nEach `ModuleBinding` carries `{ name, kind: 'function'|'class'|'const'|'type'|'unknown',\nsourceModule (resolved project-relative path), importKind?, importAlias?, isReExport, external? }`.\nNode.js builtins (`'path'`, `'node:fs'`, …) are skipped entirely and recorded\nonly in the module's `builtinSpecifiers`; bindings resolved into `node_modules`\ncarry `external: true` and never enter `dependencies`. Re-export chains\n(barrels, `export * from`) are chased to the origin module when producing\n`edges`; circular imports are recorded in `cycles`, never treated as errors.\nUnused-export detection is internal only — nothing about it is emitted.\n\n### `LocalScopeWalker`\n\nLocal-scope walker. Tracks function/method/arrow scopes only (no block\nscopes), plus one synthetic module scope per file. Variables carry\n`isParameter`, `isMutable` (const vs let/var; `this` parameters are\nimmutable), and `reassignments` — every reassignment site of a mutable\nbinding is a flow-termination point where downstream walking stops.\n\n```ts\nclass LocalScopeWalker {\n    addFile(sourceFile: ts.SourceFile): void;         // call per file\n    build(resolver?: ScopeTypeResolver): ScopeAnalysis;\n    findHolderScopeId(location: string): string | undefined;\n\n    static attachHolderScopeIds(usages: Map<string, UsageInfo[]>, walker: LocalScopeWalker): void;\n}\n\ninterface ScopeTypeResolver {\n    resolveByName(name: string): string | undefined;  // bare name → mnemonica fullPath\n    hasPath(fullPath: string): boolean;\n}\n```\n\n`ScopeAnalysis` = `{ scopes: Map<scopeId, ScopeInfo>, variables: Map<'scopeId#name', ScopeVariable> }`.\nScope ids: module scope = file path; function scopes = `file:line:col`.\nLabels: functions by name, methods as `Class.method`, arrows by the binding\nthey are assigned to, anonymous holders as `file:line`. Never relies on\n`node.parent` (program files can be unbound).\n\n### `TypesWriter`\n\n```ts\nclass TypesWriter {\n    constructor(outputDir?: string);\n\n    writeTypesFile(generated: GeneratedTypes): string;          // → outputDir/types.ts\n    writeGlobalAugmentation(generated: GeneratedTypes): string; // → outputDir/index.d.ts\n    writeTo(filename: string, content: string): string;         // → outputDir/<filename>\n\n    writeDefinitionsFile(map: Map<string, DefinitionInfo>): string; // → outputDir/definitions.json\n    writeUsagesFile     (map: Map<string, UsageInfo[]>):    string; // → outputDir/usages.json\n    writeEDSFile        (map: Map<string, EDSInfo[]>):      string; // → outputDir/eds.json\n    writeFlowFile       (map: Map<string, FlowInfo[]>):     string; // → outputDir/flow.json\n    writeInstrumentationFile(points: InstrumentationPoint[], creationGraph?: CreationGraph): string; // → outputDir/instrumentation.json\n    writeModulesFile      (graph: ModuleGraph):             string; // → outputDir/modules.json\n    writeScopesFile       (analysis: ScopeAnalysis):        string; // → outputDir/scopes.json\n\n    write(generated: GeneratedTypes): string; // legacy alias for writeTypesFile\n    clean(): void;\n    getOutputDir(): string;\n}\n```\n\n### Types\n\n`TacticaConfig`, `TypeNode`, `TypeGraph`, `PropertyInfo`, `ConstructorParamInfo`, `AnalyzeResult`, `AnalyzeError`, `GeneratedTypes`, `DefinitionInfo`, `UsageInfo`, `UsagesJson`, `DefinitionsJson`, `EDSInfo`, `EDSJson`, `EDSKind`, `FlowInfo`, `FlowJson`, `FlowKind`, `InstrumentationKind`, `InstrumentationScope`, `InstrumentationPoint`, `InstrumentationJson`, `ModuleBindingKind`, `ModuleImportKind`, `ModuleBinding`, `ModuleInfo`, `CrossModuleUsage`, `ModuleGraph`, `ModulesJson`, `ScopeKind`, `ScopeInfo`, `ScopeVariable`, `ScopeAnalysis`, `ScopesJson`, `CreationGraphNode`, `CreationGraphEdge`, `CreationAnchor`, `CreationGraph`, `TacticaPlugin`, `InstrumentationVocabulary` — all exported from `@mnemonica/tactica`. See [`src/types.ts`](src/types.ts) for the full schema. The `mergeTacticaPlugins(plugins)` helper merges plugin vocabulary the same way the analyzer does.\n\n## EDS (Execution Data Storage) Tracking\n\nWhen enabled, tactica detects execution-flow patterns alongside type definitions. Each detection emits a record into `.tactica/eds.json`.\n\n| Function | EDS kind | Description |\n|---|---|---|\n| `wrap(fn)`, `wrapConstructorArg(fn, parent)`, `upgradeConstructorArg(arg, inst)`, `wrapInstanceMethods(obj)` | `wrap` | Wrap a function / constructor argument / instance methods for context propagation and tracing (`@mnemonica/dive`) |\n| `current()`, `getErrorInstance(err)`, `getFlow(target?)` | `contextConsume` | Read the current context, the error-pinned instance, or the recorded flow (`@mnemonica/dive`) |\n| `attachHooks(collection)` | `hookAttach` | Wire a TypesCollection to dive's lifecycle tracing (`@mnemonica/otel`) |\n\n`eds.json` structure:\n\n```json\n{\n    \"version\": \"1.0\",\n    \"generatedAt\": \"2026-05-22T…\",\n    \"eds\": {\n        \"UserEntity\": [\n            {\n                \"location\": \"src/queue.ts:45:12\",\n                \"kind\": \"wrap\",\n                \"code\": \"wrap(process)\",\n                \"targetType\": \"UserEntity\"\n            }\n        ]\n    }\n}\n```\n\n`wrap` entries additionally carry graph-join fields (all optional, additive):\n\n- `label` — the label string literal of `wrap(fn, …, 'label')` when statically visible.\n- `callbackScopeId` — the scopeId (scopes.json) of the wrapped callback's own scope; the callback is what the wrapper runs, so graph consumers join on it first.\n- `instanceArg` — the identifier passed as the instance/context argument (`user` in `wrap(fn, user)`), when it is one.\n- `scopeId` — the scopeId of the scope holding the wrap call site (fallback join).\n- `wrapsTypePath` — the mnemonica fullPath of the instance argument, resolved through the scope-variable chain (innermost binding wins; an untyped local shadows a typed outer one rather than being guessed).\n- `via` — the location of the enclosing wrap site when the call is nested inside another wrapped body (or returns a function): the wrappers-graph generation chain is built from it.\n- `scope` — the enclosing mnemonica type path. Lexical scoping (the owning `define()`/`lazy()` handler or `@decorate()`-ed class) wins; a wrap site outside any handler — the fire-and-forget-wrapper shape — is attributed through its instance/context argument (a tracked assignment like `const holder = new Holder(…)`, the enclosing function's parameter annotation resolved through the graph law, or a `let`/`var`/`const` declaration with an EXPLICIT type annotation like `let updateCommitted: LedgerUpdate;` — declaration-site typing only, no flow analysis; the annotation may be the type name or the generated nested-type alias (`UpdatePay_SomeTerminal`, mapped by the underscore→dotted naming law)); the wrap CALLEE identifier also follows a `let`/`var` binding to its first statically-visible in-scope assignment — the catch-guard pattern (`let fn; try { fn = new T(…) } catch { return } wrap(fn, …)`) attributes as `T`, while closure-only assignments and never-assigned bindings stay `unknown` (function/class boundaries are not crossed). One discipline covers both wrap arguments: assignment evidence beats an explicit annotation claim (`let fn: T`, or a wrapper arriving as an annotated parameter) beats `unknown` — the annotation pins the type only when the assignment is not resolvable (a userland call return, say). Nested sites (function-valued returns, lexically nested wraps) inherit the causing wrap site's scope down the `via` chain. An UNANNOTATED `let`/`var` still buckets under `unknown` (the analyzer does not track assignments flow-sensitively) — a `const` with an analyzable initializer stays the recommended discipline. Sites attributable to nothing stay under the `unknown` key with `scope` absent.\n\n## Instrumentation Points\n\nTactica statically detects framework lifecycle crossroads — interceptors, guards, pipes, exception filters, middleware — purely syntactically (no type checker), and always emits `.tactica/instrumentation.json`. **Tactica core ships no framework vocabulary**: detection is driven entirely by plugins, so with no plugins loaded `points` is `[]`. Framework adapters ship a plugin; projects enable it through a `.tactica.js` (or `tactica.config.js`) config file next to `tsconfig.json`:\n\n```js\n// .tactica.js\nmodule.exports = {\n    plugins: [ '@mnemonica/example-adapter/tactica' ],\n};\n```\n\nPlugin entries are module specifiers (required relative to the config file) or inline plugin objects. A plugin is a plain object:\n\n```ts\ninterface TacticaPlugin {\n    name?: string;\n    // `implements X` heritage matches: interface identifier -> kind\n    instrumentationInterfaces?: Record<string, InstrumentationKind>;\n    // `@X(Impl)` decorator sites: decorator identifier -> kind\n    useDecorators?: Record<string, InstrumentationKind>;\n    // `{ provide: TOKEN, useClass: Impl }` registrations: token identifier -> kind\n    appTokens?: Record<string, InstrumentationKind>;\n    // factory calls inside listed decorators' args: factory method name ->\n    // kind + which factory-call argument holds the target class (default 0)\n    decoratorArgFactories?: Record<string, { kind: InstrumentationKind; targetArg?: number }>;\n    // opt in to shape-based `consumer.apply(Mw).forRoutes(...)` detection\n    middlewareWiring?: boolean;\n}\n```\n\nProgrammatic callers pass plugins directly: `new MnemonicaAnalyzer(program, plugins)` or `run({ …, plugins })`; config-file plugins append after programmatic ones, and later plugins override earlier ones on the same identifier key. Detection covers:\n\n- **Heritage** — `class X implements <plugin-listed interface>` (matched by interface identifier name). Bare declarations carry scope `module` (attachment statically unknown).\n- **Decorator sites** — plugin-listed decorators on classes, methods, or method parameters, including inline instances (`@Register(new Impl(…))`). One point per referenced class; scope is `controller:<Name>` or `method:<Class>.<method>` (parameter-decorated sites take the enclosing method's scope — the attachment is the handler, not the argument name).\n- **Decorator-arg factories** — a `CallExpression` argument of the form `<anything>.<factory>(…)` inside a listed decorator's args (class, method, or parameter position), e.g. `@UsePipes(mvp.forType(Dto))` and the parameter form `@Body(mvp.forType(Entity, Dto))`: when `<factory>` is plugin-listed, a point of the configured `kind` is emitted with the class in `targetArg` (default 0) as the target. Factory calls whose method name is not listed are ignored, as are listed factories whose configured position is not an identifier. Points resolve `location`/`code` to the target's declaration and dedupe exactly like other decorator sites.\n- **Global providers** — `{ provide: <plugin-listed token>, useClass: X }` object literals → scope `global`. `useExisting`/`useFactory` without `useClass` are skipped.\n- **Middleware wiring** — `consumer.apply(Mw).forRoutes(...)` inside a class's `configure()` method → scope `module`, targets from `forRoutes` arguments when statically readable. Requires `middlewareWiring: true` from any loaded plugin.\n\nWhen a referenced class is declared in the analyzed project, the point's `location`/`code` resolve to the class declaration; external classes keep the registration site. Points are deduped by `(kind, className, location, scope)` with `targets` merged — a class seen via both heritage and a decorator yields separate entries per scope, with the bare declaration carrying scope `module`.\n\n`instrumentation.json` structure (v2):\n\n```json\n{\n    \"version\": 2,\n    \"generatedAt\": \"2026-09-04T…\",\n    \"points\": [\n        {\n            \"kind\": \"pipe\",\n            \"className\": \"PayloadPipe\",\n            \"location\": \"src/user.controller.ts:49:2\",\n            \"code\": \"@RegisterPipe(new PayloadPipe({ transform: true }))\",\n            \"scope\": \"method:UserController.createUser\",\n            \"targets\": [\"UserController\"]\n        }\n    ],\n    \"creationGraph\": {\n        \"nodes\": [\n            {\n                \"scopeId\": \"src/main.ts\",\n                \"name\": \"src/main.ts\",\n                \"kind\": \"module\",\n                \"filePath\": \"src/main.ts\",\n                \"location\": \"src/main.ts:1:1\",\n                \"starter\": true\n            }\n        ],\n        \"edges\": [\n            { \"caller\": \"src/main.ts\", \"callee\": \"src/user.service.ts:26:2\" }\n        ],\n        \"anchors\": [\n            {\n                \"location\": \"src/user.service.ts:29:24\",\n                \"holderScopeId\": \"src/user.service.ts:26:2\",\n                \"typePath\": \"UserEntity.UserResponse\",\n                \"constructorText\": \"user.UserResponse\",\n                \"variable\": \"userResponse\"\n            }\n        ]\n    }\n}\n```\n\n## Creation graph (inside-out walk)\n\nThe `creationGraph` key is the third phase of the instrumentation walker: it starts at the certain points — every `usages.json` `instantiation` entry (each carries a `holderScopeId` into `scopes.json`) — and walks **outward**: who invokes or references the holder function, crossing files through `modules.json` (re-export barrels chased to the origin module), until no callers remain. Terminals are the **starters** (application entry points); the walk never assumes a linear type Trie (mnemonica `strictChain: false` permits cycles and out-of-order construction), so traversal is cycle-guarded and every anchor records the constructor expression actually used.\n\n- **Nodes** are scopes (`module` / `function` / `method` / `arrow`), labeled like `scopes.json`; `starter: true` marks nodes with no discovered callers.\n- **Edges** point `caller → callee`, where the callee is closer to the creation site.\n- **Anchors** pin each creation site to its holder scope: `typePath`, the `constructorText` used, `rooted: true` for module-scope creations (a legitimate root or a developer error — labeled, not policed), and a `variable`/`terminatedAt` pair from a documented heuristic: the variable declared in the holder scope on the same line as the creation (typePath must match when known), with `terminatedAt` being that variable's first reassignment site — the flow-termination point where the walk stops following the binding.\n\nDeliberate approximations (name-based, no type checker): namespace imports count any reference to the alias once the namespace's module exposes the holder's export; method holders bind to their **class** name (that is what callers reference); any non-declaration identifier counts as a reference. Export wiring alone (`export { f }`, `export default f`) is not a caller — an importer's usage creates the edge.\n\n## How It Works\n\n1. **Parse** — load `tsconfig.json`, build a `ts.Program`, walk each source file's AST.\n2. **Detect** — find `define()` and `@decorate()` calls, plus `lookup` lookups, `new` expressions, and EDS / flow patterns.\n3. **Graph** — build a Trie of types in `TypeGraphImpl`, with parent links via the chain of `.define()` calls and `@decorate(Parent)` references.\n4. **Generate** — emit `types.ts`, `registry.ts`, `index.ts` (default mode) or `index.d.ts` (legacy mode), plus `definitions.json`, `usages.json` (with `holderScopeId`), `flow.json`, `instrumentation.json`, `modules.json`, `scopes.json`, `hierarchy.json`/`hierarchy.txt`, `collections.json`, and optionally `eds.json`.\n5. **Write** — files land in the output directory (default `.tactica/`).\n\n```\nType Hierarchy (Trie)\n├── UserType\n│   ├── properties: { name: string }\n│   └── AdminType\n│       ├── properties: { role: string }\n│       └── SuperAdminType\n│           └── properties: { permissions: string[] }\n└── JobType\n    └── properties: { tasks: Task[] }\n```\n\n## Known Limitations\n\n### Rest / spread parameters with tuple types\n\nThe analyzer cannot extract property types from rest parameters that use tuple types:\n\n```ts\n// ❌ Property types resolve to unknown\nexport const UserEntity = define('UserEntity', function (\n    this: UserEntityInstance,\n    ...args: [{ id: string; email: string; name: string }, ...unknown[]]\n) {\n    const data = args[0];\n    Object.assign(this, data);\n});\n```\n\n**Workaround:** use a direct parameter with the same type annotation.\n\n### Deep nested property access\n\nMulti-level property access in constructors falls back to `unknown`:\n\n```ts\n// ⚠️ this.name's inferred type is unknown\nconst UserType = define('UserType', function (this: any, data: { profile: { name: string } }) {\n    this.name = data.profile.name;\n});\n```\n\n**Workaround:** flatten the data structure or use a direct parameter.\n\n### `exposeInstanceMethods` is not parsed\n\nMnemonica accepts the `exposeInstanceMethods` option at runtime, but tactica's `extractConfig()` only parses `strictChain` and `blockErrors` from `define()` options today. The runtime behavior is unaffected.\n\n### Single-pass analysis without binding\n\nThe analyzer does not use `ts.Program.getTypeChecker()` for resolution. Plain TypeScript references in constructor signatures resolve through the importing file's import statements first, then its local declarations, and only then a unique same-named declaration across the scanned files — so a reference whose name is genuinely absent (or lives behind unresolvable specifiers) resolves to `unknown`, while a name several of your own files declare with no import to disambiguate fails hard (see above). References to mnemonica graph types follow the path-aware lookup law described above and fail hard instead of degrading to `unknown`.\n\nTwo expansion boundaries stay name-based and deliberate: **heritage** — `extends` chains are walked through the same import-aware machinery (depth-capped, cycle-guarded), but bases that resolve to an external/node_modules declaration or to a non-identifier expression (mixin calls like `extends mixin(X)`) are not followed — their inherited fields simply stay absent, same as before the walk existed. And **`typeof` fields** — only module-level const arrays with statically visible literal elements expand to the literal union, with the index suffix consumed entirely (`typeof statusList[number]` emits exactly `'active' | 'not_active' | 'hold'`, never `'hold'[number]`). The value-level twin — element access over a const-asserted literal array (`(<const>[…])[0]`, `([…] as const)[1]`, tracked `x[0]`) — infers the element literal under the same rules; non-numeric, out-of-range, spread, or non-literal elements and general `<T>` assertions (as opposed to `<const>`) stay `unknown`. Any assertion spelling is tracked (`[…] as const`, `satisfies`, `<const>[…]`), and signed numeric literals keep their sign (`-1 | 1`). Cross-file only when the const is imported by the declaring file. Every other `typeof` source — and any indexed-access target that fails to resolve — degrades the whole expression to `unknown`: an index suffix glued onto a fallback type (`unknown[number]`) is invalid TypeScript and is never emitted. A sibling emission law governs method/member return annotations (0.2.0 behavior restored after the F10 bare-name ban overshot): inner type arguments resolving to graph types emit the generated aliases; `InstanceType<typeof X>` (directly or via a local alias) drops the wrapper and emits the alias — X unresolvable degrades the WHOLE expression to `unknown`, never `InstanceType<unknown>` (invalid TS, TS2344); a non-graph **ambient/lib** outer generic (`MapIterator`, lib helpers — not declared in any analyzed project file) emits verbatim with inner aliases resolved; a **project-local** non-graph name stays `unknown` (no imports in the generated file; same-named ambiguity is the fatal class). Constructor-signature parameters keep their accepted mirror policy and are not covered.\n\n### Same-file interface merging is last-wins\n\nTwo same-named interfaces in ONE module are legal TypeScript declaration merging, and tactica does not treat them as ambiguity (the fatal class is same-named declarations across several files, unanchored by an import). Resolution keeps a single declaration per name per file, and it is the last one — members from earlier declarations are not combined:\n\n```ts\n// merged.ts — resolves to { b: number }; the `a: string` member is not picked up\nexport interface SharedShape { a: string; }\nexport interface SharedShape { b: number; }\n```\n\n**Workaround:** declare the merged shape once, or split the interfaces under distinct names and import the one you mean.\n\n### Custom collection name conflicts\n\nCustom collection types are isolated in the analyzer by their collection identity: each collection root lives under a `collectionId::`-prefixed full path, so two collections may both define a root type with the same name (e.g., both defining `'User'`) without overwriting each other — in the graph, in traversal, in `hierarchy.json`, and in generated output. By default custom-collection types are not emitted in `.tactica/types.ts` at all; with Option B they are emitted prefixed by their registry interface name, so they stay distinct there too.\n\n## Troubleshooting\n\n**Generated types are missing properties** — make sure the constructor function has either an explicit `this:` type annotation, or that the data parameter has an inline / aliased type (`{ id: string }` or `Foo` where `type Foo = { id: string }`). Property inference walks one level of indirection.\n\n**`new user.AdminType()` shows red squiggles** — confirm `.tactica/types.ts` is in your `tsconfig.json` `include`. If you use `lookup`, also import `.tactica/registry.ts` somewhere.\n\n**`mnemographica` (VS Code extension) shows no graph** — confirm `.tactica/definitions.json` and `.tactica/types.ts` exist; run `npx tactica --verbose` to see what was discovered.\n\n**`@mnemonica/dive` users**: EDS data should appear in `.tactica/eds.json`. If it's missing, run with `--eds --verbose` to force-enable and check the log.\n\n## Testing\n\n```bash\nnpm test                  # mocha + chai, all suites\nnpm run test:coverage     # nyc text report\nnpm run test:coverage:html  # nyc html report\n```\n\n## Related Projects\n\n- [mnemonica](https://github.com/wentout/mnemonica) — the instance-inheritance runtime that this generator targets\n- [typeomatica](https://github.com/wentout/typeomatica) — companion runtime type guards (`@Strict`, `BaseClass`)\n- [@mnemonica/topologica](https://github.com/mythographica/topologica) — filesystem-based type discovery (consumed by tactica's `--topologica` mode)\n- [mnemographica](https://github.com/mythographica/mnemographica) — VS Code extension that consumes tactica's `.tactica/` output for IDE features\n\n## License\n\nMIT\n","readmeFilename":"README.md"}