{"_id":"@andrewgolovanov/pulse","_rev":"6-9e3399034f2db7cef7981bb58729eedf","name":"@andrewgolovanov/pulse","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@andrewgolovanov/pulse","version":"0.1.0","license":"UNLICENSED","_id":"@andrewgolovanov/pulse@0.1.0","maintainers":[{"name":"andrewgolovanov","email":"spacewebdeveloper@gmail.com"}],"homepage":"https://github.com/pixel-point/siteos-health#readme","bugs":{"url":"https://github.com/pixel-point/siteos-health/issues"},"bin":{"pulse":"dist/cli.js"},"dist":{"shasum":"725189c43df77a94be4be8166346c11e959b4833","tarball":"https://registry.npmjs.org/@andrewgolovanov/pulse/-/pulse-0.1.0.tgz","fileCount":4,"integrity":"sha512-Fjiwo+DaYYK8eZjUB/oBWZDe/67W76Yxr7SUnzZCPIe3MT4uxXNk4X1999YN825E4EH12oi3VLNE8+SiOaA99A==","signatures":[{"sig":"MEUCIGRrxc/A7LPTryf/L9eyMacJmfXOLL6rZhdNZUmomG3PAiEAxs4kLYjCNovLM6cmv0aQbapJJUzYsla/LHs+oD4UIJI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":232937},"type":"module","engines":{"node":">=20.12"},"gitHead":"83b4792b8cb552d4459ce2de59d4e254c971f253","scripts":{"lint":"oxlint src scripts vitest.config.ts","test":"vitest run --config vitest.config.ts --pool=forks --poolOptions.forks.singleFork","build":"node scripts/build.mjs","verify":"pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm pack:check","typecheck":"tsc --noEmit","pack:check":"npm pack --dry-run","format:check":"oxfmt --check src scripts README.md package.json tsconfig.json vitest.config.ts","prepublishOnly":"pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"_npmUser":{"name":"andrewgolovanov","email":"spacewebdeveloper@gmail.com"},"repository":{"url":"git+https://github.com/pixel-point/siteos-health.git","type":"git","directory":"packages/cli"},"_npmVersion":"10.9.4","description":"Developer-first CLI for validating, running, and packaging SiteOS Pulse Playwright suites.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"tar":"7.5.20","zod":"3.25.76","esbuild":"^0.27.7","fast-glob":"3.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.45.0","oxlint":"^1.60.0","vitest":"^3.2.4","typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/pulse_0.1.0_1784799480283_0.556825587931953","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@andrewgolovanov/pulse","version":"0.1.1","license":"UNLICENSED","_id":"@andrewgolovanov/pulse@0.1.1","maintainers":[{"name":"andrewgolovanov","email":"spacewebdeveloper@gmail.com"}],"homepage":"https://github.com/pixel-point/siteos-pulse#readme","bugs":{"url":"https://github.com/pixel-point/siteos-pulse/issues"},"bin":{"pulse":"dist/cli.js"},"dist":{"shasum":"b75afbad574b0523163c0028dd416ddc6abb42ff","tarball":"https://registry.npmjs.org/@andrewgolovanov/pulse/-/pulse-0.1.1.tgz","fileCount":4,"integrity":"sha512-WCPRGc6m8osjSaxlRo+Ij1Vks+cy3M0OIOf7I291ayZuHTfnMjUFPJOlWJoqizffdyCpzHARLdXXc35VuAqgTA==","signatures":[{"sig":"MEQCIBi8eC4diUk9K0Ag2Xbkhw51I33e8E76BJauOEdpGfQTAiBGPAtZMmnp06pcqdn2FzWpWAoGxVZDRx59yVSqHOsYjg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":231896},"type":"module","engines":{"node":">=20.12"},"gitHead":"7ee0363f7af9776ad2a734a274c566f71699932d","scripts":{"lint":"oxlint src scripts vitest.config.ts","test":"vitest run --config vitest.config.ts --pool=forks --poolOptions.forks.singleFork","build":"node scripts/build.mjs","verify":"pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm pack:check","typecheck":"tsc --noEmit","pack:check":"npm pack --dry-run","format:check":"oxfmt --check src scripts README.md package.json tsconfig.json vitest.config.ts","prepublishOnly":"pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"_npmUser":{"name":"andrewgolovanov","email":"spacewebdeveloper@gmail.com"},"repository":{"url":"git+https://github.com/pixel-point/siteos-pulse.git","type":"git","directory":"packages/cli"},"_npmVersion":"10.9.4","description":"Developer-first CLI for validating, running, and packaging SiteOS Pulse Playwright suites.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"tar":"7.5.20","zod":"3.25.76","esbuild":"^0.27.7","fast-glob":"3.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.45.0","oxlint":"^1.60.0","vitest":"^3.2.4","typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/pulse_0.1.1_1784801435126_0.5148844634848366","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@andrewgolovanov/pulse","version":"0.1.2","license":"UNLICENSED","_id":"@andrewgolovanov/pulse@0.1.2","maintainers":[{"name":"andrewgolovanov","email":"spacewebdeveloper@gmail.com"}],"homepage":"https://github.com/pixel-point/siteos-pulse#readme","bugs":{"url":"https://github.com/pixel-point/siteos-pulse/issues"},"bin":{"pulse":"dist/cli.js"},"dist":{"shasum":"f9910aeb6dca7867c5c7ba4e56cf7741c0fb497b","tarball":"https://registry.npmjs.org/@andrewgolovanov/pulse/-/pulse-0.1.2.tgz","fileCount":4,"integrity":"sha512-Sen+Gc3m1+FOhzfOCbY8tdydmq7q0hQTbhPqx8suzxLPWU0BTBsCCIgaoRrxcKroC9qEu6Ijzvz2p5sa9pNMMw==","signatures":[{"sig":"MEYCIQDJrP9aIYlFKRABLHt8WKlguVSpnm7bUMhy7BikLG8DGgIhAKooOcE/yaC4Uv0kkQJ1ybXZZD3AJoZ3Rv2Y4dDpcVXg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":259124},"type":"module","engines":{"node":">=20.12"},"gitHead":"43c6995c10878431fcdde7f35a87795334de91ed","scripts":{"lint":"oxlint src scripts vitest.config.ts","test":"vitest run --config vitest.config.ts --pool=forks --poolOptions.forks.singleFork","build":"node scripts/build.mjs","verify":"pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm pack:check","typecheck":"tsc --noEmit","pack:check":"npm pack --dry-run","format:check":"oxfmt --check src scripts README.md package.json tsconfig.json vitest.config.ts","prepublishOnly":"pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"_npmUser":{"name":"andrewgolovanov","email":"spacewebdeveloper@gmail.com"},"repository":{"url":"git+https://github.com/pixel-point/siteos-pulse.git","type":"git","directory":"packages/cli"},"_npmVersion":"10.9.4","description":"Developer-first CLI for validating, running, and packaging SiteOS Pulse Playwright suites.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"tar":"7.5.20","zod":"3.25.76","esbuild":"^0.27.7","fast-glob":"3.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.45.0","oxlint":"^1.60.0","vitest":"^3.2.4","typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/pulse_0.1.2_1784805360997_0.6304542779971418","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@andrewgolovanov/pulse","version":"0.1.3","license":"UNLICENSED","_id":"@andrewgolovanov/pulse@0.1.3","maintainers":[{"name":"andrewgolovanov","email":"spacewebdeveloper@gmail.com"}],"homepage":"https://github.com/pixel-point/siteos-pulse#readme","bugs":{"url":"https://github.com/pixel-point/siteos-pulse/issues"},"bin":{"pulse":"dist/cli.js"},"dist":{"shasum":"f59174bf541b0284fd03f2aed3c456725f56a74d","tarball":"https://registry.npmjs.org/@andrewgolovanov/pulse/-/pulse-0.1.3.tgz","fileCount":4,"integrity":"sha512-r/KaR1zqZoKaXQxMhZwGax0taS/b3SyNUK7l41pZUDrpz4nHqqia732rpFTq+JxRDH5W1FwbZREK2foO5p3uFw==","signatures":[{"sig":"MEQCIHjIX/upLo3I7smAalN4xvKmwHIoj3KzxaTOiifBHOLEAiAUItl0ryKm7FBkzQOAZ7p5cGGg0EqULxZ0fbpalHakiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":259110},"type":"module","engines":{"node":">=20.12"},"gitHead":"6a7663b367d43d2f20b85f291c2619ef51f1f9c7","scripts":{"lint":"oxlint src scripts vitest.config.ts","test":"vitest run --config vitest.config.ts --pool=forks --poolOptions.forks.singleFork","build":"node scripts/build.mjs","verify":"pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm pack:check","typecheck":"tsc --noEmit","pack:check":"npm pack --dry-run","format:check":"oxfmt --check src scripts README.md package.json tsconfig.json vitest.config.ts","prepublishOnly":"pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"_npmUser":{"name":"andrewgolovanov","email":"spacewebdeveloper@gmail.com"},"repository":{"url":"git+https://github.com/pixel-point/siteos-pulse.git","type":"git","directory":"packages/cli"},"_npmVersion":"10.9.4","description":"Developer-first CLI for validating, running, and packaging SiteOS Pulse Playwright suites.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"tar":"7.5.20","zod":"3.25.76","esbuild":"^0.27.7","fast-glob":"3.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.45.0","oxlint":"^1.60.0","vitest":"^3.2.4","typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/pulse_0.1.3_1784808236333_0.0397230238335915","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@andrewgolovanov/pulse","version":"0.2.0","license":"UNLICENSED","_id":"@andrewgolovanov/pulse@0.2.0","maintainers":[{"name":"andrewgolovanov","email":"spacewebdeveloper@gmail.com"}],"homepage":"https://github.com/pixel-point/siteos-pulse#readme","bugs":{"url":"https://github.com/pixel-point/siteos-pulse/issues"},"bin":{"pulse":"dist/cli.js"},"dist":{"shasum":"9114c6cad943317f0cc2cf3f0bd6eedf1811964e","tarball":"https://registry.npmjs.org/@andrewgolovanov/pulse/-/pulse-0.2.0.tgz","fileCount":4,"integrity":"sha512-wHFauukzkuERfle3juteTJkYxyZe3oNZVLBsdnItlPhS5jLYxwMrzQrHingHsOcnz3B39Ed2EqH/f2uyJlCrhQ==","signatures":[{"sig":"MEUCIQDmUDALq2ZGwU4B8oMe9i7lvLpPu1yggWdF5VNCksLmcAIgcNbyjadwU3/qd1lFyGgbnoTaADls/uAjr6XcNDCjeZ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":394870},"type":"module","engines":{"node":">=20.12"},"gitHead":"a8a684073dfe09cad3449188e3ed97d528739ec8","scripts":{"lint":"oxlint src scripts vitest.config.ts","test":"vitest run --config vitest.config.ts --pool=forks --poolOptions.forks.singleFork","build":"node scripts/build.mjs","verify":"pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm pack:check","typecheck":"tsc --noEmit","pack:check":"npm pack --dry-run","format:check":"oxfmt --check src scripts README.md package.json tsconfig.json vitest.config.ts","prepublishOnly":"pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"_npmUser":{"name":"andrewgolovanov","email":"spacewebdeveloper@gmail.com"},"repository":{"url":"git+https://github.com/pixel-point/siteos-pulse.git","type":"git","directory":"packages/cli"},"_npmVersion":"10.9.4","description":"Developer-first CLI for synchronizing, validating, running, and deploying SiteOS Pulse Playwright suites.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"tar":"7.5.20","zod":"3.25.76","esbuild":"^0.27.7","fast-glob":"3.3.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"^0.45.0","oxlint":"^1.60.0","vitest":"^3.2.4","typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/pulse_0.2.0_1785167147626_0.2659337264867152","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@andrewgolovanov/pulse","version":"0.3.0","description":"Developer-first CLI for synchronizing, validating, running, and deploying SiteOS Pulse Playwright suites.","type":"module","bin":{"pulse":"dist/cli.js"},"engines":{"node":">=20.12"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/pixel-point/siteos-pulse.git","directory":"packages/cli"},"license":"UNLICENSED","scripts":{"build":"node scripts/build.mjs","lint":"oxlint src scripts vitest.config.ts","format:check":"oxfmt --check src scripts README.md package.json tsconfig.json vitest.config.ts","typecheck":"tsc --noEmit","test":"vitest run --config vitest.config.ts --pool=forks --poolOptions.forks.singleFork","verify":"pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm pack:check","pack:check":"npm pack --dry-run","prepublishOnly":"pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"dependencies":{"esbuild":"^0.27.7","fast-glob":"3.3.3","tar":"7.5.20","zod":"3.25.76"},"devDependencies":{"@types/node":"^20","oxfmt":"^0.45.0","oxlint":"^1.60.0","typescript":"^5","vitest":"^3.2.4"},"_id":"@andrewgolovanov/pulse@0.3.0","gitHead":"418a9e9c249f7c21c1bf9f081c3c8ab521df7395","bugs":{"url":"https://github.com/pixel-point/siteos-pulse/issues"},"homepage":"https://github.com/pixel-point/siteos-pulse#readme","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-QGHxqzX4nLRKW8eomyL99hi6yCZXc57YJliPLYT8+hAc3gxdixD6nk5/bz2vHbP61t7AiDnxxfiCCz3E+rg0NA==","shasum":"5a293b11d45980d0625cce8bb75a28a04fedfa07","tarball":"https://registry.npmjs.org/@andrewgolovanov/pulse/-/pulse-0.3.0.tgz","fileCount":4,"unpackedSize":432022,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEwy3S7ToykRraLiElP81tKQ7R/5qwzK3qlI1weQKbSCAiEAmoSTJ4aCz5ol4W4/hMzUPVRIvZ/fHVIk62M3czq6cjE="}]},"_npmUser":{"name":"andrewgolovanov","email":"spacewebdeveloper@gmail.com"},"directories":{},"maintainers":[{"name":"andrewgolovanov","email":"spacewebdeveloper@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pulse_0.3.0_1785184177496_0.7758759985471844"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-23T09:38:00.153Z","modified":"2026-07-27T20:29:37.796Z","0.1.0":"2026-07-23T09:38:00.503Z","0.1.1":"2026-07-23T10:10:35.305Z","0.1.2":"2026-07-23T11:16:01.118Z","0.1.3":"2026-07-23T12:03:56.478Z","0.2.0":"2026-07-27T15:45:47.780Z","0.3.0":"2026-07-27T20:29:37.646Z"},"bugs":{"url":"https://github.com/pixel-point/siteos-pulse/issues"},"license":"UNLICENSED","homepage":"https://github.com/pixel-point/siteos-pulse#readme","repository":{"type":"git","url":"git+https://github.com/pixel-point/siteos-pulse.git","directory":"packages/cli"},"description":"Developer-first CLI for synchronizing, validating, running, and deploying SiteOS Pulse Playwright suites.","maintainers":[{"name":"andrewgolovanov","email":"spacewebdeveloper@gmail.com"}],"readme":"# SiteOS Pulse CLI\n\nSiteOS Pulse CLI synchronizes, validates, and runs Playwright smoke suites locally, then creates an\nimmutable bundle for the SiteOS Pulse monitoring service.\n\nLast reviewed: 2026-07-27.\n\n## Requirements\n\n- Node.js 20.12 or newer.\n- A JavaScript or TypeScript project using npm, pnpm, Yarn, or Bun.\n- Chromium installed through Playwright before the mandatory local monitoring run.\n\nDuring guided first-run setup, the CLI can install `@playwright/test` as a development dependency\nafter showing the exact package-manager command and receiving confirmation. It does not install\nChromium or any other project dependency automatically.\n\n## Install\n\nRun without a permanent installation:\n\n```sh\nnpx @andrewgolovanov/pulse --help\n```\n\nOr install the `pulse` command globally:\n\n```sh\nnpm install --global @andrewgolovanov/pulse\npulse --help\n```\n\n## Quick start\n\nFrom the root of an existing project:\n\n```sh\nNPM_PULSE=\"npx @andrewgolovanov/pulse\"\n$NPM_PULSE login\nnpm install --save-dev @playwright/test\nnpx playwright install chromium\n$NPM_PULSE init --project storefront --base-url https://storefront.example.com\n$NPM_PULSE sync\n$NPM_PULSE validate\nPLAYWRIGHT_BASE_URL=http://localhost:3000 $NPM_PULSE test\n$NPM_PULSE deploy --dry-run\n```\n\nAlternatively, run `pulse` without a command for guided onboarding. If Playwright is missing,\nSiteOS Pulse detects the package manager and offers to install only\n`@playwright/test` before creating configuration files. If Chromium is missing during the local\ntest, the CLI prints the matching install command; it never downloads the browser without the\nuser running that command.\n\n`pulse init` creates:\n\n- `siteos.config.json`;\n- `siteos.playwright.config.ts` as an isolated production-monitoring configuration;\n- `tests/siteos/homepage.spec.ts` as a replaceable starter check;\n- a `.siteos/pulse/` entry in `.gitignore`.\n\nExisting SiteOS Pulse configuration and the project's own Playwright configuration are not\noverwritten. Pulse always points `siteos.config.json` at `siteos.playwright.config.ts`, so project\nsettings such as `webServer`, local-only URLs, custom reporters, or a multi-browser matrix cannot\nleak into the isolated production runner.\n\n## Commands\n\n### `pulse init`\n\nCreate the minimal SiteOS Pulse project files. This explicit command does not install dependencies.\n\n```sh\npulse init --project storefront --suite smoke --tests-dir tests/siteos --base-url https://storefront.example.com\n```\n\n### `pulse login`\n\nAuthorize the CLI in your browser and choose the organization that should issue the deploy-only\ntoken. Choosing it for the CLI does not change the active organization in the browser. Sessions for\nmultiple organizations can coexist for each API origin and are stored in\n`~/.config/siteos/pulse/credentials.json` with user-only permissions.\n\n```sh\npulse login\npulse login --api-url https://siteos-pulse.xui.se\n```\n\nExisting version 1 credentials are migrated atomically to the multi-organization format when first\nread. An older CLI cannot read the new format, so rolling back may require signing in again.\n\n### `pulse organizations`, `pulse use`, and `pulse status`\n\nList the organizations authorized for the current API origin, then bind the current project to one\nof them:\n\n```sh\npulse organizations\npulse use acme\npulse status\n```\n\n`pulse organizations` marks the current project's binding with `*`. `pulse status` shows the API\norigin, project binding, organization, session state, and expiry without printing the token. The\nbinding is keyed by the project's resolved filesystem path and stored outside Git in\n`~/.config/siteos/pulse/project-bindings.json`. After a successful deployment, the private binding\nalso records the confirmed remote project ID and slug. The tracked slug in `siteos.config.json`\nremains the portable identity used by teammates and CI.\n\nExisting organization-only project bindings are read automatically and upgraded to version 2 on\nthe next binding write. The file and its parent directory retain user-only permissions. Changing\nthe bound organization clears project fields so a remote project ID cannot cross tenant context.\n\nRemove one organization session or all sessions for the API origin:\n\n```sh\npulse logout --organization acme\npulse logout --all\npulse logout --all --yes\n```\n\nRemoving a session also removes local project bindings that point to that organization.\n\n### `pulse validate`\n\nValidate configuration, test discovery, dependency declaration, bundle size, and secret exclusions.\n\n```sh\npulse validate\npulse validate --json\n```\n\n### `pulse sync`\n\nCompare the Playwright specs currently found under `testsDir` with the Checks in\n`siteos.config.json`:\n\n```sh\npulse sync\npulse sync --check\npulse sync --json\n```\n\nInteractive synchronization reports four groups before changing anything:\n\n- **Added** specs can be selected explicitly; each selected spec becomes one active manual Check.\n- **Removed** exact selectors are removed automatically; a Check is removed when no selector\n  remains.\n- **Unchanged** exact selectors stay as they are.\n- **Pattern-managed** Checks are reported with their current matches but are not rewritten.\n\nA renamed spec therefore appears as one removal and one addition. Required local helper and fixture\nimports are merged into `bundle.include`; existing entries are not pruned automatically. The CLI\nshows the final change set and writes `siteos.config.json` only after confirmation. It also refuses\nto apply a stale plan if the configuration changed during review.\n\n`--check` and `--json` are read-only and exit with status 1 when drift or a blocker exists. Plain\n`pulse sync` requires an interactive terminal.\n\n### `pulse test`\n\nRun the project's own `@playwright/test` installation. Arguments after `--` are passed to Playwright.\nPulse passes `--config siteos.playwright.config.ts` explicitly.\n\n```sh\npulse test --base-url http://localhost:3000\npulse test --headed --project chromium -- --workers=1\n```\n\n### `pulse deploy`\n\nValidate the project and build an immutable `.tgz` bundle with a SHA-256 checksum:\n\n```sh\npulse deploy --dry-run\npulse deploy --dry-run --output .siteos/pulse/release.tgz --json\n```\n\nRemote upload uses the versioned SiteOS Pulse API and the scoped session created by `pulse login`:\n\n```sh\npulse deploy\npulse deploy --organization acme\npulse deploy --create-project\n```\n\nBefore building or uploading the bundle, the CLI validates the token and asks the Pulse API to\nresolve the project inside the selected organization. Resolution uses a confirmed local project\nID first, then an exact slug. A normalized matching base URL with a different slug is treated as a\npossible duplicate, not as permission to create another dashboard project.\n\nFor a possible duplicate, an interactive deployment requires one explicit choice:\n\n- update an existing project;\n- create a separate project;\n- cancel without changing the config, binding, bundle, or remote service.\n\nUpdating an existing project previews and confirms the tracked slug change, writes it atomically to\n`siteos.config.json`, rebuilds from the final config, and stores the opaque project ID locally only\nafter a successful upload. Deliberate same-URL creation requires `--create-project`. `--yes` skips\nthe ordinary final deployment confirmation but never implies duplicate creation.\n\nThe final preview shows project, slug, organization, API origin, update/create mode, Check count,\nand file count. If multiple organizations are authorized, select one interactively, pass\n`--organization <slug>`, or persist the choice with `pulse use <slug>`.\n\n`pulse deploy --dry-run` remains fully local: it validates and builds the bundle without signing in\nor contacting the API. JSON output includes the resolved deployment target and does not print human\nprompts.\n\nFor non-interactive CI, `SITEOS_PULSE_API_TOKEN` can override saved local sessions. The server-side\ntoken principal is authoritative for the deployment organization; environment tokens are never\nwritten to credentials or project bindings. A non-interactive deploy must resolve its organization\nwithout a prompt. An unresolved same-URL collision exits with `PROJECT_COLLISION`; normally it is\nresolved once interactively and the corrected slug is committed. Use `--create-project` in CI only\nwhen a distinct same-URL project is intentional.\n\nCLI `0.3.0` requires the project-resolution API. An older server produces\n`PULSE_API_VERSION_UNSUPPORTED` before upload; the CLI does not fall back to the former unsafe\ncreate behavior.\n\nThe CLI has no direct access to PostgreSQL, artifact storage, the scheduler, or the runner.\n\n## Configuration\n\n`siteos.config.json` is data-only JSON and is never executed as JavaScript:\n\n```json\n{\n  \"version\": 2,\n  \"project\": {\n    \"slug\": \"storefront\",\n    \"name\": \"Storefront\",\n    \"baseUrl\": \"https://storefront.example.com\",\n    \"monitoringEnabled\": true\n  },\n  \"testsDir\": \"tests/siteos\",\n  \"playwrightConfig\": \"siteos.playwright.config.ts\",\n  \"checks\": [\n    {\n      \"slug\": \"smoke\",\n      \"name\": \"Smoke\",\n      \"include\": [\"tests/siteos/**/*.spec.ts\"],\n      \"active\": true,\n      \"schedule\": { \"mode\": \"scheduled\", \"cadenceSeconds\": 300 }\n    }\n  ],\n  \"apiUrl\": \"https://siteos-pulse.xui.se\"\n}\n```\n\nUse `bundle.include` for helpers and fixtures that are required at runtime but are not Playwright\ntest selectors. Paths must stay inside the project root.\n\n## Bundle safety\n\nDeployment bundles are limited to 5,000 files, 50 MiB total, and 10 MiB per file. The CLI rejects sensitive or control-plane paths including:\n\n- `.env` and `.env.*`;\n- `.npmrc`;\n- filenames containing `secret` or `credential`;\n- `.git`, `.siteos`, `.checks`, and `node_modules`.\n\n`SITEOS_PULSE_API_TOKEN` is read from the process environment only when provided and must never\nbe placed in `siteos.config.json` or committed to the project.\n","readmeFilename":"README.md"}