{"_id":"@electivus/sf-apex-log-viewer","_rev":"3-aa26c0981aee6ee2ec0e2a76426f304f","name":"@electivus/sf-apex-log-viewer","dist-tags":{"latest":"0.2.5"},"versions":{"0.2.1":{"name":"@electivus/sf-apex-log-viewer","version":"0.2.1","keywords":["salesforce","sf","sf-plugin","apex","logs","ai-agents"],"license":"MIT","_id":"@electivus/sf-apex-log-viewer@0.2.1","maintainers":[{"name":"mcalixtoneto","email":"calixto@electivus.com"}],"dist":{"shasum":"5ed392dc8727efd2fb4cfcf71ff8f7ee2bb475a2","tarball":"https://registry.npmjs.org/@electivus/sf-apex-log-viewer/-/sf-apex-log-viewer-0.2.1.tgz","fileCount":26,"integrity":"sha512-/YkZoHxA4SHB5LE78zWuWT1CguZ4iYIizfm2bCsZ0a5Yh/LK95FtTrTyH2CL80ENq5uGLmv4hTaRqjOlYAkYxA==","signatures":[{"sig":"MEQCIBpkwujYkDOoj2s4E7bhdjTTTHgWPazVivh9FI//Cz3UAiBCsfv0Tg2LawLqG6ps2b1/VEn7or3nvc0NnFF7AyvRcQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":396800},"type":"module","oclif":{"bin":"sf","topics":{"apex-log-viewer":{"description":"Commands for syncing Apex logs locally."}},"commands":"./lib/commands","devPlugins":["@oclif/plugin-help"],"topicSeparator":" ","flexibleTaxonomy":true},"wireit":{"lint":{"files":["src/**/*.ts","test/**/*.ts","messages/**","**/.eslint*","**/tsconfig.json"],"output":[],"command":"eslint src test --color --cache --cache-location .eslintcache"},"test":{"dependencies":["test:compile","test:only","lint"]},"build":{"dependencies":["compile","lint"]},"format":{"files":["src/**/*.ts","test/**/*.ts","schemas/**/*.json","command-snapshot.json",".prettier*"],"output":[],"command":"prettier --write \"+(src|test|schemas)/**/*.+(ts|js|json)|command-snapshot.json\""},"compile":{"clean":"if-file-deleted","files":["src/**/*.ts","**/tsconfig.json","messages/**"],"output":["lib/**","*.tsbuildinfo"],"command":"tsc -p . --pretty --incremental"},"test:only":{"env":{"FORCE_COLOR":"2"},"files":["test/**/*.ts","src/**/*.ts","**/tsconfig.json",".mocha*","!*.nut.ts",".nycrc"],"output":[],"command":"nyc mocha \"test/**/*.test.ts\""},"link-check":{"files":["./*.md","./!(CHANGELOG).md","messages/**/*.md"],"output":[],"command":"node -e \"process.exit(process.env.CI ? 0 : 1)\" || linkinator \"**/*.md\" --skip \"CHANGELOG.md|node_modules|test/|confluence.internal.salesforce.com|my.salesforce.com|%s\" --markdown --retry --directory-listing --verbosity error"},"test:compile":{"files":["test/**/*.ts","**/tsconfig.json"],"output":[],"command":"tsc -p \"./test\" --pretty"},"test:json-schema":{"files":["src/**/*.ts","schemas"],"output":[],"command":"node --loader ts-node/esm --no-warnings=ExperimentalWarning \"./bin/dev.js\" schema:compare"},"test:command-reference":{"files":["src/**/*.ts","messages/**","package.json"],"output":["tmp/root"],"command":"node --loader ts-node/esm --no-warnings=ExperimentalWarning \"./bin/dev.js\" commandreference:generate --erroronwarnings"},"test:deprecation-policy":{"files":["src/**/*.ts"],"output":[],"command":"node --loader ts-node/esm --no-warnings=ExperimentalWarning \"./bin/dev.js\" snapshot:compare","dependencies":["compile"]}},"engines":{"node":">=18.0.0"},"exports":"./lib/index.js","gitHead":"b59697bdc9a35725c2ad6b1d8124e8dcd346b67f","scripts":{"docs":"sf-docs","lint":"wireit","test":"wireit","build":"wireit","clean":"sf-clean","format":"wireit","compile":"wireit","prepack":"node ./scripts/prepare-publish.mjs && sf-prepack","version":"oclif readme","postpack":"sf-clean --ignore-signing-artifacts","clean-all":"sf-clean all","test:nuts":"nyc mocha \"**/*.nut.ts\" --slow 4500 --timeout 600000 --parallel","test:only":"wireit","link-check":"wireit"},"_npmUser":{"name":"mcalixtoneto","email":"calixto@electivus.com"},"_npmVersion":"11.9.0","description":"Sync Salesforce Apex logs into a local apexlogs directory for AI agent workflows.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"@oclif/core":"^4","@salesforce/core":"^8","@salesforce/sf-plugins-core":"^12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","oclif":"^4.14.0","wireit":"^0.14.12","ts-node":"^10.9.2","typescript":"^5.4.5","@salesforce/dev-scripts":"^10","eslint-plugin-sf-plugin":"^1.18.6","@oclif/plugin-command-snapshot":"^5.1.9","@salesforce/cli-plugins-testkit":"^5.3.10"},"_npmOperationalInternal":{"tmp":"tmp/sf-apex-log-viewer_0.2.1_1773660031627_0.4791325631149186","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@electivus/sf-apex-log-viewer","version":"0.2.4","keywords":["salesforce","sf","sf-plugin","apex","logs","ai-agents"],"license":"MIT","_id":"@electivus/sf-apex-log-viewer@0.2.4","maintainers":[{"name":"mcalixtoneto","email":"calixto@electivus.com"}],"homepage":"https://github.com/Electivus/sf-apex-log-viewer#readme","bugs":{"url":"https://github.com/Electivus/sf-apex-log-viewer/issues"},"dist":{"shasum":"54386a82cb45dcc3fec59fe55fc2c94db092c6ec","tarball":"https://registry.npmjs.org/@electivus/sf-apex-log-viewer/-/sf-apex-log-viewer-0.2.4.tgz","fileCount":26,"integrity":"sha512-4WN7e/tU8qn+CM4uN46Vn2L46iEv9WXPl96Bp0i8+lukjVDr6+ZV6bnSnyv+mVIMyPhq9DUyvZhO+wGqqFja/Q==","signatures":[{"sig":"MEUCID5E6P7idLCpi2B6C3HTZ6nL0+cMrq/GT3eg+pQ89DH6AiEA7IG2ULrXBaCqr9g+gV+GEcvACeKfWWXHDbf5y8HATpM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@electivus%2fsf-apex-log-viewer@0.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":400789},"type":"module","oclif":{"bin":"sf","topics":{"apex-log-viewer":{"description":"Commands for syncing Apex logs locally."}},"commands":"./lib/commands","devPlugins":["@oclif/plugin-help"],"topicSeparator":" ","flexibleTaxonomy":true},"wireit":{"lint":{"files":["src/**/*.ts","test/**/*.ts","messages/**","**/.eslint*","**/tsconfig.json"],"output":[],"command":"eslint src test --color --cache --cache-location .eslintcache"},"test":{"dependencies":["test:compile","test:only","lint"]},"build":{"dependencies":["compile","lint"]},"format":{"files":["src/**/*.ts","test/**/*.ts","schemas/**/*.json","command-snapshot.json",".prettier*"],"output":[],"command":"prettier --write \"+(src|test|schemas)/**/*.+(ts|js|json)|command-snapshot.json\""},"compile":{"clean":"if-file-deleted","files":["src/**/*.ts","**/tsconfig.json","messages/**"],"output":["lib/**","*.tsbuildinfo"],"command":"tsc -p . --pretty --incremental"},"test:only":{"env":{"FORCE_COLOR":"2"},"files":["test/**/*.ts","src/**/*.ts","**/tsconfig.json",".mocha*","!*.nut.ts",".nycrc"],"output":[],"command":"nyc mocha \"test/**/*.test.ts\""},"link-check":{"files":["./*.md","./!(CHANGELOG).md","messages/**/*.md"],"output":[],"command":"node -e \"process.exit(process.env.CI ? 0 : 1)\" || linkinator \"**/*.md\" --skip \"CHANGELOG.md|node_modules|test/|confluence.internal.salesforce.com|my.salesforce.com|%s\" --markdown --retry --directory-listing --verbosity error"},"test:compile":{"files":["test/**/*.ts","**/tsconfig.json"],"output":[],"command":"tsc -p \"./test\" --pretty"},"test:json-schema":{"files":["src/**/*.ts","schemas"],"output":[],"command":"node --loader ts-node/esm --no-warnings=ExperimentalWarning \"./bin/dev.js\" schema:compare"},"test:command-reference":{"files":["src/**/*.ts","messages/**","package.json"],"output":["tmp/root"],"command":"node --loader ts-node/esm --no-warnings=ExperimentalWarning \"./bin/dev.js\" commandreference:generate --erroronwarnings"},"test:deprecation-policy":{"files":["src/**/*.ts"],"output":[],"command":"node --loader ts-node/esm --no-warnings=ExperimentalWarning \"./bin/dev.js\" snapshot:compare","dependencies":["compile"]}},"engines":{"node":">=18.0.0"},"exports":"./lib/index.js","gitHead":"adb74a2dd379db05b1899c095ca34125f89831ca","scripts":{"docs":"sf-docs","lint":"wireit","test":"wireit","build":"wireit","clean":"sf-clean","format":"wireit","compile":"wireit","prepack":"node ./scripts/prepare-publish.mjs && sf-prepack","version":"oclif readme","postpack":"sf-clean --ignore-signing-artifacts","clean-all":"sf-clean all","test:nuts":"nyc mocha \"**/*.nut.ts\" --slow 4500 --timeout 600000 --parallel","test:only":"wireit","link-check":"wireit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:65f532a9-8a8f-49ca-917a-02aaeb63781e"}},"repository":{"url":"git+https://github.com/Electivus/sf-apex-log-viewer.git","type":"git"},"_npmVersion":"11.9.0","description":"Sync Salesforce Apex logs into a local apexlogs directory for AI agent workflows.","directories":{},"_nodeVersion":"24.14.0","dependencies":{"@oclif/core":"^4","@salesforce/core":"^8","@salesforce/sf-plugins-core":"^12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","oclif":"^4.14.0","wireit":"^0.14.12","ts-node":"^10.9.2","typescript":"^5.4.5","@salesforce/dev-scripts":"^10","eslint-plugin-sf-plugin":"^1.18.6","@oclif/plugin-command-snapshot":"^5.1.9","@salesforce/cli-plugins-testkit":"^5.3.10"},"_npmOperationalInternal":{"tmp":"tmp/sf-apex-log-viewer_0.2.4_1773661159934_0.6613900277186409","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@electivus/sf-apex-log-viewer","description":"Sync Salesforce Apex logs into a local apexlogs directory for AI agent workflows.","version":"0.2.5","dependencies":{"@oclif/core":"^4","@salesforce/core":"^8","@salesforce/sf-plugins-core":"^12"},"devDependencies":{"@oclif/plugin-command-snapshot":"^5.1.9","@salesforce/cli-plugins-testkit":"^5.3.10","@salesforce/dev-scripts":"^10","eslint-plugin-sf-plugin":"^1.18.6","oclif":"^4.14.0","ts-node":"^10.9.2","tsx":"^4.20.6","typescript":"^5.4.5","wireit":"^0.14.12"},"engines":{"node":">=18.0.0"},"keywords":["salesforce","sf","sf-plugin","apex","logs","ai-agents"],"repository":{"type":"git","url":"git+https://github.com/Electivus/sf-apex-log-viewer.git"},"license":"MIT","oclif":{"commands":"./lib/commands","bin":"sf","topicSeparator":" ","devPlugins":["@oclif/plugin-help"],"topics":{"apex-log-viewer":{"description":"Commands for syncing Apex logs locally."}},"flexibleTaxonomy":true},"scripts":{"build":"wireit","clean":"sf-clean","clean-all":"sf-clean all","compile":"wireit","docs":"sf-docs","format":"wireit","link-check":"wireit","lint":"wireit","postpack":"sf-clean --ignore-signing-artifacts","prepack":"node ./scripts/prepare-publish.mjs && sf-prepack","test":"wireit","test:nuts":"nyc mocha \"**/*.nut.ts\" --slow 4500 --timeout 600000 --parallel","test:only":"wireit","version":"oclif readme"},"publishConfig":{"access":"public"},"wireit":{"build":{"dependencies":["compile","lint"]},"compile":{"command":"tsc -p . --pretty --incremental","files":["src/**/*.ts","**/tsconfig.json","messages/**"],"output":["lib/**","*.tsbuildinfo"],"clean":"if-file-deleted"},"format":{"command":"prettier --write \"+(src|test|schemas)/**/*.+(ts|js|json)|command-snapshot.json\"","files":["src/**/*.ts","test/**/*.ts","schemas/**/*.json","command-snapshot.json",".prettier*"],"output":[]},"lint":{"command":"eslint src test --color --cache --cache-location .eslintcache","files":["src/**/*.ts","test/**/*.ts","messages/**","**/.eslint*","**/tsconfig.json"],"output":[]},"test:compile":{"command":"tsc -p \"./test\" --pretty","files":["test/**/*.ts","**/tsconfig.json"],"output":[]},"test":{"dependencies":["test:compile","test:only","lint"]},"test:only":{"command":"nyc mocha \"test/**/*.test.ts\"","env":{"FORCE_COLOR":"2"},"files":["test/**/*.ts","src/**/*.ts","**/tsconfig.json",".mocha*","!*.nut.ts",".nycrc"],"output":[]},"test:command-reference":{"command":"node --loader ts-node/esm --no-warnings=ExperimentalWarning \"./bin/dev.js\" commandreference:generate --erroronwarnings","files":["src/**/*.ts","messages/**","package.json"],"output":["tmp/root"]},"test:deprecation-policy":{"command":"node --loader ts-node/esm --no-warnings=ExperimentalWarning \"./bin/dev.js\" snapshot:compare","files":["src/**/*.ts"],"output":[],"dependencies":["compile"]},"test:json-schema":{"command":"node --loader ts-node/esm --no-warnings=ExperimentalWarning \"./bin/dev.js\" schema:compare","files":["src/**/*.ts","schemas"],"output":[]},"link-check":{"command":"node -e \"process.exit(process.env.CI ? 0 : 1)\" || linkinator \"**/*.md\" --skip \"CHANGELOG.md|node_modules|test/|confluence.internal.salesforce.com|my.salesforce.com|%s\" --markdown --retry --directory-listing --verbosity error","files":["./*.md","./!(CHANGELOG).md","messages/**/*.md"],"output":[]}},"exports":"./lib/index.js","type":"module","gitHead":"0dcd998e195141d21dd65f24ff45c44c7f7ae149","_id":"@electivus/sf-apex-log-viewer@0.2.5","bugs":{"url":"https://github.com/Electivus/sf-apex-log-viewer/issues"},"homepage":"https://github.com/Electivus/sf-apex-log-viewer#readme","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-iPvea2wY5nduH9QR6aXDdNQDY+w0sQF48QfcVUzmNiOsvq03V+HVCakfR+vfxo4VmWE5M+8fp+JX6HVUPSeYNg==","shasum":"aef724846977ca85af62a0dfdf3eff6c7aa6fb33","tarball":"https://registry.npmjs.org/@electivus/sf-apex-log-viewer/-/sf-apex-log-viewer-0.2.5.tgz","fileCount":26,"unpackedSize":400789,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@electivus%2fsf-apex-log-viewer@0.2.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCwCemaH7AL5xxndtkUsKAnO51lc5DlAhYd81DouhZHJwIgTCR2pd6aUblUQH30hMdXn26XCOjKXIf+NhlcxVkFxlQ="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:65f532a9-8a8f-49ca-917a-02aaeb63781e"}},"directories":{},"maintainers":[{"name":"mcalixtoneto","email":"calixto@electivus.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sf-apex-log-viewer_0.2.5_1773668008775_0.6317436018280604"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-16T11:20:31.537Z","modified":"2026-03-16T13:33:29.215Z","0.2.1":"2026-03-16T11:20:31.821Z","0.2.4":"2026-03-16T11:39:20.083Z","0.2.5":"2026-03-16T13:33:28.929Z"},"bugs":{"url":"https://github.com/Electivus/sf-apex-log-viewer/issues"},"license":"MIT","homepage":"https://github.com/Electivus/sf-apex-log-viewer#readme","keywords":["salesforce","sf","sf-plugin","apex","logs","ai-agents"],"repository":{"type":"git","url":"git+https://github.com/Electivus/sf-apex-log-viewer.git"},"description":"Sync Salesforce Apex logs into a local apexlogs directory for AI agent workflows.","maintainers":[{"name":"mcalixtoneto","email":"calixto@electivus.com"}],"readme":"# @electivus/sf-apex-log-viewer\n\n`@electivus/sf-apex-log-viewer` is a Salesforce CLI plugin focused on one job: keeping a local `apexlogs` directory in sync with new Apex logs so AI agents and local tools can inspect them quickly.\n\nThe first version is intentionally sync-first. It does not try to replace `rg`, your editor, or downstream analysis tools. It downloads raw logs to disk, keeps a per-org checkpoint, and returns structured JSON for automation.\n\n## Why this exists\n\nWhen an agent is helping inside a Salesforce project, the hard part is often not analyzing a log, but getting the new logs onto disk in a predictable place without repeating work.\n\nThis plugin gives us:\n\n- Incremental sync by org using a persisted checkpoint.\n- Stable local files under `./apexlogs`.\n- JSON output that is easy to call from agents or scripts.\n- Fast sync behavior without extra parsing work during download.\n\n## Install\n\n```bash\nsf plugins link .\n```\n\nFor a packaged install later:\n\n```bash\nsf plugins install @electivus/sf-apex-log-viewer@x.y.z\n```\n\n## Usage\n\nSync new logs into the default `./apexlogs` directory:\n\n```bash\nsf apex-log-viewer sync --target-org my-org@example.com\n```\n\nSync and emit machine-readable output:\n\n```bash\nsf apex-log-viewer sync --target-org my-org@example.com --json\n```\n\nStart a fresh checkpoint from a specific moment:\n\n```bash\nsf apex-log-viewer sync --target-org my-org@example.com --since 2026-03-15T19:00:00Z\n```\n\nRescan all available logs without re-downloading files that already exist:\n\n```bash\nsf apex-log-viewer sync --target-org my-org@example.com --full\n```\n\nChoose a custom directory:\n\n```bash\nsf apex-log-viewer sync --target-org my-org@example.com --output-dir .agent/apexlogs\n```\n\n## Sync behavior\n\n- Default output directory: `./apexlogs`\n- Default state file: `<output-dir>/.sf-apex-log-viewer-state.json`\n- First sync without a checkpoint: downloads the latest 100 logs\n- Later syncs: download only logs newer than the saved `(StartTime, Id)` watermark\n- `--full`: ignores the checkpoint for discovery, but still skips files that already exist on disk\n- `--since`: uses the provided timestamp as the cutoff for that execution\n\nDownloaded logs are saved as:\n\n```text\n<username>_<logId>.log\n```\n\n## Development\n\nInstall dependencies and build:\n\n```bash\nnpm install --ignore-scripts\nnpm run build\n```\n\nRun the command locally:\n\n```bash\nnode ./bin/dev.js apex-log-viewer sync --help\n```\n\nRun tests:\n\n```bash\nnpm test\n```\n\n## Secure publishing\n\nThis repository is configured for npm Trusted Publishing through GitHub Actions instead of a long-lived write token.\n\nBefore publishing from GitHub Actions, configure npm Trusted Publishing with:\n\n- Repository owner: `Electivus`\n- Repository name: `sf-apex-log-viewer`\n- Workflow filename: `onRelease.yml`\n\nAfter Trusted Publishing is working, prefer this npm package setting:\n\n- `Require two-factor authentication and disallow tokens`\n\nThat setup keeps interactive 2FA for humans while letting GitHub Actions publish through short-lived OIDC credentials.\n","readmeFilename":"README.md"}