{"_id":"@absmartly/cli","_rev":"14-b6b44083c2f15b461bf95c989176d4d5","name":"@absmartly/cli","dist-tags":{"latest":"1.14.0"},"versions":{"1.0.0":{"name":"@absmartly/cli","version":"1.0.0","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/cli@1.0.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/cli-ts#readme","bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"dist":{"shasum":"b31b26de72884c3c7dd1d52227b74348d48864f6","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.0.0.tgz","fileCount":1451,"integrity":"sha512-a2QJQgHEWJzC4ifVAfZ0N9bYHg6VS36Vc7pJDQu1CbnIEUa4D+q+DMPJH7WOq2i8pRRg+/Adw+77NwdgheewwA==","signatures":[{"sig":"MEYCIQDoV9e5NWBwXvdKPCq3+kqFIdBNGClyWkoe+KTf4SZfAwIhAM5vF5ENqf4Fom4Iv/LgY1Mw6p2mdyxkKz0edscXE/ck","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1999106},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"}},"scripts":{"dev":"bun src/index.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsc","format":"prettier --write 'src/**/*.ts'","prepare":"git config core.hooksPath .githooks","test:ui":"vitest --ui","test:run":"vitest run","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","typecheck":"tsc --noEmit","build:watch":"tsc --watch","test:coverage":"vitest run --coverage","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1"},"_npmUser":{"name":"joalves","email":"jonas@absmartly.com"},"repository":{"url":"git+https://github.com/absmartly/cli-ts.git","type":"git"},"_npmVersion":"11.3.0","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"open":"^10.1.0","axios":"^1.7.9","chalk":"^5.4.1","keytar":"^7.9.0","marked":"^17.0.5","js-yaml":"^4.1.0","commander":"^12.1.0","cli-table3":"^0.6.5","image-size":"^2.0.2","axios-retry":"^4.5.0","gray-matter":"^4.0.3","cli-highlight":"^2.1.11","marked-terminal":"^7.3.0","@inquirer/prompts":"^8.3.2"},"typesVersions":{"*":{"config":["./dist/config-export/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"api-client":["./dist/api-client/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.8","jsdom":"^28.0.0","dotenv":"^16.4.7","eslint":"^9.19.0","vitest":"^4.0.18","prettier":"^3.4.2","@vitest/ui":"^4.0.18","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^25.2.1","@types/js-yaml":"^4.0.9","@faker-js/faker":"^10.2.0","@vitest/coverage-v8":"^4.1.4","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","@typescript-eslint/parser":"^8.21.0","@typescript-eslint/eslint-plugin":"^8.21.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.0.0_1776086504427_0.21192326045265797","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@absmartly/cli","version":"1.1.0","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/cli@1.1.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/cli-ts#readme","bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"dist":{"shasum":"b96cc4a643a6bbb578b5c08259a0aef8f45604e6","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.1.0.tgz","fileCount":1139,"integrity":"sha512-0/c1nwjkhFg+e6EgcoiybAu/3TI5zMQQ5aKFGp4LkgxDe7dsg41F1HqD8l7MoVrEzq9NyiGaV9m3WrgL/mdJwQ==","signatures":[{"sig":"MEQCIGvajscXSr6/PgItRWwq5BF+qMPDYj2ko9VDYQXrTClgAiAsQQlD45fbQzXchk2Le5vbv9zuMQ+Etr8I8kK7pm7WHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fcli@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1889892},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"}},"gitHead":"f957adebac0fa5837f9de23fcd471aed7a4bb48b","scripts":{"dev":"bun src/index.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsc","format":"prettier --write 'src/**/*.ts'","prepare":"git config core.hooksPath .githooks","test:ui":"vitest --ui","test:run":"vitest run","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","typecheck":"tsc --noEmit","build:watch":"tsc --watch","test:coverage":"vitest run --coverage","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ee311575-3913-43d1-a9f7-36dcc50a73ab"}},"repository":{"url":"git+https://github.com/absmartly/cli-ts.git","type":"git"},"_npmVersion":"11.11.0","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"open":"^10.1.0","axios":"^1.7.9","chalk":"^5.4.1","keytar":"^7.9.0","marked":"^17.0.5","js-yaml":"^4.1.0","commander":"^12.1.0","cli-table3":"^0.6.5","image-size":"^2.0.2","axios-retry":"^4.5.0","gray-matter":"^4.0.3","cli-highlight":"^2.1.11","marked-terminal":"^7.3.0","@inquirer/prompts":"^8.3.2"},"typesVersions":{"*":{"config":["./dist/config-export/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"api-client":["./dist/api-client/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.8","jsdom":"^28.0.0","dotenv":"^16.4.7","eslint":"^9.19.0","vitest":"^4.0.18","prettier":"^3.4.2","@vitest/ui":"^4.0.18","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^25.2.1","@types/js-yaml":"^4.0.9","@faker-js/faker":"^10.2.0","@vitest/coverage-v8":"^4.1.4","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","@typescript-eslint/parser":"^8.21.0","@typescript-eslint/eslint-plugin":"^8.21.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.1.0_1776097220914_0.75248405550345","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@absmartly/cli","version":"1.2.0","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/cli@1.2.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/cli-ts#readme","bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"dist":{"shasum":"b24b294f8b6ff11ffedbfd5d025d92d2498f9914","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.2.0.tgz","fileCount":1147,"integrity":"sha512-ZR9CJmk4sWjfH4map8iSi56qZx9r1nsE6x7gMcUbB3Gtogl5vnVmVYbqWW/8Nrm6FbZ+vnd7QpErGAN34cP7QQ==","signatures":[{"sig":"MEQCIGnSgnccU/JteMFqhijaFhdJ7XZ8iDzuzCGTa2e3CVe4AiBvZHz6QIuznKXd//U8ZtFbdCPEpkzsGpY1KpWL7sWBFg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fcli@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1969364},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"}},"gitHead":"7327c809da2e14c383abade4988fe26852646882","scripts":{"dev":"bun src/index.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsc","format":"prettier --write 'src/**/*.ts'","prepare":"git config core.hooksPath .githooks","test:ui":"vitest --ui","test:run":"vitest run","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","typecheck":"tsc --noEmit","build:watch":"tsc --watch","test:coverage":"vitest run --coverage","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ee311575-3913-43d1-a9f7-36dcc50a73ab"}},"repository":{"url":"git+https://github.com/absmartly/cli-ts.git","type":"git"},"_npmVersion":"11.11.0","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"open":"^10.1.0","axios":"^1.7.9","chalk":"^5.4.1","keytar":"^7.9.0","marked":"^17.0.5","js-yaml":"^4.1.0","commander":"^12.1.0","cli-table3":"^0.6.5","image-size":"^2.0.2","axios-retry":"^4.5.0","gray-matter":"^4.0.3","cli-highlight":"^2.1.11","marked-terminal":"^7.3.0","@inquirer/prompts":"^8.3.2"},"typesVersions":{"*":{"config":["./dist/config-export/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"api-client":["./dist/api-client/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.8","jsdom":"^28.0.0","dotenv":"^16.4.7","eslint":"^9.19.0","vitest":"^4.0.18","prettier":"^3.4.2","@vitest/ui":"^4.0.18","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^25.2.1","@types/js-yaml":"^4.0.9","@faker-js/faker":"^10.2.0","@vitest/coverage-v8":"^4.1.4","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","@typescript-eslint/parser":"^8.21.0","@typescript-eslint/eslint-plugin":"^8.21.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.2.0_1777038183988_0.8027528311511358","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@absmartly/cli","version":"1.3.0","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/cli@1.3.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/cli-ts#readme","bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"dist":{"shasum":"541343430cd2226239459927850326313477cfc3","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.3.0.tgz","fileCount":1151,"integrity":"sha512-6b+8WtUmoq8Th06GtudA3zAPOG7/+ppDWx95GLum+qO+WjATTFx+8mQ4nlVQNtJIYzr6JKUZCtX1n6fHH50t0g==","signatures":[{"sig":"MEUCIQC6MeYfH6yCfG9bZRC167f8Ek9ANukirGP2WLrfx+cUuQIgclF7HrjiJKLqGov36WBojCDIoakB/cTS08Bszp/rVzk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fcli@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2020561},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"}},"gitHead":"b785a4a88ffbf35f16e0f1011432175415e53249","scripts":{"dev":"bun src/index.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsc","format":"prettier --write 'src/**/*.ts'","prepare":"git config core.hooksPath .githooks","test:ui":"vitest --ui","test:run":"vitest run","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","typecheck":"tsc --noEmit","build:watch":"tsc --watch","test:coverage":"vitest run --coverage","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ee311575-3913-43d1-a9f7-36dcc50a73ab"}},"repository":{"url":"git+https://github.com/absmartly/cli-ts.git","type":"git"},"_npmVersion":"11.11.0","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"open":"^10.1.0","axios":"^1.7.9","chalk":"^5.4.1","keytar":"^7.9.0","marked":"^17.0.5","js-yaml":"^4.1.0","commander":"^12.1.0","cli-table3":"^0.6.5","image-size":"^2.0.2","axios-retry":"^4.5.0","gray-matter":"^4.0.3","cli-highlight":"^2.1.11","marked-terminal":"^7.3.0","@inquirer/prompts":"^8.3.2"},"typesVersions":{"*":{"config":["./dist/config-export/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"api-client":["./dist/api-client/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.8","jsdom":"^28.0.0","dotenv":"^16.4.7","eslint":"^9.19.0","vitest":"^4.0.18","prettier":"^3.4.2","@vitest/ui":"^4.0.18","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^25.2.1","@types/js-yaml":"^4.0.9","@faker-js/faker":"^10.2.0","@vitest/coverage-v8":"^4.1.4","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","@typescript-eslint/parser":"^8.21.0","@typescript-eslint/eslint-plugin":"^8.21.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.3.0_1777505097757_0.03395482300681785","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@absmartly/cli","version":"1.4.0","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/cli@1.4.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/cli-ts#readme","bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"dist":{"shasum":"d2dfe05de0cb87ddf83db376775aefa18889296c","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.4.0.tgz","fileCount":1183,"integrity":"sha512-a9wRgXz44EruEUzHMfESshY454t/a8na3AHnXgkL9KzXdGZt510OeM6XF1f3E5jIXsZSDLz/RTX+5+zMlCnZ5A==","signatures":[{"sig":"MEQCIHD4HJRt/aQ3RSSL10UMT1VfTGHaaWq9Fo+N1FTHpzUBAiBIkKKOOHLzw0dwPTEOnhgVkf60EDgQZ1FMN6Oo9/ZePg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fcli@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2105109},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"}},"gitHead":"647f9116e516b47d414795b16b0bc119e3013acd","scripts":{"dev":"bun src/index.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsc","format":"prettier --write 'src/**/*.ts'","prepare":"git config core.hooksPath .githooks","test:ui":"vitest --ui","test:run":"vitest run","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","typecheck":"tsc --noEmit","build:watch":"tsc --watch","test:coverage":"vitest run --coverage","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ee311575-3913-43d1-a9f7-36dcc50a73ab"}},"repository":{"url":"git+https://github.com/absmartly/cli-ts.git","type":"git"},"_npmVersion":"11.11.0","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"open":"^10.1.0","axios":"^1.7.9","chalk":"^5.4.1","keytar":"^7.9.0","marked":"^17.0.5","js-yaml":"^4.1.0","commander":"^12.1.0","cli-table3":"^0.6.5","image-size":"^2.0.2","axios-retry":"^4.5.0","gray-matter":"^4.0.3","cli-highlight":"^2.1.11","marked-terminal":"^7.3.0","@inquirer/prompts":"^8.3.2"},"typesVersions":{"*":{"config":["./dist/config-export/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"api-client":["./dist/api-client/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.8","jsdom":"^28.0.0","dotenv":"^16.4.7","eslint":"^9.19.0","vitest":"^4.0.18","prettier":"^3.4.2","@vitest/ui":"^4.0.18","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^25.2.1","@types/js-yaml":"^4.0.9","@faker-js/faker":"^10.2.0","@vitest/coverage-v8":"^4.1.4","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","@typescript-eslint/parser":"^8.21.0","@typescript-eslint/eslint-plugin":"^8.21.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.4.0_1777939041624_0.32582378625333375","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@absmartly/cli","version":"1.5.0","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/cli@1.5.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/cli-ts#readme","bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"dist":{"shasum":"a40d6548d5dd72a8af7c9e01d5d40a744f40bcf7","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.5.0.tgz","fileCount":1191,"integrity":"sha512-Jh/szWSomBnbhcvSx1ee4d3nywqUbv4IXrKDpVnJCGErZ/SpXuzj1APuUCszpl9lEjgkN0qXyatw4g/aJtHppg==","signatures":[{"sig":"MEQCID3qpfTZlSUCPcND4Jd0LcBRT2xIPjL7u7lifhcnB9hvAiBJuhlyliIrxwDUkkm9YDaV/i6M844O+vm6c3YeHwPIcQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fcli@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2159110},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"}},"gitHead":"7cc838cb16b1c76ebc5c3e0774ffbcbeb0a44ac6","scripts":{"dev":"bun src/index.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsc","format":"prettier --write 'src/**/*.ts'","prepare":"git config core.hooksPath .githooks","test:ui":"vitest --ui","test:run":"vitest run","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","typecheck":"tsc --noEmit","build:watch":"tsc --watch","test:coverage":"vitest run --coverage","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ee311575-3913-43d1-a9f7-36dcc50a73ab"}},"repository":{"url":"git+https://github.com/absmartly/cli-ts.git","type":"git"},"_npmVersion":"11.11.0","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"open":"^10.1.0","axios":"^1.7.9","chalk":"^5.4.1","keytar":"^7.9.0","marked":"^17.0.5","js-yaml":"^4.1.0","commander":"^12.1.0","cli-table3":"^0.6.5","image-size":"^2.0.2","axios-retry":"^4.5.0","gray-matter":"^4.0.3","cli-highlight":"^2.1.11","marked-terminal":"^7.3.0","@inquirer/prompts":"^8.3.2"},"typesVersions":{"*":{"config":["./dist/config-export/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"api-client":["./dist/api-client/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.8","jsdom":"^28.0.0","dotenv":"^16.4.7","eslint":"^9.19.0","vitest":"^4.0.18","prettier":"^3.4.2","@vitest/ui":"^4.0.18","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^25.2.1","@types/js-yaml":"^4.0.9","@faker-js/faker":"^10.2.0","@vitest/coverage-v8":"^4.1.4","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","@typescript-eslint/parser":"^8.21.0","@typescript-eslint/eslint-plugin":"^8.21.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.5.0_1778599748135_0.30406759861676447","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@absmartly/cli","version":"1.6.0","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/cli@1.6.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/cli-ts#readme","bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"dist":{"shasum":"d7ca1c287c62f14b5c8aad6e6eafef19f37c3cf2","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.6.0.tgz","fileCount":1191,"integrity":"sha512-y5Ammw8S+TTY2hACxGe75Fn7NzSwMcQespwNcbcEwM/sFraIDCqq8WOs4pj7XIa9m3typ34IXN7c/ccEQEK5mg==","signatures":[{"sig":"MEQCIFPr2CLUvVh9jsK8aZuj84iMWRoyCWERvbb4jPQ+QqSoAiBz9nRV6wveJb3ulSjp1vPzo39Qhk9oXJYpSrpVuAVcbQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fcli@1.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2160683},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"}},"gitHead":"5f73cecb9fdf4ba9b8954a3bc69b7c8330ffdf9d","scripts":{"dev":"bun src/index.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsc","format":"prettier --write 'src/**/*.ts'","prepare":"git config core.hooksPath .githooks","test:ui":"vitest --ui","test:run":"vitest run","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","typecheck":"tsc --noEmit","build:watch":"tsc --watch","test:coverage":"vitest run --coverage","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ee311575-3913-43d1-a9f7-36dcc50a73ab"}},"repository":{"url":"git+https://github.com/absmartly/cli-ts.git","type":"git"},"_npmVersion":"11.12.1","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"open":"^10.1.0","axios":"^1.7.9","chalk":"^5.4.1","keytar":"^7.9.0","marked":"^17.0.5","js-yaml":"^4.1.0","commander":"^12.1.0","cli-table3":"^0.6.5","image-size":"^2.0.2","axios-retry":"^4.5.0","gray-matter":"^4.0.3","cli-highlight":"^2.1.11","marked-terminal":"^7.3.0","@inquirer/prompts":"^8.3.2"},"typesVersions":{"*":{"config":["./dist/config-export/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"api-client":["./dist/api-client/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.8","jsdom":"^28.0.0","dotenv":"^16.4.7","eslint":"^9.19.0","vitest":"^4.0.18","prettier":"^3.4.2","@vitest/ui":"^4.0.18","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^25.2.1","@types/js-yaml":"^4.0.9","@faker-js/faker":"^10.2.0","@vitest/coverage-v8":"^4.1.4","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","@typescript-eslint/parser":"^8.21.0","@typescript-eslint/eslint-plugin":"^8.21.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.6.0_1779299325405_0.6841288861255268","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@absmartly/cli","version":"1.7.0","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/cli@1.7.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/cli-ts#readme","bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"dist":{"shasum":"91bbe59069c09dbd62bc9636d2a75b8021406c44","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.7.0.tgz","fileCount":1191,"integrity":"sha512-u/ibLgBb30cM4PjMYkz4uuRlB008H12QmwXmRNwSDe6iLYZ/ILANbZ+7DPqNv/vM26mRSP+uGVrFs5gt28SxGg==","signatures":[{"sig":"MEYCIQCOuFj0LlP6OZKuP5pco8Q+WaRAwjCZiHGxbtdw/pzktwIhAJZN8kkzAa3YCNerz4VT+SjKgrkigN5Fe7udtI2eSfnP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fcli@1.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2173436},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"}},"gitHead":"690880f01c98d281ab676afdd03cc59b713d1d1e","scripts":{"dev":"bun src/index.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsc","format":"prettier --write 'src/**/*.ts'","prepare":"git config core.hooksPath .githooks","test:ui":"vitest --ui","test:run":"vitest run","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","typecheck":"tsc --noEmit","build:watch":"tsc --watch","test:coverage":"vitest run --coverage","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ee311575-3913-43d1-a9f7-36dcc50a73ab"}},"repository":{"url":"git+https://github.com/absmartly/cli-ts.git","type":"git"},"_npmVersion":"11.12.1","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"open":"^10.1.0","axios":"^1.7.9","chalk":"^5.4.1","keytar":"^7.9.0","marked":"^17.0.5","js-yaml":"^4.1.0","commander":"^12.1.0","cli-table3":"^0.6.5","image-size":"^2.0.2","axios-retry":"^4.5.0","gray-matter":"^4.0.3","cli-highlight":"^2.1.11","marked-terminal":"^7.3.0","@inquirer/prompts":"^8.3.2"},"typesVersions":{"*":{"config":["./dist/config-export/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"api-client":["./dist/api-client/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.8","jsdom":"^28.0.0","dotenv":"^16.4.7","eslint":"^9.19.0","vitest":"^4.0.18","prettier":"^3.4.2","@vitest/ui":"^4.0.18","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^25.2.1","@types/js-yaml":"^4.0.9","@faker-js/faker":"^10.2.0","@vitest/coverage-v8":"^4.1.4","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","@typescript-eslint/parser":"^8.21.0","@typescript-eslint/eslint-plugin":"^8.21.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.7.0_1779314556059_0.4722326256163496","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@absmartly/cli","version":"1.8.0","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/cli@1.8.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/cli-ts#readme","bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"dist":{"shasum":"4b47d27c95cf0d6d0c96f5c5d8385d9fabb2b5ac","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.8.0.tgz","fileCount":1195,"integrity":"sha512-iGzC/SGjj2ahuqnUj1PMMKZfQN1oanOF7v8cUCzd4avyhLLCB3CFIR/8fE1TqNwQdSDuozkUCvl3n0KBS5D38Q==","signatures":[{"sig":"MEQCIG696CRESXfBTs7/RmR4IUnWUcy39yb1YgCiqZIJlmoxAiARnlKACUt2z72R1B4Kvg4YcQKPNfYcDhfK6ivDES1/vg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fcli@1.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2205727},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"}},"gitHead":"996a4b48ee193e99394f8330c08ba701ebf1a0d5","scripts":{"dev":"bun src/index.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsc","format":"prettier --write 'src/**/*.ts'","prepare":"git config core.hooksPath .githooks","test:ui":"vitest --ui","test:run":"vitest run","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","typecheck":"tsc --noEmit","build:watch":"tsc --watch","test:coverage":"vitest run --coverage","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ee311575-3913-43d1-a9f7-36dcc50a73ab"}},"repository":{"url":"git+https://github.com/absmartly/cli-ts.git","type":"git"},"_npmVersion":"11.13.0","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"open":"^10.1.0","axios":"^1.7.9","chalk":"^5.4.1","keytar":"^7.9.0","marked":"^17.0.5","js-yaml":"^4.1.0","commander":"^12.1.0","cli-table3":"^0.6.5","image-size":"^2.0.2","axios-retry":"^4.5.0","gray-matter":"^4.0.3","cli-highlight":"^2.1.11","marked-terminal":"^7.3.0","@inquirer/prompts":"^8.3.2"},"typesVersions":{"*":{"config":["./dist/config-export/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"api-client":["./dist/api-client/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.8","jsdom":"^28.0.0","dotenv":"^16.4.7","eslint":"^9.19.0","vitest":"^4.0.18","prettier":"^3.4.2","@vitest/ui":"^4.0.18","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^25.2.1","@types/js-yaml":"^4.0.9","@faker-js/faker":"^10.2.0","@vitest/coverage-v8":"^4.1.4","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","@typescript-eslint/parser":"^8.21.0","@typescript-eslint/eslint-plugin":"^8.21.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.8.0_1780081246700_0.4285090748117366","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"@absmartly/cli","version":"1.9.0","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/cli@1.9.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/cli-ts#readme","bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"dist":{"shasum":"c4aff41e412e35df6683b17b50140a40ded9d2f1","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.9.0.tgz","fileCount":1199,"integrity":"sha512-2zfFWvNJRTsMdPxjndDtR8RukNafxpQEAsDWrKfRZlqSACn03grM/Xux1r/zB8zWme0UTj1RAyrZHsaJMHs4Vw==","signatures":[{"sig":"MEUCIB1D1NMHKYUz4+dfVoFT97ZUqbwNK0B/iUZNE1xYQfsJAiEArHlZhfm3QrTVae2oFWc/rRzKjDv3HmT/xurVmb3KukY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fcli@1.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2236885},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"}},"gitHead":"4e31d5b7daaa43e0c15adae65b1b5bc2d200a901","scripts":{"dev":"bun src/index.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsc","format":"prettier --write 'src/**/*.ts'","prepare":"git config core.hooksPath .githooks","test:ui":"vitest --ui","test:run":"vitest run","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","typecheck":"tsc --noEmit","build:watch":"tsc --watch","test:coverage":"vitest run --coverage","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ee311575-3913-43d1-a9f7-36dcc50a73ab"}},"repository":{"url":"git+https://github.com/absmartly/cli-ts.git","type":"git"},"_npmVersion":"11.13.0","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"open":"^10.1.0","axios":"^1.7.9","chalk":"^5.4.1","keytar":"^7.9.0","marked":"^17.0.5","js-yaml":"^4.1.0","commander":"^12.1.0","cli-table3":"^0.6.5","image-size":"^2.0.2","axios-retry":"^4.5.0","gray-matter":"^4.0.3","cli-highlight":"^2.1.11","marked-terminal":"^7.3.0","@inquirer/prompts":"^8.3.2"},"typesVersions":{"*":{"config":["./dist/config-export/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"api-client":["./dist/api-client/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.8","jsdom":"^28.0.0","dotenv":"^16.4.7","eslint":"^9.19.0","vitest":"^4.0.18","prettier":"^3.4.2","@vitest/ui":"^4.0.18","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^25.2.1","@types/js-yaml":"^4.0.9","@faker-js/faker":"^10.2.0","@vitest/coverage-v8":"^4.1.4","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","@typescript-eslint/parser":"^8.21.0","@typescript-eslint/eslint-plugin":"^8.21.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.9.0_1780082426571_0.9870994187130897","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"@absmartly/cli","version":"1.10.0","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/cli@1.10.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/cli-ts#readme","bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"dist":{"shasum":"eb69f6dab69a0770099cec091fb2780fe2b3c187","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.10.0.tgz","fileCount":1199,"integrity":"sha512-zYTuCdWzXa5yHS2uzlVsye0AI1G9WO2yQvCw1mdegzMeV7aPzSY5BXeX5ciZph98qJIIgEmBDxeWx+nAttFn3g==","signatures":[{"sig":"MEYCIQDF7bA4VnatsqwZ/qQqi8AZeQn/DqCc7udD/qoPhYtUowIhAL9phDKp2U7N9wHI14gsjAMzL0mlBb0yZWZvGjpeT4oJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fcli@1.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2237110},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"}},"gitHead":"1e823ba941aac61700c76abeb0b7e79b0d18747d","scripts":{"dev":"bun src/index.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsc","format":"prettier --write 'src/**/*.ts'","prepare":"git config core.hooksPath .githooks","test:ui":"vitest --ui","test:run":"vitest run","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","typecheck":"tsc --noEmit","build:watch":"tsc --watch","test:coverage":"vitest run --coverage","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ee311575-3913-43d1-a9f7-36dcc50a73ab"}},"repository":{"url":"git+https://github.com/absmartly/cli-ts.git","type":"git"},"_npmVersion":"11.13.0","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"open":"^10.1.0","axios":"^1.7.9","chalk":"^5.4.1","keytar":"^7.9.0","marked":"^17.0.5","js-yaml":"^4.1.0","commander":"^12.1.0","cli-table3":"^0.6.5","image-size":"^2.0.2","axios-retry":"^4.5.0","gray-matter":"^4.0.3","cli-highlight":"^2.1.11","marked-terminal":"^7.3.0","@inquirer/prompts":"^8.3.2"},"typesVersions":{"*":{"config":["./dist/config-export/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"api-client":["./dist/api-client/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.8","jsdom":"^28.0.0","dotenv":"^16.4.7","eslint":"^9.19.0","vitest":"^4.0.18","prettier":"^3.4.2","@vitest/ui":"^4.0.18","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^25.2.1","@types/js-yaml":"^4.0.9","@faker-js/faker":"^10.2.0","@vitest/coverage-v8":"^4.1.4","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","@typescript-eslint/parser":"^8.21.0","@typescript-eslint/eslint-plugin":"^8.21.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.10.0_1780091432657_0.5199044447199817","host":"s3://npm-registry-packages-npm-production"}},"1.11.0":{"name":"@absmartly/cli","version":"1.11.0","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/cli@1.11.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/cli-ts#readme","bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"dist":{"shasum":"f8dfa8776f31a057272a62940d39bea241c77721","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.11.0.tgz","fileCount":1203,"integrity":"sha512-YyzQYgV1xH6RbrmkzOnPssnK2txYxbyOZt6EZiijwJ7BGJgQcUMNfwub7BenOOjQvqA7l7ezadVyA3rT/bfZlg==","signatures":[{"sig":"MEUCIGK8+BbEW5CCkaVq4XNTBf1UrxQ6i4FFJE/c5/9EoAESAiEA1vlWTcpz4nmgOwlny5eW8aHtp7Mx+TtR/NZ+4WqOGf8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fcli@1.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2250748},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"}},"gitHead":"aa29093ebf8ea7351fe857d83eecf008e0bd2c8d","scripts":{"dev":"bun src/index.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsc","format":"prettier --write 'src/**/*.ts'","prepare":"git config core.hooksPath .githooks","test:ui":"vitest --ui","test:run":"vitest run","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","typecheck":"tsc --noEmit","build:watch":"tsc --watch","test:coverage":"vitest run --coverage","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ee311575-3913-43d1-a9f7-36dcc50a73ab"}},"repository":{"url":"git+https://github.com/absmartly/cli-ts.git","type":"git"},"_npmVersion":"11.13.0","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"open":"^10.1.0","axios":"^1.7.9","chalk":"^5.4.1","keytar":"^7.9.0","marked":"^17.0.5","js-yaml":"^4.1.0","commander":"^12.1.0","cli-table3":"^0.6.5","image-size":"^2.0.2","axios-retry":"^4.5.0","gray-matter":"^4.0.3","cli-highlight":"^2.1.11","marked-terminal":"^7.3.0","@inquirer/prompts":"^8.3.2"},"typesVersions":{"*":{"config":["./dist/config-export/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"api-client":["./dist/api-client/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.8","jsdom":"^28.0.0","dotenv":"^16.4.7","eslint":"^9.19.0","vitest":"^4.0.18","prettier":"^3.4.2","@vitest/ui":"^4.0.18","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^25.2.1","@types/js-yaml":"^4.0.9","@faker-js/faker":"^10.2.0","@vitest/coverage-v8":"^4.1.4","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","@typescript-eslint/parser":"^8.21.0","@typescript-eslint/eslint-plugin":"^8.21.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.11.0_1780334104515_0.28704959294384924","host":"s3://npm-registry-packages-npm-production"}},"1.12.0":{"name":"@absmartly/cli","version":"1.12.0","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","_id":"@absmartly/cli@1.12.0","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"homepage":"https://github.com/absmartly/cli-ts#readme","bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"dist":{"shasum":"5fc665b886e5f0039309bae71d0abed35bbc0229","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.12.0.tgz","fileCount":1207,"integrity":"sha512-BVbZIVG6WlupmOk9KJa1m+kwfQXGyCmnnJnQMX4M9KtRKP7gXtT5FA+8flZoFGg0QPuk52ON1ssDtOekvqkw/g==","signatures":[{"sig":"MEUCIFNh2p4dKmE0xNthkfHK4hS7jSp/vD9+L5FMYvuq9x44AiEAnnfNNq44AT1z5NvGNEZKOzPTeVOUp79fsmblfpcApcA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fcli@1.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2268102},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"}},"gitHead":"3e6dce35adcaffa841dd56196f808b4e854117dd","scripts":{"dev":"bun src/index.ts","lint":"eslint src --ext .ts","test":"vitest","build":"tsc","format":"prettier --write 'src/**/*.ts'","prepare":"git config core.hooksPath .githooks","test:ui":"vitest --ui","test:run":"vitest run","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","typecheck":"tsc --noEmit","build:watch":"tsc --watch","test:coverage":"vitest run --coverage","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ee311575-3913-43d1-a9f7-36dcc50a73ab"}},"repository":{"url":"git+https://github.com/absmartly/cli-ts.git","type":"git"},"_npmVersion":"11.13.0","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"open":"^10.1.0","axios":"^1.7.9","chalk":"^5.4.1","keytar":"^7.9.0","marked":"^17.0.5","js-yaml":"^4.1.0","commander":"^12.1.0","cli-table3":"^0.6.5","image-size":"^2.0.2","axios-retry":"^4.5.0","gray-matter":"^4.0.3","cli-highlight":"^2.1.11","marked-terminal":"^7.3.0","@inquirer/prompts":"^8.3.2"},"typesVersions":{"*":{"config":["./dist/config-export/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"api-client":["./dist/api-client/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.8","jsdom":"^28.0.0","dotenv":"^16.4.7","eslint":"^9.19.0","vitest":"^4.0.18","prettier":"^3.4.2","@vitest/ui":"^4.0.18","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^25.2.1","@types/js-yaml":"^4.0.9","@faker-js/faker":"^10.2.0","@vitest/coverage-v8":"^4.1.4","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","@typescript-eslint/parser":"^8.21.0","@typescript-eslint/eslint-plugin":"^8.21.0"},"_npmOperationalInternal":{"tmp":"tmp/cli_1.12.0_1781215830511_0.4862535848751799","host":"s3://npm-registry-packages-npm-production"}},"1.14.0":{"name":"@absmartly/cli","version":"1.14.0","description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","sideEffects":false,"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./api-client":{"types":"./dist/api-client/index.d.ts","default":"./dist/api-client/index.js"},"./core/*":{"types":"./dist/core/*/index.d.ts","default":"./dist/core/*/index.js"},"./formatting":{"types":"./dist/formatting/index.d.ts","default":"./dist/formatting/index.js"},"./config":{"types":"./dist/config-export/index.d.ts","default":"./dist/config-export/index.js"}},"typesVersions":{"*":{"api-client":["./dist/api-client/index.d.ts"],"core/*":["./dist/core/*/index.d.ts"],"formatting":["./dist/formatting/index.d.ts"],"config":["./dist/config-export/index.d.ts"]}},"repository":{"type":"git","url":"git+https://github.com/absmartly/cli-ts.git"},"bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"homepage":"https://github.com/absmartly/cli-ts#readme","bin":{"abs":"dist/index.js","absmartly-cli":"dist/index.js"},"scripts":{"build":"tsc","build:watch":"tsc --watch","dev":"bun src/index.ts","test":"vitest","test:run":"vitest run","test:ui":"vitest --ui","test:coverage":"vitest run --coverage","lint":"eslint src --ext .ts","format":"prettier --write 'src/**/*.ts'","typecheck":"tsc --noEmit","test:live":"bun src/test/live/run-live-vitest.ts --profile test-1","test:live-quick":"bun src/test/live/run-live-tests.ts --profile test-1","prepare":"git config core.hooksPath .githooks"},"keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"author":{"name":"ABsmartly"},"license":"MIT","engines":{"node":">=18.0.0"},"dependencies":{"@inquirer/prompts":"^8.3.2","axios":"^1.7.9","axios-retry":"^4.5.0","chalk":"^5.4.1","cli-highlight":"^2.1.11","cli-table3":"^0.6.5","commander":"^12.1.0","gray-matter":"^4.0.3","image-size":"^2.0.2","js-yaml":"^4.1.0","keytar":"^7.9.0","marked":"^17.0.5","marked-terminal":"^7.3.0","open":"^10.1.0"},"devDependencies":{"@faker-js/faker":"^10.2.0","@types/js-yaml":"^4.0.9","@types/node":"^25.2.1","@typescript-eslint/eslint-plugin":"^8.21.0","@typescript-eslint/parser":"^8.21.0","@vitest/coverage-v8":"^4.1.4","@vitest/ui":"^4.0.18","absmartly-api-mocks":"npm:@absmartly/api-mocks@^1.0.6","dotenv":"^16.4.7","eslint":"^9.19.0","jsdom":"^28.0.0","msw":"^2.12.8","playwright":"^1.58.2","prettier":"^3.4.2","typescript":"^5.9.3","vitest":"^4.0.18"},"gitHead":"7fd3d03f23a0153769d7fe16c25ac5d46a5f277d","_id":"@absmartly/cli@1.14.0","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-fMlEDQyxqIKEX3h7zlQ7Da3hSmKjSVkVhUMTX9OmZL2hmqI7XT+dTd8dPyFidfIgyCk0aqZJe1+jMDe+3h0tSw==","shasum":"1ace88659901c6757c187699dd06405a5e8e45f6","tarball":"https://registry.npmjs.org/@absmartly/cli/-/cli-1.14.0.tgz","fileCount":1211,"unpackedSize":2300394,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@absmartly%2fcli@1.14.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD2irZpSPF7GgmA0w60ElF40VmBvaGpgSlGU5bKfUKcBAIgU/oltIbgBhbvtV3pZf0ZvC3mOqJYhuQur3p9LAw/Nk8="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ee311575-3913-43d1-a9f7-36dcc50a73ab"}},"directories":{},"maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cli_1.14.0_1783106776062_0.38712100789176884"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-13T13:21:44.274Z","modified":"2026-07-03T19:26:16.494Z","1.0.0":"2026-04-13T13:21:44.564Z","1.1.0":"2026-04-13T16:20:21.172Z","1.2.0":"2026-04-24T13:43:04.204Z","1.3.0":"2026-04-29T23:24:57.944Z","1.4.0":"2026-05-04T23:57:21.774Z","1.5.0":"2026-05-12T15:29:08.336Z","1.6.0":"2026-05-20T17:48:45.618Z","1.7.0":"2026-05-20T22:02:36.218Z","1.8.0":"2026-05-29T19:00:46.919Z","1.9.0":"2026-05-29T19:20:26.782Z","1.10.0":"2026-05-29T21:50:32.858Z","1.11.0":"2026-06-01T17:15:04.711Z","1.12.0":"2026-06-11T22:10:30.682Z","1.14.0":"2026-07-03T19:26:16.205Z"},"bugs":{"url":"https://github.com/absmartly/cli-ts/issues"},"author":{"name":"ABsmartly"},"license":"MIT","homepage":"https://github.com/absmartly/cli-ts#readme","keywords":["absmartly","ab-testing","feature-flags","experimentation","cli"],"repository":{"type":"git","url":"git+https://github.com/absmartly/cli-ts.git"},"description":"ABSmartly CLI - A/B Testing and Feature Flags command-line tool for AI agents and humans","maintainers":[{"name":"marcioapm","email":"marcioapm@gmail.com"},{"name":"joalves","email":"jonas@absmartly.com"},{"name":"caltheabtester","email":"cal@absmartly.com"},{"name":"marcioabs","email":"marcio@absmartly.com"}],"readme":"# ABSmartly CLI\n\nCommand-line interface for AI agents and humans to manage experiments, feature flags, and A/B tests on the [ABSmartly](https://absmartly.com) platform.\n\n## Project status\n\n> **This project is experimental.** The core architecture is settled, but the API surface may change between releases.\n\n| Area | Status |\n|---|---|\n| Experiment commands (list, get, create, update, start, stop, restart, clone, bulk) | Stable — well tested |\n| Metric results, CI bars, segment breakdowns | Stable |\n| Template round-trip (export → edit → create/update) | Stable |\n| Core layer (`@absmartly/cli/core/*`) for programmatic use | Stable — 444 unit tests |\n| Admin commands (tags, roles, teams, users, webhooks, etc.) | Mostly stable — less battle-tested |\n| OAuth authentication | Working — tested against live API |\n| Interactive editor (`--interactive` / `-i` flag) | **Experimental** — known issues, not production-ready |\n| Shell completions | Working — may have gaps |\n| Unix pipe composition | Stable |\n\n```bash\nbun install -g @absmartly/cli\n```\n\nRequires [Bun](https://bun.sh/) >= 1.0 (or Node.js >= 18 at runtime).\n\n## Quick start\n\n```bash\n# Interactive setup wizard\nabs setup\n\n# Non-interactive setup\nabs setup --api-key YOUR_KEY --endpoint https://your-instance.absmartly.com/v1\nabs setup --api-key YOUR_KEY --endpoint https://staging.absmartly.com/v1 --profile staging\n\n# Or authenticate manually\nabs auth login --api-key YOUR_API_KEY --endpoint https://your-instance.absmartly.com/v1\n\n# Verify configuration\nabs doctor\n\n# List experiments\nabs experiments list\n\n# Get experiment details\nabs experiments get 123\n```\n\n## Authentication\n\nThe CLI stores credentials in your OS keychain (via keytar) and configuration in `~/.config/absmartly/config.yaml`. On headless systems without a keychain service, credentials fall back to `~/.config/absmartly/credentials.json` (chmod 600).\n\nTwo authentication methods are supported:\n\n### API key authentication\n\n```bash\n# Login with API key\nabs auth login --api-key YOUR_KEY --endpoint https://your-instance.absmartly.com/v1\n\n# Login with a named profile\nabs auth login --api-key YOUR_KEY --endpoint https://staging.absmartly.com/v1 --profile staging\n```\n\n### OAuth authentication\n\nWhen no `--api-key` is provided, the CLI launches an OAuth browser flow. After authorization, it can either create a persistent API key (default) or use session-based JWT tokens.\n\n```bash\n# OAuth login (opens browser, creates persistent API key)\nabs auth login --endpoint https://your-instance.absmartly.com/v1\n\n# OAuth with session-based JWT tokens (no persistent key, expires in 24h)\nabs auth login --endpoint https://your-instance.absmartly.com/v1 --session\n\n# Skip prompt and always create persistent API key\nabs auth login --endpoint https://your-instance.absmartly.com/v1 --persistent\n\n# Headless environments (print URL instead of opening browser)\nabs auth login --endpoint https://your-instance.absmartly.com/v1 --no-browser\n\n# Allow self-signed TLS certificates\nabs auth login --endpoint https://dev.local/v1 -k\n```\n\n> **Security note**: The `-k` flag disables TLS certificate verification. Only use in trusted development environments.\n\n### Auth commands\n\n```bash\n# Check authentication status\nabs auth status\nabs auth status --show-key    # reveal full API key\nabs auth status --profile staging\n\n# Show current authenticated user\nabs auth whoami\nabs auth whoami --avatar       # display avatar inline (iTerm2, Kitty, Sixel)\nabs auth whoami --avatar 30    # avatar at 30 columns wide\n\n# Manage personal API keys\nabs auth list-api-keys\nabs auth create-api-key --name \"CI Key\" --description \"For CI/CD pipelines\"\nabs auth get-api-key 1\nabs auth update-api-key 1 --name \"Renamed Key\"\nabs auth delete-api-key 1\n\n# Edit your profile\nabs auth edit-profile --first-name \"Jonas\" --last-name \"Alves\" --department \"Engineering\"\n\n# Change your own password\nabs auth reset-my-password\n\n# Logout\nabs auth logout\nabs auth logout --profile staging\n```\n\nYou can also override credentials per-command with global options:\n\n```bash\nabs experiments list --api-key YOUR_KEY --endpoint https://your-instance.absmartly.com/v1\n```\n\n## Global options\n\nThese options are available on every command:\n\n| Option | Description |\n|---|---|\n| `--config <path>` | Config file path |\n| `--api-key <key>` | Override API key |\n| `--endpoint <url>` | Override API endpoint |\n| `--app <name>` | Override default application |\n| `--env <name>` | Override default environment |\n| `-o, --output <format>` | Output format: `table` (default), `json`, `yaml`, `plain`, `markdown`, `rendered`, `vertical`, `template` |\n| `--no-color` | Disable colored output |\n| `-v, --verbose` | Verbose output |\n| `-q, --quiet` | Minimal output |\n| `--profile <name>` | Use a specific profile |\n| `--terse` | Compact format with truncation |\n| `--full` | Full text without truncation |\n| `--raw` | Show raw API response without summarizing or transforming |\n\n### Debugging API traffic\n\nThese flags write to **stderr** (so they don't pollute piped stdout) and respect `--no-color` and the `NO_COLOR` env var. Authorization headers and known sensitive body fields (`key`, `password`, `token`, `secret`, `access_token`, `refresh_token`, `api_key`) are redacted by default.\n\n| Option | Description |\n|---|---|\n| `--show-request` | Print outgoing HTTP requests as a readable HTTP-style block. |\n| `--show-response` | Print HTTP responses (success and error) as an HTTP-style block. |\n| `--curl` | Print outgoing requests as runnable curl commands. |\n| `--show-secrets` | Don't redact `Authorization` / `Set-Cookie` / sensitive body fields. Use with care. |\n| `--headers-only` | Omit request and response bodies from `--show-request` / `--show-response` / `--curl` output. |\n| `--status-only` | Print only the response status line, e.g. `← 200 OK (175ms)`. Implies `--show-response`. |\n\nWhen stderr is a TTY, JSON bodies and HTTP headers are pretty-printed and syntax-highlighted. Polling loops that fire the same request repeatedly are deduped: each unique request is printed once and a `(N identical requests suppressed)` summary appears when the next distinct request arrives. Responses are always logged so that state transitions during polling stay visible.\n\nExamples:\n\n```bash\nabs experiments get 1816 --show-request --show-response\nabs experiments list --curl                            # paste-runnable curl\nabs experiments get 1816 --show-response --status-only # just `← 200 OK (...)`\nabs experiments export 5 --download --show-request --headers-only\n```\n\n## Commands\n\n### Experiments\n\nFull lifecycle management for A/B tests and feature flags.\n\nAliases: `experiments`, `experiment`, `exp`, `features`, `feature`\n\nUse `abs features` instead of `abs experiments` to auto-filter by `type=feature`.\n\nAll experiment commands accept **names or IDs** — e.g. `abs experiments get checkout_redesign` resolves the name to the latest iteration's ID automatically.\n\n```bash\n# List experiments with filters and pagination\nabs experiments list\nabs experiments list --state running --items 50 --sort created_at --desc\nabs experiments list --app my-app --search \"checkout\" --page 2\nabs experiments list --created-after 2025-01-01 --tags v1,mobile\n\n# Find experiments that use a specific metric (by ID or name), in any role\nabs experiments list --metric \"Revenue\"\nabs experiments list --metric 42 --metric-role guardrail,primary\nabs experiments list --metric 42 --type test,feature --state running -o ids\n\n# Customize columns\nabs experiments list --show experiment_report archived   # add extra columns\nabs experiments list --exclude primary_metric owner      # hide columns\n\n# Search by name\nabs experiments search \"onboarding\"\n\n# Get experiment details\nabs experiments get 123                                  # summary table\nabs experiments get 123 -o vertical                      # one field per line\nabs experiments get 123 -o json                          # summary as JSON\nabs experiments get 123 -o json --raw                    # full API response as JSON\nabs experiments get 123 --show audience Hypothesis       # include extra fields\nabs experiments get 123 --exclude owners tags            # hide fields from output\nabs experiments get 123 --activity                       # include activity log\n\n# Inline screenshots (iTerm2, Kitty, Sixel)\nabs experiments get 123 --show-images                    # display variant screenshots\nabs experiments get 123 --show-images 60                 # at 60 columns wide\n\n# Template export (for cloning, editing, round-tripping)\nabs experiments get 123 -o template                      # markdown template\nabs experiments get 123 -o template --embed-screenshots  # with base64 screenshots\nabs experiments get 123 -o template --screenshots-dir ./screenshots  # save screenshots as files\n\n# Create an experiment\nabs experiments create --name my-experiment --variants \"control,treatment\"\nabs experiments create --name my-experiment --secondary-metrics \"Revenue,Bookings\"\nabs experiments create --name my-experiment --teams \"Product\" --tags \"v1\"\nabs experiments create --name my-experiment --audience '{\"filter\":[]}'\nabs experiments create --name my-experiment --analysis-type fixed_horizon\nabs experiments create --name my-experiment --hypothesis \"We believe X\"  # custom fields\nabs experiments create --name my-experiment --field \"Hypothesis=We believe X\"  # generic fallback\nabs experiments create --from-file experiment.md         # from template\nabs experiments create --name my-experiment --dry-run    # preview payload\nabs experiments create --name my-experiment --as-curl    # output as curl command\ncat template.md | abs experiments create --from-file -   # from stdin\n\n# Clone an experiment\nabs experiments clone 123 --name my-clone                # clone with new name\nabs experiments clone 123 --name my-clone --dry-run      # preview\nabs experiments clone 123 --name my-clone --from-file overrides.md  # clone with changes\n\n# Update an experiment\nabs experiments update 123 --display-name \"New Name\"\nabs experiments update 123 --name new_name --state running\nabs experiments update 123 --percentage-of-traffic 50 --percentages 30,70\nabs experiments update 123 --primary-metric 145 --unit-type 3 --application-id 5\nabs experiments update 123 --variants \"control,treatment,treatment2\"\nabs experiments update 123 --secondary-metrics \"Revenue,Bookings\"\nabs experiments update 123 --guardrail-metrics \"Error rate\"\nabs experiments update 123 --teams \"Product,Engineering\" --tags \"v1,mobile\"\nabs experiments update 123 --audience '{\"filter\":[]}'\nabs experiments update 123 --analysis-type fixed_horizon --required-alpha 0.05\nabs experiments update 123 --owner 10 --owner 20\nabs experiments update 123 --screenshot-id 0:376 --screenshot-id 1:378  # restore screenshots by upload ID\nabs experiments update 123 --from-file experiment.md     # update from template\nabs experiments update 123 --from-file experiment.md --dry-run\nabs experiments update 123 -i                            # interactive editor\n\n# Lifecycle transitions\nabs experiments development 123                          # enter development mode\nabs experiments start 123                                # start experiment\nabs experiments start 123 --note \"Ready for traffic\"     # with activity note\nabs experiments stop 123                                 # stop experiment\nabs experiments stop 123 --reason hypothesis_rejected --note \"Inconclusive results\"\nabs experiments restart 123 --reason other --reshuffle   # restart stopped experiment\nabs experiments restart 123 --from-file changes.md       # restart with template changes\nabs experiments restart 123 --as-type feature            # restart as feature flag\nabs experiments full-on 123 --variant 1                  # set full-on variant\n\n# Archive\nabs experiments archive 123\nabs experiments archive 123 --note \"Cleaning up old experiments\"\nabs experiments archive 123 --unarchive\n\n# Metric results (--from/--to accept all date formats, see [date formats](#date-formats))\nabs experiments metrics list 123                         # list assigned metrics\nabs experiments metrics results 123                      # show results with CI as [lower, upper]\nabs experiments metrics results 123 --ci-bar             # visual CI bar ╌╌╌┊╌══●══╌╌╌\nabs experiments metrics results 123 --variant-index      # use v0, v1, v2 instead of names\nabs experiments metrics results 123 --metric 6           # any metric, even unassigned\nabs experiments metrics results 123 --segment Device     # segment breakdown by name\nabs experiments metrics results 123 --segment Device Country  # multiple segments\nabs experiments metrics results 123 --filter '{\"filter\":[...]}' # raw segment filter JSON\nabs experiments metrics results 123 --from 7d --to now   # time range filter\nabs experiments metrics results 123 --cached             # use previewer cached results (fast)\nabs experiments metrics results 123 -o json              # programmatic metric access\nabs experiments metrics add 123 --metrics 1,2,3\nabs experiments metrics confirm-impact 123 456\nabs experiments metrics exclude 123 456\nabs experiments metrics include 123 456\n\n# Metric dependencies\nabs experiments metrics deps 145                         # show experiments using metric\nabs experiments metrics deps 145 -o json                 # as JSON\n```\n\nImpact values are colored by significance and metric effect direction:\n- **Green**: significant positive outcome (e.g. conversion rate up, or cancellations down)\n- **Red**: significant negative outcome (e.g. conversion rate down, or cancellations up)\n- **Purple**: significant but metric has unknown expected direction\n- **No color**: confidence interval crosses zero (result not statistically significant)\n\n```bash\n\n# Activity log\nabs experiments activity list 123\nabs experiments activity create 123 --note \"Deployed to staging\"\nabs experiments activity edit 123 456 --note \"Updated note\"\nabs experiments activity reply 123 456 --note \"Looks good\"\n\n# Parent experiment\nabs experiments parent 123                               # get parent experiment\n\n# Follow/unfollow\nabs experiments follow 123\nabs experiments unfollow 123\n\n# Annotations\nabs experiments annotations list 123\nabs experiments annotations create 123 --type global\nabs experiments annotations update 456 --type local\nabs experiments annotations archive 456\n\n# Alerts and recommendations\nabs experiments alerts list 123\nabs experiments alerts dismiss 456\nabs experiments recommendations list 123\nabs experiments recommendations dismiss 456\n\n# Analyze experiment design + signals + benchmarks (returns JSON by default)\nabs experiments analyze 123                              # full structured analysis (JSON)\nabs experiments analyze checkout_redesign                # by name\nabs experiments analyze 123 -o table                     # flat one-row summary\nabs experiments analyze 123 -o yaml                      # full analysis as YAML\nabs experiments analyze 123 | jq .recommendation         # pluck a single section\nabs experiments analyze 123 | jq '[.heuristic_output[] | select(.fired)]'\n\n# Access control\nabs experiments access list-users 123\nabs experiments access grant-user 123 --user 1 --role 2\nabs experiments access revoke-user 123 --user 1 --role 2\nabs experiments access list-teams 123\nabs experiments access grant-team 123 --team 1 --role 2\nabs experiments access revoke-team 123 --team 1 --role 2\n\n# Export data and request update\nabs experiments export 123\nabs experiments request-update 123\nabs experiments request-update 123 --tasks preview_metrics,preview_summary\nabs experiments request-update 123 --replace-gsa\nabs experiments request-update 123 --tasks preview_group_sequential --replace-gsa\n\n# Schedule future actions\nabs experiments schedule create 123 --action start --at 2027-01-15T10:00:00Z\nabs experiments schedule create 123 --action stop --at 2027-01-30T18:00:00+02:00 --reason testing\nabs experiments schedule delete 123 456\n\n# Compare experiments\nabs experiments diff 22838 22839                         # diff two experiments\nabs experiments diff 22838 --iteration 6                 # diff with a previous iteration\nabs experiments diff 22838 22839 -o json                 # diff as JSON\nabs experiments diff 22838 22839 --raw                   # diff full API response\n\n# Watch live results\nabs experiments watch 22838                              # poll metrics every 60s\nabs experiments watch 22838 --interval 30                # poll every 30s\nabs experiments watch 22838 --variant-index              # use v0, v1, v2 instead of names\n\n# Bulk operations\nabs experiments bulk start 123 456 789 --note \"Resuming\"\nabs experiments bulk stop 123 456 --reason hypothesis_rejected --note \"Results inconclusive\"\nabs experiments bulk archive 123 456 --yes\nabs experiments bulk full-on 123 --variant 1 --note \"Winner confirmed\"\nabs experiments bulk development 123 456 --note \"Moving to dev\"\nabs experiments bulk stop --state running --app my-app --note \"Maintenance\"\n\n# Unix pipe composition\n# List outputs IDs when piped; action commands read IDs from stdin and pass them through\nabs experiments list --state running | abs experiments stop --reason other --note \"Stopping all\"\nabs experiments list --state stopped | abs experiments archive --note \"Cleanup\"\nabs experiments list --search e2e- --state running | abs experiments stop --reason testing | abs experiments archive --note \"Done\"\n\n# Pipe to bulk (auto-detects stdin)\nabs experiments list --state running --app my-app | abs experiments bulk stop --reason other\n\n# Interactive mode — prompts for note (uses dashboard config for defaults/required)\nabs experiments stop 123 -i\nabs experiments archive 123 -i\n\n# Generate a markdown template for experiment creation\nabs experiments generate-template -o experiment.md\n\n# Refresh cached fields (custom fields + action dialog config for notes)\nabs experiments refresh-fields\n\n# Estimate maximum participants for an experiment\nabs experiments estimate-participants --unit-type user_id\nabs experiments estimate-participants --unit-type user_id --application absmartly.com\nabs experiments estimate-participants --unit-type 42 --application 1 --application 2\nabs experiments estimate-participants --unit-type user_id --from 90d\nabs experiments estimate-participants --unit-type user_id --application absmartly.com --audience '{\"filter\":{\"and\":[{\"eq\":[{\"var\":{\"path\":\"application\"}},{\"value\":\"absmartly.com\"}]}]}}'\nabs experiments estimate-participants --unit-type user_id -o json\n```\n\n#### Analyze experiment\n\n`abs experiments analyze <id>` produces a single structured document that combines what you'd otherwise piece together from `get`, `metrics results`, `alerts list`, `recommendations list`, and `list --type`. It's designed to be consumed by an LLM-based analyzer or a human reviewer; the JSON shape is stable.\n\nDefault output is **JSON** (the `-o table` global default is overridden when `-o` is not explicitly set, since the data is deeply nested). `-o yaml` works the same way. `-o table`/`-o markdown`/`-o plain` switch to a flat one-row summary suitable for tabular display.\n\nThe output has nine top-level sections:\n\n| Section | What it contains |\n|---|---|\n| `experiment` | Headline facts: `name`, `state`, `hypothesis`, `primary_metric_name`, `participant_count`, `leading_variant_*`, `current_recommended_action`, `report_note`. |\n| `alerts` | Active alerts (`{id, type, dismissed}`) — `srm`, `audience_mismatch`, `cleanup_needed`, etc. |\n| `recommendation` | The single best deterministic recommendation (`{theme, title, details}`) picked from the heuristic rule set, or `null`. Warnings outrank successes. |\n| `metric_signals` | Per-metric / per-variant rows from `metrics_snapshot` with `percent_change`, `p_value`, CI bounds, and a derived `status`: `improves` / `contradicts` / `flat` / `inconclusive`. |\n| `related_experiments` | Up to 24 recent same-type experiments. For peers that share the primary metric, `leading_variant_impact_percent` is fetched and compared. |\n| `analysis_confidence` | `high` / `medium` / `low` plus 5 boolean factors and human-readable reasons. Captures *whether there's enough signal to analyze*. |\n| `design_readout` | Whether the experiment design fits the question — summary line, parameter pass-through, and a benchmark from related experiments when available. |\n| `source_signals` | Audit trail mapping each derived field to its API source path (e.g. `experiment.metrics_snapshot.rows[*].percent_change`). Useful for verifying AI analyses. |\n| `heuristic_output` | All 9 heuristic rules with `{rule, fired, theme, title, details, evidence}`. The starting point for an AI analysis when one is available. |\n\n**Example output** (illustrative — a running experiment with a metric snapshot, two comparable peers, a primary-metric win, and a contradicting guardrail):\n\n```json\n{\n  \"experiment\": {\n    \"id\": 18234,\n    \"name\": \"checkout_redesign\",\n    \"type\": \"test\",\n    \"state\": \"running\",\n    \"hypothesis\": \"Single-page checkout reduces drop-off by surfacing all required fields earlier.\",\n    \"primary_metric_name\": \"Checkout Completion Rate\",\n    \"unit_type_name\": \"user_id\",\n    \"participant_count\": 102450,\n    \"leading_variant_name\": \"treatment\",\n    \"leading_variant_impact_percent\": 3.8,\n    \"leading_variant_confidence\": 0.987,\n    \"current_recommended_action\": \"review\",\n    \"report_note\": \"Treatment is winning on primary metric; awaiting eng review of latency regression.\"\n  },\n  \"alerts\": [\n    { \"id\": 1042, \"type\": \"sample_size_reached\", \"dismissed\": false }\n  ],\n  \"recommendation\": {\n    \"theme\": \"warning\",\n    \"title\": \"Review guardrail regressions before rolling out treatment.\",\n    \"details\": \"At least one guardrail metric is moving in the wrong direction, so the apparent win on the primary metric should not be treated as rollout-ready yet.\"\n  },\n  \"metric_signals\": [\n    {\n      \"metric_id\": 14, \"metric_name\": \"Checkout Completion Rate\", \"metric_type\": \"primary\",\n      \"variant_id\": 1, \"variant_name\": \"treatment\",\n      \"percent_change\": 3.8, \"p_value\": 0.013, \"ci_low\": 1.6, \"ci_high\": 6.0,\n      \"status\": \"improves\"\n    },\n    {\n      \"metric_id\": 18, \"metric_name\": \"P95 Page Latency\", \"metric_type\": \"guardrail\",\n      \"variant_id\": 1, \"variant_name\": \"treatment\",\n      \"percent_change\": 4.2, \"p_value\": 0.022, \"ci_low\": 0.9, \"ci_high\": 7.5,\n      \"status\": \"contradicts\"\n    },\n    {\n      \"metric_id\": 21, \"metric_name\": \"Revenue per Visitor\", \"metric_type\": \"secondary\",\n      \"variant_id\": 1, \"variant_name\": \"treatment\",\n      \"percent_change\": 0.4, \"p_value\": 0.61, \"ci_low\": -1.1, \"ci_high\": 1.9,\n      \"status\": \"flat\"\n    }\n  ],\n  \"related_experiments\": [\n    {\n      \"id\": 17988, \"name\": \"checkout_steps_v2\", \"state\": \"stopped\",\n      \"started_at\": \"2025-09-04T12:00:00Z\", \"stopped_at\": \"2025-10-02T16:00:00Z\",\n      \"primary_metric_id\": 14, \"primary_metric_name\": \"Checkout Completion Rate\",\n      \"leading_variant_impact_percent\": 2.1\n    },\n    {\n      \"id\": 18012, \"name\": \"guest_checkout_default\", \"state\": \"stopped\",\n      \"started_at\": \"2025-10-15T09:00:00Z\", \"stopped_at\": \"2025-11-12T09:00:00Z\",\n      \"primary_metric_id\": 14, \"primary_metric_name\": \"Checkout Completion Rate\",\n      \"leading_variant_impact_percent\": 4.6\n    },\n    {\n      \"id\": 18103, \"name\": \"trust_badges_above_fold\", \"state\": \"running\",\n      \"started_at\": \"2025-12-01T10:00:00Z\", \"stopped_at\": null,\n      \"primary_metric_id\": 14, \"primary_metric_name\": \"Checkout Completion Rate\",\n      \"leading_variant_impact_percent\": null\n    }\n  ],\n  \"analysis_confidence\": {\n    \"level\": \"high\",\n    \"reasons\": [],\n    \"factors\": {\n      \"sample_size_reached\": true,\n      \"hypothesis_present\": true,\n      \"primary_metric_present\": true,\n      \"guardrails_present\": true,\n      \"no_blocking_alerts\": true\n    }\n  },\n  \"design_readout\": {\n    \"summary\": \"Designed to detect effects in the expected range; comparable experiments moved this metric by ~3.35%.\",\n    \"notes\": [],\n    \"parameters\": {\n      \"analysis_type\": \"group_sequential\",\n      \"required_alpha\": 0.1,\n      \"required_power\": 0.8,\n      \"minimum_detectable_effect\": 2.5,\n      \"baseline_primary_metric_mean\": 0.382,\n      \"baseline_participants_per_day\": 7400,\n      \"percentage_of_traffic\": 100\n    },\n    \"benchmark\": {\n      \"observed_impacts\": [2.1, 4.6],\n      \"median_abs_impact\": 3.35\n    }\n  },\n  \"source_signals\": [\n    { \"covers\": \"experiment.participant_count\",\n      \"source\": \"experiment.metrics_snapshot.rows[*].cum_unit_count\" },\n    { \"covers\": \"experiment.leading_variant_impact_percent\",\n      \"source\": \"experiment.metrics_snapshot.rows[*].percent_change\" },\n    { \"covers\": \"alerts\",\n      \"source\": \"experiment.alerts[*].type\" },\n    { \"covers\": \"experiment.current_recommended_action\",\n      \"source\": \"experiment.recommended_action.recommendation\" },\n    { \"covers\": \"experiment.report_note\",\n      \"source\": \"experiment.experiment_report.experiment_note.note\" },\n    { \"covers\": \"related_experiments[17988].leading_variant_impact_percent\",\n      \"source\": \"experiments/17988/metrics/main.percent_change\" },\n    { \"covers\": \"related_experiments[18012].leading_variant_impact_percent\",\n      \"source\": \"experiments/18012/metrics/main.percent_change\" }\n  ],\n  \"heuristic_output\": [\n    { \"rule\": \"blocking_alert\", \"fired\": false, \"theme\": \"warning\",\n      \"title\": \"Investigate the experiment before making a rollout decision.\",\n      \"details\": \"Active health checks indicate that the current results may be misleading. Resolve the data-quality or assignment issue before acting on the outcome.\",\n      \"evidence\": { \"alert_types\": [] } },\n    { \"rule\": \"cleanup_needed\", \"fired\": false, \"theme\": \"warning\",\n      \"title\": \"Clean up stale assignments before proceeding.\",\n      \"details\": \"The experiment has cleanup_needed signals; old data may skew the analysis.\",\n      \"evidence\": { \"alert_ids\": [] } },\n    { \"rule\": \"guardrail_contradicts\", \"fired\": true, \"theme\": \"warning\",\n      \"title\": \"Review guardrail regressions before rolling out treatment.\",\n      \"details\": \"At least one guardrail metric is moving in the wrong direction, so the apparent win on the primary metric should not be treated as rollout-ready yet.\",\n      \"evidence\": { \"metrics\": [\"P95 Page Latency\"] } },\n    { \"rule\": \"primary_metric_significant_loss\", \"fired\": false, \"theme\": \"warning\",\n      \"title\": \"Primary metric regressed at significance.\",\n      \"details\": \"The leading variant moves the primary metric in the wrong direction with p-value below alpha. Do not roll out.\",\n      \"evidence\": { \"variant\": \"treatment\", \"impact_percent\": 3.8, \"p_value\": 0.013 } },\n    { \"rule\": \"primary_metric_significant_win\", \"fired\": true, \"theme\": \"success\",\n      \"title\": \"Primary metric improved with treatment.\",\n      \"details\": \"The leading variant beat baseline on the primary metric with p-value below alpha.\",\n      \"evidence\": { \"variant\": \"treatment\", \"impact_percent\": 3.8, \"p_value\": 0.013 } },\n    { \"rule\": \"sample_size_not_reached\", \"fired\": false, \"theme\": \"info\",\n      \"title\": \"Sample size not reached.\",\n      \"details\": \"Group-sequential analysis has not yet hit its planned sample size; treat results as interim.\",\n      \"evidence\": {} },\n    { \"rule\": \"hypothesis_missing\", \"fired\": false, \"theme\": \"info\",\n      \"title\": \"No hypothesis recorded for this experiment.\",\n      \"details\": \"Without a written hypothesis it is hard to judge whether the result answers the original question.\",\n      \"evidence\": {} },\n    { \"rule\": \"no_recommendation_overdue\", \"fired\": false, \"theme\": \"info\",\n      \"title\": \"Experiment has been running long without a recommended action.\",\n      \"details\": \"Consider whether to stop, full-on, or iterate; running indefinitely is rarely the best option.\",\n      \"evidence\": { \"days_running\": 18 } },\n    { \"rule\": \"snapshot_unavailable\", \"fired\": false, \"theme\": \"info\",\n      \"title\": \"No metric snapshot is available yet.\",\n      \"details\": \"The previewer may not have processed this experiment; analysis is limited to design parameters.\",\n      \"evidence\": {} }\n  ]\n}\n```\n\nNotice how the sections reinforce each other in this example:\n\n- `metric_signals` shows the primary metric improving (`status: improves`) AND a guardrail contradicting (`status: contradicts`).\n- That guardrail status drives `heuristic_output[guardrail_contradicts].fired = true` (theme `warning`).\n- Both `guardrail_contradicts` (warning) and `primary_metric_significant_win` (success) fired. `recommendation` is the first fired warning, so the headline becomes \"Review guardrail regressions…\" — even though the primary metric is winning.\n- `analysis_confidence` is `high`: all five factors are true (sample size reached, hypothesis present, primary metric present, guardrails present, no blocking alerts).\n- `design_readout.benchmark.median_abs_impact` (3.35%) is computed from the two comparable peers; the summary phrasing \"designed to detect effects in the expected range\" follows because the median is ≥ 1.5× the MDE (2.5%).\n- `source_signals` records one entry per derived field plus per peer-fetch — the audit trail an LLM analyst can cite.\n\n**Example — distilled view via jq:**\n\n```bash\n$ abs experiments analyze 18234 \\\n    | jq '{name: .experiment.name,\n           confidence: .analysis_confidence.level,\n           recommendation: .recommendation.title,\n           fired: [.heuristic_output[] | select(.fired) | .rule]}'\n```\n```json\n{\n  \"name\": \"checkout_redesign\",\n  \"confidence\": \"high\",\n  \"recommendation\": \"Review guardrail regressions before rolling out treatment.\",\n  \"fired\": [\n    \"guardrail_contradicts\",\n    \"primary_metric_significant_win\"\n  ]\n}\n```\n\nUseful jq slices:\n\n```bash\n# Headline only\nabs experiments analyze 123 \\\n  | jq '{state: .experiment.state, confidence: .analysis_confidence.level, recommendation}'\n\n# Just the rules that fired\nabs experiments analyze 123 \\\n  | jq '[.heuristic_output[] | select(.fired) | {rule, theme, title}]'\n\n# Audit trail of where each derived field came from\nabs experiments analyze 123 | jq .source_signals\n\n# Compare two experiments at a glance\nfor id in 123 456; do\n  abs experiments analyze \"$id\" \\\n    | jq --arg id \"$id\" '{id: $id, name: .experiment.name,\n                          confidence: .analysis_confidence.level,\n                          fired: [.heuristic_output[] | select(.fired) | .rule]}'\ndone\n```\n\nThe 9 heuristic rules, in evaluation order:\n\n| Rule | Theme | Fires when |\n|---|---|---|\n| `blocking_alert` | warning | active alert in `{srm, audience_mismatch, assignment_conflict, experiments_interact}` |\n| `cleanup_needed` | warning | active `cleanup_needed` alert |\n| `guardrail_contradicts` | warning | any guardrail metric_signal status is `contradicts` |\n| `primary_metric_significant_loss` | warning | leading-variant primary `p_value < alpha` and `impact_percent < 0` |\n| `primary_metric_significant_win` | success | leading-variant primary `p_value < alpha` and `impact_percent > 0` |\n| `sample_size_not_reached` | info | running, group_sequential, no `sample_size_reached` alert |\n| `hypothesis_missing` | info | `experiment.hypothesis` empty/null |\n| `no_recommendation_overdue` | info | running ≥ 21 days without a recommended action |\n| `snapshot_unavailable` | info | `metrics_snapshot` not yet computed by the previewer |\n\n`recommendation` is the first fired `warning` rule, falling back to the first fired `success`, else `null`. When no human/AI analyst is available, `heuristic_output` is the deterministic baseline analysis.\n\n`analysis_confidence.level` is computed from five boolean factors (`sample_size_reached`, `hypothesis_present`, `primary_metric_present`, `guardrails_present`, `no_blocking_alerts`): `low` when any blocking alert is active OR ≥2 factors are missing, `medium` when exactly one factor is missing, `high` when all five hold.\n\n#### Custom field options\n\nAfter running `abs experiments refresh-fields`, custom fields from your ABsmartly instance appear as native CLI options:\n\n```bash\nabs experiments create --help\n# Shows: --hypothesis <value>, --jira-url <value>, etc.\n\nabs experiments create --name test --hypothesis \"We believe X\" --jira-url \"https://jira.example.com/IT-1\"\nabs experiments update 123 --hypothesis \"Updated hypothesis\"\nabs experiments restart 123 --hypothesis \"New iteration\"\n\n# Generic fallback (works without cache)\nabs experiments create --name test --field \"Hypothesis=We believe X\"\n```\n\n#### Summary output\n\nAll `list` and `get` commands return summarized output by default. Use `--raw` for the full API response.\n\n```bash\nabs experiments get 123 -o json                          # clean summary as JSON\nabs experiments get 123 -o json --raw                    # full API response\nabs experiments get 123 -o rendered                      # terminal-rendered markdown with styling\nabs experiments list --show experiment_report archived    # add extra fields\nabs experiments list --exclude owner impact confidence    # hide fields\nabs metrics list --show description --exclude effect      # works on all entities\nabs goals get 1 --show created_by_user_id\n```\n\nThe `rendered` format outputs terminal-styled markdown with bold, tables, syntax-highlighted code blocks, ● bullets, and │ blockquotes.\n\nJSON and YAML outputs include syntax highlighting by default. Use `--no-color` to disable it.\n\n#### Unix pipe composition\n\nCommands are composable via standard Unix pipes. When stdout is piped, `list` commands output one ID per line. Action commands (`stop`, `archive`, `start`, `development`, `full-on`) read IDs from stdin when piped, process each experiment, and pass IDs through to stdout for chaining.\n\n```bash\n# Stop all running experiments, then archive them\nabs experiments list --state running | abs experiments stop --reason other --note \"Cleanup\" | abs experiments archive --note \"Done\"\n\n# Archive stopped experiments matching a search term\nabs experiments list --search e2e- --state stopped | abs experiments archive --note \"Removing test experiments\"\n\n# Pipe into other tools\nabs experiments list --state running | wc -l              # count running experiments\nabs experiments list --state running | head -5 | abs experiments stop --reason other\n```\n\nWhen piped, status messages (✓ Experiment N stopped) go to stderr so they don't interfere with the ID stream on stdout. Use `-o json` or `-o yaml` to get full structured output even when piped.\n\nBy default, failed IDs are **not** passed through the pipe — only successfully processed IDs flow to the next command. Use `--pass-through` to pass all IDs (including failures) so a downstream command can attempt its own operation:\n\n```bash\n# Default: only successfully stopped experiments get archived\nabs experiments list --state running | abs experiments stop --reason other | abs experiments archive\n\n# With --pass-through: all IDs flow through even if stop fails\nabs experiments list --state running | abs experiments stop --reason other --pass-through | abs experiments archive\n```\n\n#### Action dialog configuration\n\nAction commands (`stop`, `start`, `archive`, etc.) respect the action dialog field configuration from your ABsmartly dashboard. After running `abs experiments refresh-fields`, the CLI will:\n\n- Use the configured **default note text** when `--note` is not provided\n- **Require** `--note` when the dashboard marks the note as mandatory\n- Show the configured **description** as the prompt when using `-i` (interactive mode)\n\n```bash\nabs experiments refresh-fields                            # cache action dialog config\nabs experiments stop 123                                  # uses default note from config\nabs experiments stop 123 --note \"Custom note\"             # overrides default\nabs experiments stop 123 -i                               # interactive prompt with config defaults\n```\n\n#### Experiment list filters\n\n| Filter | Description |\n|---|---|\n| `--state <state>` | `created`, `ready`, `running`, `development`, `full_on`, `stopped`, `archived`, `scheduled` |\n| `--type <type>` | `test`, `feature` |\n| `--app <name>` | Filter by application name |\n| `--applications <values>` | Filter by application names or IDs (comma-separated) |\n| `--search <query>` | Search by name or display name |\n| `--ids <ids>` | Filter by experiment IDs (comma-separated) |\n| `--unit-types <values>` | Comma-separated unit type names or IDs |\n| `--owners <values>` | Comma-separated owner names, emails, or IDs |\n| `--teams <values>` | Comma-separated team names or IDs |\n| `--tags <values>` | Comma-separated tag names or IDs |\n| `--impact <min,max>` | Filter by impact range (e.g. `-5,50`) |\n| `--confidence <min,max>` | Filter by confidence range (e.g. `90,100`) |\n| `--significance <value>` | `positive`, `negative`, `neutral`, `inconclusive` |\n| `--iterations <n>` | Filter by iteration count |\n| `--iterations-of <id>` | Show all iterations of an experiment |\n| `--created-after <ts>` | Filter by creation date (see [date formats](#date-formats)) |\n| `--created-before <ts>` | Filter by creation date |\n| `--started-after <ts>` | Filter by start date |\n| `--started-before <ts>` | Filter by start date |\n| `--stopped-after <ts>` | Filter by stop date |\n| `--stopped-before <ts>` | Filter by stop date |\n| `--analysis-type <type>` | `fixed_horizon`, `group_sequential` |\n| `--running-type <type>` | `full_on`, `experiment` |\n| `--alert-srm` | Has sample ratio mismatch alert (pass `0` for no alert) |\n| `--alert-cleanup-needed` | Has cleanup needed alert |\n| `--alert-sample-size-reached` | Sample size reached alert |\n| `--items <n>` | Results per page (default: 20) |\n| `--page <n>` | Page number (default: 1) |\n| `--sort <field>` | Sort by field (e.g. `created_at`, `name`, `state`) |\n| `--asc` | Sort ascending |\n| `--desc` | Sort descending |\n| `--show <fields...>` | Add extra columns (e.g. `experiment_report archived`) |\n| `--exclude <fields...>` | Hide columns (e.g. `primary_metric owner`) |\n\n#### Date formats\n\nAll `--from`, `--to`, `--since`, `--created-after`, `--started-before`, and other date/timestamp options across the CLI accept the same formats:\n\n| Format | Example |\n|---|---|\n| Relative (short) | `7d`, `2w`, `1mo`, `24h`, `30m`, `1y` |\n| Relative (with ago) | `7d ago`, `2 weeks ago`, `3 months ago` |\n| Keywords | `today`, `yesterday`, `now` |\n| Calendar | `month-start`, `last-month-start`, `last-month-end`, `year-start`, `last-year-start`, `last-year-end` |\n| ISO 8601 date | `2024-01-01` |\n| ISO 8601 datetime | `2024-01-01T00:00:00Z` |\n| Epoch milliseconds | `1704067200000` |\n\nRelative units: `m` (minutes), `h` (hours), `d` (days), `w` (weeks), `mo` (months), `y` (years). Case-insensitive.\n\nDate inputs default to **your local timezone**. `today` and `yesterday` are calendar-aligned (00:00 local); `2024-01-01` is parsed as local midnight; calendar keywords resolve to local boundaries (`month-start` is 00:00 on the 1st of the current month in your local timezone; `last-month-end` is 1ms before the start of the current month). Explicit ISO datetimes with `Z` (e.g. `2024-01-01T00:00:00Z`) and epoch ms are taken as-is. For deterministic UTC boundaries in automation, run with `TZ=UTC`.\n\nCommands using date formats:\n- `abs experiments list --created-after`, `--created-before`, `--started-after`, `--started-before`, `--stopped-after`, `--stopped-before`\n- `abs experiments metrics results --from`, `--to`\n- `abs activity-feed list --since`\n- `abs events list --from`, `--to`\n- `abs events history --from`, `--to`\n- `abs events json-values --from`, `--to`\n- `abs events json-layouts --from`, `--to`\n- `abs events summary --from`, `--to`\n\n```bash\nabs experiments list --created-after 7d                  # last 7 days\nabs experiments list --stopped-after \"30 days ago\"       # stopped in last month\nabs experiments list --started-after yesterday\nabs experiments list --created-after 2024-01-01          # since Jan 1 2024\nabs experiments metrics results 123 --from 7d --to now\nabs activity-feed list --since 1h\nabs events list --from 2w --to yesterday\nabs events summary --from month-start                    # current calendar month\nabs events summary --from last-month-start --to last-month-end   # exactly last calendar month\n```\n\n#### Valid reasons for stop and restart\n\nThe `--reason` option for `stop` and `restart` accepts these values:\n\n| Reason | Description |\n|---|---|\n| `hypothesis_rejected` | Hypothesis was disproven |\n| `hypothesis_iteration` | Iterating on the hypothesis |\n| `user_feedback` | Based on user feedback |\n| `data_issue` | Data quality problems |\n| `implementation_issue` | Bug or implementation problem |\n| `experiment_setup_issue` | Experiment configuration error |\n| `guardrail_metric_impact` | Guardrail metric triggered |\n| `secondary_metric_impact` | Secondary metric concern |\n| `operational_decision` | Business/operational decision |\n| `performance_issue` | Performance degradation |\n| `testing` | Test or QA purposes |\n| `tracking_issue` | Tracking/instrumentation problem |\n| `code_cleaned_up` | Code has been cleaned up |\n| `other` | Other reason |\n\n#### Valid schedule actions\n\nThe `abs experiments schedule create --action` option accepts: `start`, `restart`, `development`, `stop`, `archive`, `full_on`.\n\nThe `--at` timestamp must include a timezone — either `Z` (UTC) or an offset like `+02:00`. The time must be in the future.\n\n```bash\nabs experiments schedule create 123 --action start --at 2027-01-15T10:00:00Z\nabs experiments schedule create 123 --action stop --at 2027-01-30T18:00:00+02:00\n```\n\n#### Valid request-update tasks\n\nThe `abs experiments request-update --tasks` option accepts a comma-separated list of:\n\n| Task | Description |\n|---|---|\n| `preview_metrics` | Refresh metric results |\n| `preview_summary` | Refresh experiment summary |\n| `preview_group_sequential` | Refresh group sequential analysis |\n| `preview_report_metrics` | Refresh report metrics |\n| `preview_participants_history` | Refresh participant history |\n| `check_cleanup_needed` | Check if code cleanup is needed |\n| `check_audience_mismatch` | Check for audience mismatch |\n| `check_sample_size` | Check sample size reached |\n| `check_sample_ratio_mismatch` | Check for SRM |\n| `check_interactions` | Check for interactions |\n| `check_assignment_conflict` | Check for assignment conflicts |\n| `check_metric_threshold` | Check metric thresholds |\n\n### Activity feed\n\nGlobal activity feed across all experiments. Scans recent experiments and aggregates their activity notes. `--since` accepts all [date formats](#date-formats).\n\nAliases: `activity-feed`\n\n```bash\n# List recent activity\nabs activity-feed list\nabs activity-feed list --since 7d\nabs activity-feed list --search checkout_redesign         # filter by experiment name\nabs activity-feed list --state running --experiments 100   # scan more experiments\nabs activity-feed list --limit 50                          # show more entries\n\n# Show rendered markdown notes (bold, code, tables, mentions resolved to names)\nabs activity-feed list --notes\nabs activity-feed list --notes --show-images               # inline images in notes\n\n# Watch activity in real-time\nabs activity-feed watch --notes\nabs activity-feed watch --interval 10 --notes\nabs activity-feed watch --state running\n\n# Per-experiment activity (also accepts names)\nabs experiments activity list checkout_redesign --notes\nabs experiments activity list checkout_redesign --notes --show-images\nabs experiments activity create checkout_redesign --note \"Deployed to staging\"\n```\n\nNotes render with full markdown support via `marked-terminal`: **bold**, *italic*, `code`, tables, ● bullets, │ blockquotes, syntax-highlighted code blocks, and @mention resolution (user/team names).\n\n### Feature flags\n\n`abs features` is the same as `abs experiments` but auto-filters to `type=feature`.\nAll subcommands work identically.\n\n```bash\nabs features list\nabs features get 123\nabs features create --from-file flag.md\nabs features clone 123 --name my-clone\nabs features restart 123 --as-type experiment    # convert to experiment\n```\n\n### Goals\n\nAliases: `goals`, `goal`\n\n```bash\nabs goals list\nabs goals get 123\nabs goals create --name \"Purchase completed\"\nabs goals update 123 --description \"Updated description\"\n\n# Follow/unfollow\nabs goals follow 123\nabs goals unfollow 123\n\n# Access control\nabs goals access list-users 123\nabs goals access grant-user 123 --user 1 --role 2\nabs goals access revoke-user 123 --user 1 --role 2\n```\n\n### Segments\n\nAliases: `segments`, `segment`\n\n```bash\nabs segments list\nabs segments get 123\nabs segments create my-segment --attribute user_country\nabs segments update 123 --description \"Updated\"\nabs segments delete 123\n```\n\n### Metrics\n\nAliases: `metrics`, `metric`\n\n```bash\nabs metrics list\nabs metrics list --search \"revenue\"\nabs metrics list --owners 1,2 --teams 3                   # by IDs\nabs metrics list --owners \"jane@example.com\" --teams Growth  # by name/email\nabs metrics list --review-status pending\nabs metrics list --sort name --asc\nabs metrics list --ids 1,2,3\n\n# Client-side filters (applied across all pages)\nabs metrics list --metric-type goal_ratio,custom_sql\nabs metrics list --goal purchase                          # name or ID, incl. denominator\nabs metrics list --outlier-limiting                       # has limiting; --no-outlier-limiting for none\nabs metrics list --outlier-method quantile,stdev\nabs metrics list --has-property-filter                    # --no-property-filter for none\nabs metrics list --property-filter-path page_name\nabs metrics list --property-filter-contains BookingFullDetails\nabs metrics list --impact-direction positive,negative\nabs metrics list --cuped                                  # --no-cuped for none\nabs metrics get 123\nabs metrics create --name \"Revenue\" --type count\nabs metrics update 123 --description \"Updated\"\nabs metrics archive 123\nabs metrics archive 123 --unarchive\n\n# Follow/unfollow\nabs metrics follow 123\nabs metrics unfollow 123\n\n# Reviews\nabs metrics review status 123\nabs metrics review request 123\nabs metrics review approve 123\nabs metrics review comments 123\nabs metrics review comment 123 --message \"Looks correct\"\nabs metrics review reply 123 456 --message \"Thanks\"\n\n# Access control\nabs metrics access list-users 123\nabs metrics access grant-user 123 --user 1 --role 2\nabs metrics access revoke-user 123 --user 1 --role 2\n```\n\n#### Metric list filters (client-side)\n\nThese filters run client-side: when any is set, the CLI fetches every metric and filters locally. They combine with AND across flags and OR within a comma-separated list. Because the full set is fetched and filtered, `--items`/`--page` do not apply while filtering — every match is shown. (Server-side equivalents are a planned follow-up.)\n\n| Filter | Description |\n|---|---|\n| `--metric-type <values>` | `goal_count`, `goal_unique_count`, `goal_time_to_achievement`, `goal_property`, `goal_property_unique_count`, `goal_ratio`, `goal_retention`, `goal_activity_period_count`, `custom_sql` |\n| `--goal <values>` | Goal name (substring) or ID; matches numerator and denominator goals |\n| `--outlier-limiting` / `--no-outlier-limiting` | Has / does not have outlier limiting (method other than `unlimited`) |\n| `--outlier-method <values>` | `unlimited`, `quantile`, `stdev`, `fixed` |\n| `--has-property-filter` / `--no-property-filter` | Has / does not have a goal property filter |\n| `--property-filter-path <values>` | Property path(s) referenced inside the property filter (substring) |\n| `--property-filter-contains <text>` | Substring anywhere in the serialized property filter |\n| `--impact-direction <values>` | `positive`, `negative`, `unknown` |\n| `--cuped` / `--no-cuped` | Has / does not have CUPED (variance reduction) enabled |\n\n### Teams\n\nAliases: `teams`, `team`\n\n```bash\nabs teams list\nabs teams list --include-archived\nabs teams get 123\nabs teams create --name \"Growth\"\nabs teams update 123 --description \"Updated\"\nabs teams archive 123\nabs teams archive 123 --unarchive\n\n# Team members\nabs teams members list 123\nabs teams members add 123 --users 1,2,3 --roles 1,2\nabs teams members edit-roles 123 --users 1,2 --roles 3,4\nabs teams members remove 123 --users 1,2\n```\n\n### Users\n\nAliases: `users`, `user`\n\n```bash\nabs users list\nabs users list --include-archived\nabs users list --search alice                          # server-side fuzzy search across name/email/department/job_title\nabs users list --sort email --asc                     # sort by a field\nabs users list --ids 1,2,3                             # filter by user IDs\nabs users get 123\nabs users create --email user@example.com --name \"Jane Doe\"\nabs users update 123 --name \"Jane Smith\"\nabs users archive 123\nabs users archive 123 --unarchive\n\n# Filter users by department, role, job title, email, or name (multi-value, exact by default)\nabs users list --department Ancillaries                       # everyone in Ancillaries\nabs users list --department Ancillaries,Finance              # Ancillaries OR Finance\nabs users list --role \"API User\"                             # everyone with the API User role (name or numeric ID)\nabs users list --role \"API User\",Admin --department Ancillaries  # role AND department\nabs users list --job-title CEO --department Ancillaries\nabs users list --email alice@acme.com,bob@acme.com\nabs users list --name \"Alice Smith\"\nabs users list --department anc --contains                  # substring match (case-insensitive) for department/job-title/email/name\n# When a field filter is active, a `roles` column (global-team roles) is shown;\n# the API has no server-side department/role filter, so client filters scan all\n# users (200/page) and paginate the matched set.\n\n# Reset password\nabs users reset-password 123\n\n# User API keys\nabs users api-keys list --user 42                           # by user ID\nabs users api-keys list --user \"jane@example.com\"            # by email\nabs users api-keys list --user \"Jane Doe\"                    # by name\nabs users api-keys get 1 --user 42\nabs users api-keys create --user 42 --name \"CI Key\"\nabs users api-keys create --user 42 --name \"CI Key\" --description \"For CI/CD\"\nabs users api-keys update 1 --user 42 --name \"Renamed\"\nabs users api-keys delete 1 --user 42\n```\n\n### Tags\n\nManage tags for experiments, goals, and metrics.\n\n```bash\n# Experiment tags (aliases: tags, tag, experiment-tags)\nabs tags list\nabs tags get 1\nabs tags create --tag \"pricing\"\nabs tags update 1 --tag \"pricing-v2\"\nabs tags delete 1\n\n# Goal tags (aliases: goal-tags, goaltags)\nabs goal-tags list\nabs goal-tags create --tag \"revenue\"\nabs goal-tags delete 1\n\n# Metric tags (aliases: metric-tags, metrictags)\nabs metric-tags list\nabs metric-tags create --tag \"engagement\"\nabs metric-tags delete 1\n```\n\n### Metric categories\n\nAliases: `metric-categories`, `metriccategories`, `metric-cats`\n\n```bash\nabs metric-categories list\nabs metric-categories get 1\nabs metric-categories create --name \"Revenue\" --color \"#FF5733\"\nabs metric-categories update 1 --name \"Revenue Metrics\"\nabs metric-categories archive 1\n```\n\n### Applications\n\nAliases: `apps`, `app`, `application`\n\n```bash\nabs apps list\nabs apps get 1\nabs apps create --name \"Mobile App\"\nabs apps update 1 --name \"Mobile App v2\"\nabs apps archive 1\nabs apps archive 1 --unarchive\n```\n\n### Environments\n\nAliases: `envs`, `env`, `environment`\n\n```bash\nabs envs list\nabs envs get 1\nabs envs create --name \"staging\"\nabs envs update 1 --name \"production\"\nabs envs archive 1\nabs envs archive 1 --unarchive\n```\n\n### Unit types\n\nAliases: `units`, `unit`\n\n```bash\nabs units list\nabs units get 1\nabs units create --name \"device_id\"\nabs units update 1 --name \"user_id\"\nabs units archive 1\nabs units archive 1 --unarchive\n```\n\n### Administration\n\n#### Roles\n\nAliases: `roles`, `role`\n\n```bash\nabs roles list\nabs roles get 1\nabs roles create --name \"Editor\"\nabs roles update 1 --description \"Can edit experiments\"\nabs roles delete 1\n```\n\n#### Permissions\n\nAliases: `permissions`, `permission`, `perms`, `perm`\n\n```bash\nabs permissions list\nabs permissions categories\nabs permissions policies\n```\n\n#### API keys\n\nAliases: `api-keys`, `apikeys`, `apikey`, `api-key`\n\n```bash\nabs api-keys list\nabs api-keys get 1\nabs api-keys create --name \"CI/CD Key\"\nabs api-keys update 1 --description \"Updated\"\nabs api-keys delete 1\n```\n\n#### Webhooks\n\nAliases: `webhooks`, `webhook`\n\n```bash\nabs webhooks list\nabs webhooks get 1\nabs webhooks create --name \"Slack\" --url https://hooks.slack.com/... --max-retries 5\nabs webhooks update 1 --enabled false\nabs webhooks delete 1\n\n# Webhook event types\nabs webhooks events\n```\n\n### Favorites\n\nManage favorite experiments and metrics.\n\nAliases: `favorites`, `favorite`, `fav`\n\n```bash\nabs favorites add experiment 123\nabs favorites add metric 456\nabs favorites remove experiment 123\nabs favorites remove metric 456\n```\n\n### Notifications\n\nView and manage notifications.\n\nAliases: `notifications`, `notification`, `notif`\n\n```bash\nabs notifications list\nabs notifications list --cursor 100\nabs notifications mark-seen\nabs notifications mark-read --ids 1,2,3\nabs notifications check\n```\n\n### Asset roles\n\nManage global asset roles for access control.\n\nAliases: `asset-roles`, `assetroles`\n\n```bash\nabs asset-roles list\nabs asset-roles get 1\nabs asset-roles create --name \"Reviewer\"\nabs asset-roles update 1 --name \"Lead Reviewer\"\nabs asset-roles delete 1\n```\n\n### Custom sections\n\nManage experiment custom sections.\n\nAliases: `custom-sections`, `customsections`\n\n```bash\nabs custom-sections list\nabs custom-sections create --name \"Launch Checklist\" --type test\nabs custom-sections update 1 --name \"Updated Checklist\"\nabs custom-sections archive 1\nabs custom-sections archive 1 --unarchive\nabs custom-sections reorder --sections \"1:0,2:1,3:2\"\n```\n\n### Events\n\nView and manage event tracking data. `--from`/`--to` accept all [date formats](#date-formats).\n\nAliases: `events`, `event`\n\n```bash\nabs events list --from 7d --to now\nabs events list --event-name my-experiment --event-type exposure --from 5h\nabs events list --app 1 --unit-type 2 --event-type exposure --items 50\nabs events list --unit-uid user123 --env-type production\nabs events list --valid-exposures --from 1d                  # only assignment-changing exposures\nabs events list --invalid-exposures --from 1d                # only ineffective exposures (filtered out)\nabs events list --event-name exp1 --event-name exp2          # multiple names (all filters repeatable)\nabs events history --from 7d --period 1d\nabs events history --event-name my-experiment --env-type production\nabs events unit-data 1:user123 2:device456\nabs events delete-unit-data 1:user123\nabs events json-values --event-type exposure --path \"variant\" --experiment-id 123\nabs events json-values --event-type goal --path \"items/0/segment_flight_number\" --goal-id 164 --match \"LA8186|LA8153\"  # filter values (regex, client-side)\nabs events json-layouts --source unit_attribute --phase after_enrichment\nabs events json-layouts --source unit_goal_property --phase after_enrichment --source-id 164 --match segment_flight  # filter paths (regex)\nabs events json-layouts --source unit_goal_property --phase after_enrichment --source-id 164 --top-level            # only top-level paths\nabs events json-layouts --source unit_goal_property --phase after_enrichment --source-id 164 --max-depth 2          # paths up to 2 segments deep\nabs events summary --from month-start                        # this month, weekly buckets, totals (default)\nabs events summary --from last-month-start --to last-month-end --period month\nabs events summary --from 30d --group-by team --cumulative\nabs events summary --from 7d --visualization bar\nabs events summary --from 30d --group-by team --transpose        # teams as rows (handy with many teams)\n```\n\n### Insights\n\nView experiment velocity and decision analytics. `--from`/`--to` accept ISO dates (see [date formats](#date-formats)).\n\nAliases: `insights`, `insight`\n\n```bash\nabs insights velocity --from 2026-01-01 --to 2026-03-01 --aggregation month\nabs insights decisions --from 2026-01-01 --to 2026-03-01 --aggregation week\nabs insights velocity --from 2026-01-01 --to 2026-03-01 --aggregation day --teams Product,Engineering\nabs insights velocity-detail --from 2026-01-01 --to 2026-03-01 --aggregation month\nabs insights decisions-history --from 2026-01-01 --to 2026-03-01 --aggregation week\n```\n\n### Statistics\n\nStatistical analysis tools for experiment planning.\n\nAliases: `statistics`, `stats`\n\n```bash\nabs statistics power-matrix --json-config '{\"split\":[0.5,0.5],\"metric_mean\":100,\"metric_variance\":25,\"metric_type\":\"count\",\"powers\":[0.8,0.9]}'\n```\n\n### Storage configs\n\nManage storage destinations for data exports.\n\nAliases: `storage-configs`, `storageconfigs`\n\n```bash\nabs storage-configs list\nabs storage-configs get 1\nabs storage-configs create --json-config '{\"type\": \"s3\", ...}'\nabs storage-configs update 1 --json-config '{\"bucket\": \"new-bucket\"}'\nabs storage-configs test --json-config '{\"type\": \"s3\", ...}'\n```\n\n### Action dialog fields\n\nManage fields shown in experiment action dialogs (start, stop, etc.).\n\nAliases: `action-dialog-fields`, `actiondialogfields`\n\n```bash\nabs action-dialog-fields list\nabs action-dialog-fields get 1\nabs action-dialog-fields create --json-config '{\"name\": \"Reason\", \"type\": \"text\"}'\nabs action-dialog-fields update 1 --json-config '{\"required\": true}'\n```\n\n### Platform configuration\n\nManage server-side platform settings (not local CLI config).\n\nAliases: `platform-config`, `platformconfig`, `platform-configs`\n\n```bash\nabs platform-config list\nabs platform-config get 1\nabs platform-config update 1 --value '{\"key\": \"value\"}'\n```\n\n### CORS origins\n\nManage allowed CORS origins.\n\n```bash\nabs cors list\nabs cors get 1\nabs cors create --origin \"https://app.example.com\"\nabs cors update 1 --origin \"https://new.example.com\"\nabs cors delete 1\n```\n\n### Datasources\n\nManage event data source configurations.\n\nAliases: `datasources`, `datasource`, `ds`\n\n```bash\nabs datasources list\nabs datasources get 1\nabs datasources create --json-config '{\"type\": \"postgres\", ...}'\nabs datasources update 1 --json-config '{\"host\": \"new-host\"}'\nabs datasources archive 1\nabs datasources test --json-config '{\"type\": \"postgres\", ...}'\nabs datasources introspect --json-config '{\"type\": \"postgres\", ...}'\nabs datasources validate-query --json-config '{\"query\": \"SELECT ...\"}'\nabs datasources preview-query --json-config '{\"query\": \"SELECT ...\"}'\nabs datasources query 6 \"SELECT experiment_id, COUNT(*) FROM exposures GROUP BY 1\" --limit 20\nabs datasources query 6 --sql - < my_query.sql\nabs datasources set-default 1\nabs datasources schema 1\n```\n\nBy default, `query` and `preview-query` reshape the columnar API response (`columnNames`, `columnTypes`, `rows`) into row-objects so `-o table`, `-o vertical`, `-o json`, etc. render naturally. Pass `--raw` to get the original columnar payload.\n\n### Export configurations\n\nManage scheduled data export configurations.\n\nAliases: `export-configs`, `exportconfigs`, `export-config`\n\n```bash\nabs export-configs list\nabs export-configs get 1\nabs export-configs create --json-config '{\"destination\": \"s3\", ...}'\nabs export-configs update 1 --json-config '{\"schedule\": \"daily\"}'\nabs export-configs archive 1\nabs export-configs pause 1\nabs export-configs histories 1\nabs export-configs cancel-history 1 42 --reason \"No longer needed\"\n```\n\n### Update schedules\n\nManage experiment analysis update schedules.\n\nAliases: `update-schedules`, `updateschedules`\n\n```bash\nabs update-schedules list\nabs update-schedules get 1\nabs update-schedules create --json-config '{\"interval\": \"1h\"}'\nabs update-schedules update 1 --json-config '{\"interval\": \"30m\"}'\nabs update-schedules delete 1\n```\n\n### Raw API access\n\nMake arbitrary API requests for endpoints not covered by dedicated commands.\n\n```bash\n# GET requests\nabs api /experiments\nabs api \"/experiments?search=Bundle&items=5&previews=1\"\nabs api /metrics?archived=true -o json\n\n# POST requests\nabs api /experiments -X POST -d '{\"name\": \"test\", \"type\": \"test\"}'\nabs api -X POST \"/experiments/123/metrics/145\" -o json   # fetch metric data\n\n# Custom headers\nabs api /experiments -H \"X-Custom: value\"\n```\n\n### Utilities\n\n```bash\n# Open the ABSmartly dashboard in your browser\nabs open\nabs open experiments\nabs open experiments 123\n\n# Diagnose configuration issues\nabs doctor\n```\n\n`abs doctor` validates API connectivity, profile configuration, custom fields cache status, credentials file permissions, and warns about stale experiments stuck in \"created\" state.\n\n```bash\n# Show version and build info\nabs version\n```\n\n#### Shell completions\n\nGenerate shell completions for Bash or Zsh with tab-completion for commands, subcommands, and options.\n\n```bash\n# Bash\neval \"$(abs completion bash)\"\n# Or persist:\nabs completion bash >> ~/.bashrc\n\n# Zsh\neval \"$(abs completion zsh)\"\n# Or persist:\nabs completion zsh >> ~/.zshrc\n```\n\n## Configuration\n\nConfiguration is stored in `~/.config/absmartly/config.yaml` as YAML. API keys are stored securely in your OS keychain via [keytar](https://github.com/nicktomlin/keytar).\n\n```bash\n# View current configuration\nabs config list\n\n# Get/set individual values\nabs config get output\nabs config set output json\nabs config unset output\n\n# Manage profiles\nabs config profiles list\nabs config profiles use staging\nabs config profiles delete old-profile\n```\n\n### Configuration file format\n\n```yaml\ndefault-profile: default\nanalytics-opt-out: false\noutput: table\nprofiles:\n  default:\n    api:\n      endpoint: https://your-instance.absmartly.com/v1\n    expctld:\n      endpoint: https://ctl.absmartly.io/v1\n    application: my-app\n    environment: production\n  staging:\n    api:\n      endpoint: https://staging.absmartly.com/v1\n    expctld:\n      endpoint: https://ctl.absmartly.io/v1\n    environment: staging\n```\n\n### Environment variables\n\n| Variable | Description |\n|---|---|\n| `ABSMARTLY_API_KEY` | API key (overrides keychain and credentials file) |\n| `ABSMARTLY_API_ENDPOINT` | API endpoint URL (overrides profile config) |\n\nAPI key resolution order: `--api-key` flag > `ABSMARTLY_API_KEY` env > OS keychain > `~/.config/absmartly/credentials.json`\n\n> **Security note**: Environment variables may be visible in process listings and logs. For production, prefer OS keychain storage (default) or the credentials file on headless systems.\n\n## Experiment templates\n\nThe CLI uses Markdown templates with YAML frontmatter for experiment round-trips.\nAll names (metrics, owners, teams, tags, applications) are resolved by name — no IDs needed.\n\n```bash\n# Generate a blank template\nabs experiments generate-template -o experiment.md\n\n# Export an existing experiment as a template\nabs experiments get 123 -o template > experiment.md\nabs experiments get 123 -o template --embed-screenshots > experiment.md  # with base64 screenshots\nabs experiments get 123 -o template --screenshots-dir ./screenshots      # save screenshots as files\n\n# Create from template\nabs experiments create --from-file experiment.md\nabs experiments create --from-file experiment.md --dry-run   # preview payload\ncat experiment.md | abs experiments create --from-file -     # from stdin\n\n# Update from template\nabs experiments update 123 --from-file experiment.md\n\n# Clone (shortcut)\nabs experiments clone 123 --name my-clone\n\n# Restart with changes\nabs experiments restart 123 --from-file changes.md --reason hypothesis_iteration\n```\n\n### Template format\n\n```markdown\n---\nname: my_experiment\ndisplay_name: \"My Experiment\"\nunit_type: user_id\napplication: www\nprimary_metric: Net conversion rate\nsecondary_metrics:\n  - Gross conversion rate\n  - Product page views\nguardrail_metrics:\n  - Page load time (ms)\n  - Error rate\npercentages: 50/50\npercentage_of_traffic: 100\nowners:\n  - Márcio Martins <marcio@absmartly.com>\n  - Cal Courtney <cal@absmartly.com>\nteams:\n  - Product\n  - Engineering\ntags:\n  - q1\n  - homepage\nanalysis_type: group_sequential\nrequired_alpha: 0.1\nrequired_power: 0.8\nbaseline_participants: 143\n---\n\n## Audience\n\n```json\n{\n  \"filter\": [\n    { \"and\": [{ \"eq\": [{ \"var\": { \"path\": \"language\" } }, { \"value\": \"en-GB\" }] }] }\n  ]\n}\n```\n\n## Variants\n\n### variant_0\n\nname: Control\nconfig: {}\n![Control variant](./screenshots/control.png)\n\n### variant_1\n\nname: Treatment\nconfig: {\"feature_enabled\": true}\n![Treatment variant](./screenshots/treatment.png)\n\n## Description\n\n### Hypothesis\n\nWe believe changing X will improve Y by Z%.\n\n### Implementation Details\n\nDetails here...\n\n## JIRA\n\n### JIRA URL\n\nhttps://jira.example.com/IT-1234\n```\n\nTemplate features:\n- **Metrics**: resolved by name, including archived metrics\n- **Owners**: `Name <email>`, email, or user ID\n- **Teams/tags**: resolved by name\n- **Audience**: JSON code block, parsed and compacted for the API\n- **Custom fields**: grouped by section name (matches UI sections)\n- **User-type fields**: exported as email, converted back to `{\"selected\":[{\"userId\":N}]}`\n- **Screenshots**: local file paths, URLs, or base64 data URIs\n- **Type**: inferred from command (`abs experiments` → test, `abs features` → feature)\n\n## Programmatic usage\n\nThe package exports a framework-free core layer that can be used programmatically without Commander.js or any CLI dependencies. The core functions are tree-shakeable — import only what you need.\n\n### Exports\n\n| Import path | Description |\n|---|---|\n| `@absmartly/cli/core/experiments` | Experiment lifecycle, metrics, bulk operations |\n| `@absmartly/cli/core/goals` | Goal CRUD and access control |\n| `@absmartly/cli/core/metrics` | Metric CRUD, reviews, access control |\n| `@absmartly/cli/core/teams` | Team CRU","readmeFilename":"README.md"}