diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 909a6f74e..d3d45a01b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -59,6 +59,12 @@ jobs: env: RELEASE_TAG: ${{ startsWith(github.ref, 'refs/tags/') && github.ref_name || '' }} + - name: Verify installed collectors and development-only bundles + run: | + npx nx build growth --skip-nx-cache + npx nx run telemetry:test-install-pack --skip-nx-cache + npx nx run telemetry:test-development-bundle --skip-nx-cache + # Trusted publishing is configured per-package on npm; no NPM_TOKEN needed. # The OIDC token from id-token: write authenticates this workflow as a # trusted publisher for each @threadplane/* package. Provenance attestations are diff --git a/.gitignore b/.gitignore index 7981f2dee..bbb32f774 100644 --- a/.gitignore +++ b/.gitignore @@ -81,6 +81,11 @@ keys/ # Aborted fixture-record runs strand raw recordings under a committed path **/e2e/fixtures/.staging/ +# Shared install collector staged before each library is packaged. +libs/*/.install-collector/* +!libs/*/.install-collector/development-install.mjs +!libs/*/.install-collector/development-install.d.ts + # Growth research generated deployment artifacts apps/growth-research/.dawn/ apps/growth-research/.deployment/ diff --git a/apps/website/content/AGENTS.md.template b/apps/website/content/AGENTS.md.template index d6912c8e6..cb63070dc 100644 --- a/apps/website/content/AGENTS.md.template +++ b/apps/website/content/AGENTS.md.template @@ -12,6 +12,30 @@ Supported Angular majors: 20, 21, and 22. ## Install npm install @threadplane/chat @threadplane/langgraph @langchain/core @langchain/langgraph-sdk marked +The chat, LangGraph, AG-UI, and render packages include automatic install collection +for local and CI execution: package/environment details, a random installation ID, +configured Git name/full email, and repository provider/owner hints when available. +Set `DO_NOT_TRACK=1` or `TPLANE_TELEMETRY_DISABLED=1` before installation to disable +it. Package-manager script controls are respected. A usable install email can qualify +for a short founder welcome sequence after linked development-browser use, capped +at three emails with unsubscribe and reply stops. CI alone does not trigger it. +The package-local correlation token contains no email; copied/cached packages can +retain it, so it does not verify a person. No registration is required. +See https://threadplane.ai/privacy. + + +Supported runtime/browser collection is automatic only in Angular development mode. +Production builds, SSR, imports, unused construction, and automated browsers +reporting `navigator.webdriver` are inert. It sends closed +progress milestones with package/version and random browser-origin/session IDs, never +conversation content or private URLs. Adapter `telemetry: false` disables it; a custom +sink replaces the automatic destination, including nested chat JSON rendering. Use +`setDevelopmentCollectionEnabled(false)` from `@threadplane/telemetry/browser`, or set +browser localStorage `THREADPLANE_TELEMETRY_DISABLED=1` and reload. Development console +announcements need no click to acknowledge progress. Linked non-CI install and runtime +evidence can qualify the install email for the founder sequence described above. +Standalone render also accepts `provideRender({ telemetry: false })`. + ## Key requirement `injectAgent()` MUST be called within an Angular injection context (component constructor or field initializer). Calling it in ngOnInit or any async context throws "NG0203: inject() must be called from an injection context". diff --git a/apps/website/content/CLAUDE.md.template b/apps/website/content/CLAUDE.md.template index d6912c8e6..cb63070dc 100644 --- a/apps/website/content/CLAUDE.md.template +++ b/apps/website/content/CLAUDE.md.template @@ -12,6 +12,30 @@ Supported Angular majors: 20, 21, and 22. ## Install npm install @threadplane/chat @threadplane/langgraph @langchain/core @langchain/langgraph-sdk marked +The chat, LangGraph, AG-UI, and render packages include automatic install collection +for local and CI execution: package/environment details, a random installation ID, +configured Git name/full email, and repository provider/owner hints when available. +Set `DO_NOT_TRACK=1` or `TPLANE_TELEMETRY_DISABLED=1` before installation to disable +it. Package-manager script controls are respected. A usable install email can qualify +for a short founder welcome sequence after linked development-browser use, capped +at three emails with unsubscribe and reply stops. CI alone does not trigger it. +The package-local correlation token contains no email; copied/cached packages can +retain it, so it does not verify a person. No registration is required. +See https://threadplane.ai/privacy. + + +Supported runtime/browser collection is automatic only in Angular development mode. +Production builds, SSR, imports, unused construction, and automated browsers +reporting `navigator.webdriver` are inert. It sends closed +progress milestones with package/version and random browser-origin/session IDs, never +conversation content or private URLs. Adapter `telemetry: false` disables it; a custom +sink replaces the automatic destination, including nested chat JSON rendering. Use +`setDevelopmentCollectionEnabled(false)` from `@threadplane/telemetry/browser`, or set +browser localStorage `THREADPLANE_TELEMETRY_DISABLED=1` and reload. Development console +announcements need no click to acknowledge progress. Linked non-CI install and runtime +evidence can qualify the install email for the founder sequence described above. +Standalone render also accepts `provideRender({ telemetry: false })`. + ## Key requirement `injectAgent()` MUST be called within an Angular injection context (component constructor or field initializer). Calling it in ngOnInit or any async context throws "NG0203: inject() must be called from an injection context". diff --git a/apps/website/content/docs/ag-ui/api/api-docs.json b/apps/website/content/docs/ag-ui/api/api-docs.json index e34c99ddf..79757f7df 100644 --- a/apps/website/content/docs/ag-ui/api/api-docs.json +++ b/apps/website/content/docs/ag-ui/api/api-docs.json @@ -390,7 +390,7 @@ { "name": "telemetry", "type": "false | AgentRuntimeTelemetrySink", - "description": "Optional app-owned sink. Supply one to receive runtime lifecycle events.", + "description": "Omit to enable automatic development-only collection. Set `false` to disable.\nAn app-owned sink replaces the automatic destination and receives the\nexisting runtime lifecycle callbacks.", "optional": true }, { @@ -540,7 +540,7 @@ { "name": "telemetry", "type": "false | AgentRuntimeTelemetrySink", - "description": "Optional app-owned sink. Supply one to receive runtime lifecycle events.", + "description": "Omit to enable automatic development-only collection. Set `false` to disable.\nAn app-owned sink replaces the automatic destination and receives the\nexisting runtime lifecycle callbacks.", "optional": true } ], diff --git a/apps/website/content/docs/langgraph/api/api-docs.json b/apps/website/content/docs/langgraph/api/api-docs.json index 060243860..8b09bb050 100644 --- a/apps/website/content/docs/langgraph/api/api-docs.json +++ b/apps/website/content/docs/langgraph/api/api-docs.json @@ -919,7 +919,7 @@ { "name": "telemetry", "type": "false | AgentRuntimeTelemetrySink", - "description": "Optional app-owned sink. Supply one to receive runtime lifecycle events.", + "description": "Omit to enable automatic development-only collection. Set `false` to disable.\nAn app-owned sink replaces the automatic destination and receives the\nexisting runtime lifecycle callbacks.", "optional": true }, { @@ -1061,7 +1061,7 @@ { "name": "telemetry", "type": "false | AgentRuntimeTelemetrySink", - "description": "Optional app-owned sink. Supply one to receive runtime lifecycle events.", + "description": "Omit to enable automatic development-only collection. Set `false` to disable.\nAn app-owned sink replaces the automatic destination and receives the\nexisting runtime lifecycle callbacks.", "optional": true }, { diff --git a/apps/website/content/docs/render/api/api-docs.json b/apps/website/content/docs/render/api/api-docs.json index b7dfe6057..ae142b4a6 100644 --- a/apps/website/content/docs/render/api/api-docs.json +++ b/apps/website/content/docs/render/api/api-docs.json @@ -171,6 +171,12 @@ "type": "InputSignal", "description": "", "optional": false + }, + { + "name": "telemetry", + "type": "InputSignal", + "description": "Disable automatic development collection for this render tree.", + "optional": false } ], "methods": [ @@ -276,6 +282,12 @@ "type": "StateStore", "description": "Backing state store that `$bindState` paths read from and interactive elements write to.", "optional": true + }, + { + "name": "telemetry", + "type": "boolean", + "description": "Set false to disable automatic development browser collection for this render tree.", + "optional": true } ], "examples": [] diff --git a/apps/website/public/AGENTS.md b/apps/website/public/AGENTS.md index f35ac8aaa..63bdc0450 100644 --- a/apps/website/public/AGENTS.md +++ b/apps/website/public/AGENTS.md @@ -12,6 +12,30 @@ Supported Angular majors: 20, 21, and 22. ## Install npm install @threadplane/chat @threadplane/langgraph @langchain/core @langchain/langgraph-sdk marked +The chat, LangGraph, AG-UI, and render packages include automatic install collection +for local and CI execution: package/environment details, a random installation ID, +configured Git name/full email, and repository provider/owner hints when available. +Set `DO_NOT_TRACK=1` or `TPLANE_TELEMETRY_DISABLED=1` before installation to disable +it. Package-manager script controls are respected. A usable install email can qualify +for a short founder welcome sequence after linked development-browser use, capped +at three emails with unsubscribe and reply stops. CI alone does not trigger it. +The package-local correlation token contains no email; copied/cached packages can +retain it, so it does not verify a person. No registration is required. +See https://threadplane.ai/privacy. + + +Supported runtime/browser collection is automatic only in Angular development mode. +Production builds, SSR, imports, unused construction, and automated browsers +reporting `navigator.webdriver` are inert. It sends closed +progress milestones with package/version and random browser-origin/session IDs, never +conversation content or private URLs. Adapter `telemetry: false` disables it; a custom +sink replaces the automatic destination, including nested chat JSON rendering. Use +`setDevelopmentCollectionEnabled(false)` from `@threadplane/telemetry/browser`, or set +browser localStorage `THREADPLANE_TELEMETRY_DISABLED=1` and reload. Development console +announcements need no click to acknowledge progress. Linked non-CI install and runtime +evidence can qualify the install email for the founder sequence described above. +Standalone render also accepts `provideRender({ telemetry: false })`. + ## Key requirement `injectAgent()` MUST be called within an Angular injection context (component constructor or field initializer). Calling it in ngOnInit or any async context throws "NG0203: inject() must be called from an injection context". diff --git a/apps/website/public/CLAUDE.md b/apps/website/public/CLAUDE.md index f35ac8aaa..63bdc0450 100644 --- a/apps/website/public/CLAUDE.md +++ b/apps/website/public/CLAUDE.md @@ -12,6 +12,30 @@ Supported Angular majors: 20, 21, and 22. ## Install npm install @threadplane/chat @threadplane/langgraph @langchain/core @langchain/langgraph-sdk marked +The chat, LangGraph, AG-UI, and render packages include automatic install collection +for local and CI execution: package/environment details, a random installation ID, +configured Git name/full email, and repository provider/owner hints when available. +Set `DO_NOT_TRACK=1` or `TPLANE_TELEMETRY_DISABLED=1` before installation to disable +it. Package-manager script controls are respected. A usable install email can qualify +for a short founder welcome sequence after linked development-browser use, capped +at three emails with unsubscribe and reply stops. CI alone does not trigger it. +The package-local correlation token contains no email; copied/cached packages can +retain it, so it does not verify a person. No registration is required. +See https://threadplane.ai/privacy. + + +Supported runtime/browser collection is automatic only in Angular development mode. +Production builds, SSR, imports, unused construction, and automated browsers +reporting `navigator.webdriver` are inert. It sends closed +progress milestones with package/version and random browser-origin/session IDs, never +conversation content or private URLs. Adapter `telemetry: false` disables it; a custom +sink replaces the automatic destination, including nested chat JSON rendering. Use +`setDevelopmentCollectionEnabled(false)` from `@threadplane/telemetry/browser`, or set +browser localStorage `THREADPLANE_TELEMETRY_DISABLED=1` and reload. Development console +announcements need no click to acknowledge progress. Linked non-CI install and runtime +evidence can qualify the install email for the founder sequence described above. +Standalone render also accepts `provideRender({ telemetry: false })`. + ## Key requirement `injectAgent()` MUST be called within an Angular injection context (component constructor or field initializer). Calling it in ngOnInit or any async context throws "NG0203: inject() must be called from an injection context". diff --git a/apps/website/src/app/layout.tsx b/apps/website/src/app/layout.tsx index fb1422523..d2d5addc7 100644 --- a/apps/website/src/app/layout.tsx +++ b/apps/website/src/app/layout.tsx @@ -17,6 +17,8 @@ import { SITE_ORIGIN, } from '../lib/site-metadata'; import { getFormPolicy } from '../lib/growth/form-policy'; +import { WebsiteSignals } from '../components/shared/WebsiteSignals'; +import { websiteContentCatalog } from '../lib/growth/website-content'; const garamond = EB_Garamond({ subsets: ['latin'], @@ -78,6 +80,7 @@ export default function RootLayout({ reason — do not mount its component builders individually. */} +