@contractspec/example.personalization 3.7.6 → 3.7.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +36 -30
- package/AGENTS.md +43 -19
- package/CHANGELOG.md +28 -0
- package/README.md +67 -16
- package/dist/behavior-tracking.js +3 -3
- package/dist/browser/behavior-tracking.js +3 -3
- package/dist/browser/index.js +154 -30
- package/dist/browser/overlay-customization.js +3 -3
- package/dist/browser/personalization.experiment.js +62 -0
- package/dist/browser/personalization.theme.js +64 -0
- package/dist/browser/workflow-extension.js +1 -1
- package/dist/contracts.test.d.ts +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +154 -30
- package/dist/node/behavior-tracking.js +3 -3
- package/dist/node/index.js +154 -30
- package/dist/node/overlay-customization.js +3 -3
- package/dist/node/personalization.experiment.js +62 -0
- package/dist/node/personalization.theme.js +64 -0
- package/dist/node/workflow-extension.js +1 -1
- package/dist/overlay-customization.js +3 -3
- package/dist/personalization.experiment.d.ts +2 -0
- package/dist/personalization.experiment.js +63 -0
- package/dist/personalization.theme.d.ts +2 -0
- package/dist/personalization.theme.js +65 -0
- package/dist/workflow-extension.js +1 -1
- package/package.json +38 -10
- package/src/behavior-tracking.ts +37 -37
- package/src/contracts.test.ts +20 -0
- package/src/docs/personalization.docblock.ts +21 -21
- package/src/example.ts +26 -26
- package/src/index.ts +4 -2
- package/src/overlay-customization.ts +45 -45
- package/src/personalization.experiment.ts +61 -0
- package/src/personalization.feature.ts +16 -16
- package/src/personalization.theme.ts +63 -0
- package/src/workflow-extension.ts +47 -47
- package/tsconfig.json +17 -15
- package/tsdown.config.js +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -2,40 +2,46 @@ $ contractspec-bun-build prebuild
|
|
|
2
2
|
$ bun run prebuild && bun run build:bundle && bun run build:types
|
|
3
3
|
$ contractspec-bun-build prebuild
|
|
4
4
|
$ contractspec-bun-build transpile
|
|
5
|
-
[contractspec-bun-build] transpile target=bun root=src entries=
|
|
6
|
-
Bundled
|
|
5
|
+
[contractspec-bun-build] transpile target=bun root=src entries=10 noBundle=false
|
|
6
|
+
Bundled 10 modules in 10ms
|
|
7
7
|
|
|
8
|
-
./behavior-tracking.js
|
|
9
|
-
./index.js
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
./
|
|
15
|
-
./
|
|
8
|
+
./behavior-tracking.js 1.33 KB (entry point)
|
|
9
|
+
./index.js 10.57 KB (entry point)
|
|
10
|
+
./personalization.theme.js 1.35 KB (entry point)
|
|
11
|
+
./workflow-extension.js 1.59 KB (entry point)
|
|
12
|
+
docs/index.js 1.48 KB (entry point)
|
|
13
|
+
docs/personalization.docblock.js 1.48 KB (entry point)
|
|
14
|
+
./example.js 0.99 KB (entry point)
|
|
15
|
+
./overlay-customization.js 1.53 KB (entry point)
|
|
16
|
+
./personalization.experiment.js 1.60 KB (entry point)
|
|
17
|
+
./personalization.feature.js 0.71 KB (entry point)
|
|
16
18
|
|
|
17
|
-
[contractspec-bun-build] transpile target=node root=src entries=
|
|
18
|
-
Bundled
|
|
19
|
+
[contractspec-bun-build] transpile target=node root=src entries=10 noBundle=false
|
|
20
|
+
Bundled 10 modules in 4ms
|
|
19
21
|
|
|
20
|
-
./behavior-tracking.js
|
|
21
|
-
./index.js
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
./
|
|
27
|
-
./
|
|
22
|
+
./behavior-tracking.js 1.32 KB (entry point)
|
|
23
|
+
./index.js 10.56 KB (entry point)
|
|
24
|
+
./personalization.theme.js 1.34 KB (entry point)
|
|
25
|
+
./workflow-extension.js 1.58 KB (entry point)
|
|
26
|
+
docs/index.js 1.47 KB (entry point)
|
|
27
|
+
docs/personalization.docblock.js 1.47 KB (entry point)
|
|
28
|
+
./example.js 0.99 KB (entry point)
|
|
29
|
+
./overlay-customization.js 1.52 KB (entry point)
|
|
30
|
+
./personalization.experiment.js 1.60 KB (entry point)
|
|
31
|
+
./personalization.feature.js 0.70 KB (entry point)
|
|
28
32
|
|
|
29
|
-
[contractspec-bun-build] transpile target=browser root=src entries=
|
|
30
|
-
Bundled
|
|
33
|
+
[contractspec-bun-build] transpile target=browser root=src entries=10 noBundle=false
|
|
34
|
+
Bundled 10 modules in 3ms
|
|
31
35
|
|
|
32
|
-
./behavior-tracking.js
|
|
33
|
-
./index.js
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
./
|
|
39
|
-
./
|
|
36
|
+
./behavior-tracking.js 1.32 KB (entry point)
|
|
37
|
+
./index.js 10.56 KB (entry point)
|
|
38
|
+
./personalization.theme.js 1.34 KB (entry point)
|
|
39
|
+
./workflow-extension.js 1.58 KB (entry point)
|
|
40
|
+
docs/index.js 1.47 KB (entry point)
|
|
41
|
+
docs/personalization.docblock.js 1.47 KB (entry point)
|
|
42
|
+
./example.js 0.99 KB (entry point)
|
|
43
|
+
./overlay-customization.js 1.52 KB (entry point)
|
|
44
|
+
./personalization.experiment.js 1.60 KB (entry point)
|
|
45
|
+
./personalization.feature.js 0.70 KB (entry point)
|
|
40
46
|
|
|
41
47
|
$ contractspec-bun-build types
|
package/AGENTS.md
CHANGED
|
@@ -1,32 +1,56 @@
|
|
|
1
|
-
# AI Agent Guide
|
|
1
|
+
# AI Agent Guide — `@contractspec/example.personalization`
|
|
2
2
|
|
|
3
3
|
Scope: `packages/examples/personalization/*`
|
|
4
4
|
|
|
5
|
-
Personalization examples: behavior tracking, overlay customization,
|
|
5
|
+
Personalization examples: behavior tracking, overlay customization, workflow extension.
|
|
6
6
|
|
|
7
7
|
## Quick Context
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
9
|
+
- Layer: `example`.
|
|
10
|
+
- Package visibility: published package.
|
|
11
|
+
- Primary consumers are example explorers, template authors, and documentation readers.
|
|
12
|
+
- Related packages: `@contractspec/lib.contracts-spec`, `@contractspec/lib.logger`, `@contractspec/lib.overlay-engine`, `@contractspec/lib.personalization`, `@contractspec/lib.workflow-composer`, `@contractspec/tool.bun`, ...
|
|
11
13
|
|
|
12
|
-
##
|
|
14
|
+
## Architecture
|
|
13
15
|
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
16
|
+
- `src/behavior-tracking.ts` is part of the package's public or composition surface.
|
|
17
|
+
- `src/docs/` contains docblocks and documentation-facing exports.
|
|
18
|
+
- `src/example.ts` is the runnable example entrypoint.
|
|
19
|
+
- `src/index.ts` is the root public barrel and package entrypoint.
|
|
20
|
+
- `src/overlay-customization.ts` is part of the package's public or composition surface.
|
|
21
|
+
- `src/personalization.feature.ts` defines a feature entrypoint.
|
|
22
|
+
- `src/workflow-extension.ts` is part of the package's public or composition surface.
|
|
18
23
|
|
|
19
|
-
## Public
|
|
24
|
+
## Public Surface
|
|
20
25
|
|
|
21
|
-
- `.`
|
|
22
|
-
- `./behavior-tracking`
|
|
23
|
-
- `./
|
|
24
|
-
- `./
|
|
25
|
-
- `./
|
|
26
|
+
- Export `.` resolves through `./src/index.ts`.
|
|
27
|
+
- Export `./behavior-tracking` resolves through `./src/behavior-tracking.ts`.
|
|
28
|
+
- Export `./docs` resolves through `./src/docs/index.ts`.
|
|
29
|
+
- Export `./docs/personalization.docblock` resolves through `./src/docs/personalization.docblock.ts`.
|
|
30
|
+
- Export `./example` resolves through `./src/example.ts`.
|
|
31
|
+
- Export `./overlay-customization` resolves through `./src/overlay-customization.ts`.
|
|
32
|
+
- Export `./personalization.feature` resolves through `./src/personalization.feature.ts`.
|
|
33
|
+
- Export `./workflow-extension` resolves through `./src/workflow-extension.ts`.
|
|
34
|
+
|
|
35
|
+
## Guardrails
|
|
36
|
+
|
|
37
|
+
- Keep the example package demonstrative, buildable, and aligned with the exported feature surface.
|
|
38
|
+
- Do not add hidden production assumptions that are not actually implemented in the example.
|
|
39
|
+
- Changes here can affect downstream packages such as `@contractspec/lib.contracts-spec`, `@contractspec/lib.logger`, `@contractspec/lib.overlay-engine`, `@contractspec/lib.personalization`, `@contractspec/lib.workflow-composer`, `@contractspec/tool.bun`, ....
|
|
40
|
+
- Changes here can affect downstream packages such as `@contractspec/lib.contracts-spec`, `@contractspec/lib.logger`, `@contractspec/lib.overlay-engine`, `@contractspec/lib.personalization`, `@contractspec/lib.workflow-composer`, `@contractspec/tool.bun`, ...
|
|
26
41
|
|
|
27
42
|
## Local Commands
|
|
28
43
|
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
44
|
+
- `bun run dev` — contractspec-bun-build dev
|
|
45
|
+
- `bun run build` — bun run prebuild && bun run build:bundle && bun run build:types
|
|
46
|
+
- `bun run test` — bun test --pass-with-no-tests
|
|
47
|
+
- `bun run lint` — bun lint:fix
|
|
48
|
+
- `bun run lint:check` — biome check .
|
|
49
|
+
- `bun run lint:fix` — biome check --write --unsafe --only=nursery/useSortedClasses . && biome check --write .
|
|
50
|
+
- `bun run typecheck` — tsc --noEmit
|
|
51
|
+
- `bun run publish:pkg` — bun publish --tolerate-republish --ignore-scripts --verbose
|
|
52
|
+
- `bun run publish:pkg:canary` — bun publish:pkg --tag canary
|
|
53
|
+
- `bun run clean` — rimraf dist .turbo
|
|
54
|
+
- `bun run build:bundle` — contractspec-bun-build transpile
|
|
55
|
+
- `bun run build:types` — contractspec-bun-build types
|
|
56
|
+
- `bun run prebuild` — contractspec-bun-build prebuild
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# @contractspec/example.personalization
|
|
2
2
|
|
|
3
|
+
## 3.7.10
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 1a44cb6: feat: improve examples to increase coverage of Contracts type
|
|
8
|
+
- Updated dependencies [1a44cb6]
|
|
9
|
+
- @contractspec/lib.workflow-composer@3.7.10
|
|
10
|
+
- @contractspec/lib.personalization@6.0.10
|
|
11
|
+
- @contractspec/lib.contracts-spec@4.1.2
|
|
12
|
+
- @contractspec/lib.overlay-engine@3.7.10
|
|
13
|
+
- @contractspec/lib.logger@3.7.8
|
|
14
|
+
|
|
15
|
+
## 3.7.9
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- fix: release
|
|
20
|
+
- Updated dependencies
|
|
21
|
+
- @contractspec/lib.workflow-composer@3.7.9
|
|
22
|
+
- @contractspec/lib.personalization@6.0.9
|
|
23
|
+
- @contractspec/lib.contracts-spec@4.1.1
|
|
24
|
+
- @contractspec/lib.overlay-engine@3.7.9
|
|
25
|
+
- @contractspec/lib.logger@3.7.7
|
|
26
|
+
|
|
3
27
|
## 3.7.6
|
|
4
28
|
|
|
5
29
|
### Patch Changes
|
|
@@ -483,6 +507,7 @@
|
|
|
483
507
|
- 7f3203a: fix: make workspace test runs resilient when packages have no tests
|
|
484
508
|
|
|
485
509
|
Updates package test scripts to pass cleanly when no matching test files exist:
|
|
510
|
+
|
|
486
511
|
- Uses `bun test --pass-with-no-tests` in Bun-based packages that currently ship without test files.
|
|
487
512
|
- Uses `jest --passWithNoTests` for the UI kit web package.
|
|
488
513
|
- Adds `.vscode-test.mjs` for `vscode-contractspec` so VS Code extension test runs have an explicit config and stop failing on missing default configuration.
|
|
@@ -901,14 +926,17 @@
|
|
|
901
926
|
feat: Contract layers support (features, examples, app-configs)
|
|
902
927
|
|
|
903
928
|
### New CLI Commands
|
|
929
|
+
|
|
904
930
|
- `contractspec list layers` - List all contract layers with filtering
|
|
905
931
|
|
|
906
932
|
### Enhanced Commands
|
|
933
|
+
|
|
907
934
|
- `contractspec ci` - New `layers` check category validates features/examples/config
|
|
908
935
|
- `contractspec doctor` - New `layers` health checks
|
|
909
936
|
- `contractspec integrity` - Now shows layer statistics
|
|
910
937
|
|
|
911
938
|
### New APIs
|
|
939
|
+
|
|
912
940
|
- `discoverLayers()` - Scan workspace for all layer files
|
|
913
941
|
- `scanExampleSource()` - Parse ExampleSpec from source code
|
|
914
942
|
- `isExampleFile()` - Check if file is an example spec
|
package/README.md
CHANGED
|
@@ -1,27 +1,78 @@
|
|
|
1
1
|
# @contractspec/example.personalization
|
|
2
2
|
|
|
3
|
-
Website: https://contractspec.io
|
|
3
|
+
Website: https://contractspec.io
|
|
4
4
|
|
|
5
|
-
**Personalization
|
|
5
|
+
**Personalization examples: behavior tracking, overlay customization, workflow extension.**
|
|
6
6
|
|
|
7
7
|
## What This Demonstrates
|
|
8
8
|
|
|
9
|
-
- Behavior tracking
|
|
10
|
-
-
|
|
11
|
-
-
|
|
9
|
+
- Behavior tracking integration pattern.
|
|
10
|
+
- Canonical `experiment` export via `PersonalizationExperiment`.
|
|
11
|
+
- Overlay customization via overlay-engine.
|
|
12
|
+
- Canonical `theme` export via `PersonalizationTheme`.
|
|
13
|
+
- Workflow extension via workflow-composer.
|
|
14
|
+
- Multi-lib composition in a single example.
|
|
15
|
+
- `src/docs/` contains docblocks and documentation-facing exports.
|
|
12
16
|
|
|
13
|
-
##
|
|
17
|
+
## Running Locally
|
|
14
18
|
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
- `./example` -- example spec definition
|
|
19
|
+
From `packages/examples/personalization`:
|
|
20
|
+
- `bun run dev`
|
|
21
|
+
- `bun run build`
|
|
22
|
+
- `bun run test`
|
|
23
|
+
- `bun run typecheck`
|
|
21
24
|
|
|
22
25
|
## Usage
|
|
23
26
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
Use `@contractspec/example.personalization` as a reference implementation, or import its exported surfaces into a workspace that composes ContractSpec examples and bundles.
|
|
28
|
+
|
|
29
|
+
## Architecture
|
|
30
|
+
|
|
31
|
+
- `src/behavior-tracking.ts` is part of the package's public or composition surface.
|
|
32
|
+
- `src/docs/` contains docblocks and documentation-facing exports.
|
|
33
|
+
- `src/example.ts` is the runnable example entrypoint.
|
|
34
|
+
- `src/index.ts` is the root public barrel and package entrypoint.
|
|
35
|
+
- `src/overlay-customization.ts` is part of the package's public or composition surface.
|
|
36
|
+
- `src/personalization.experiment.ts` defines the exported experiment spec.
|
|
37
|
+
- `src/personalization.feature.ts` defines a feature entrypoint.
|
|
38
|
+
- `src/personalization.theme.ts` defines the exported theme spec.
|
|
39
|
+
- `src/workflow-extension.ts` is part of the package's public or composition surface.
|
|
40
|
+
|
|
41
|
+
## Public Entry Points
|
|
42
|
+
|
|
43
|
+
- Export `.` resolves through `./src/index.ts`.
|
|
44
|
+
- Export `./behavior-tracking` resolves through `./src/behavior-tracking.ts`.
|
|
45
|
+
- Export `./docs` resolves through `./src/docs/index.ts`.
|
|
46
|
+
- Export `./docs/personalization.docblock` resolves through `./src/docs/personalization.docblock.ts`.
|
|
47
|
+
- Export `./example` resolves through `./src/example.ts`.
|
|
48
|
+
- Export `./overlay-customization` resolves through `./src/overlay-customization.ts`.
|
|
49
|
+
- Export `./personalization.experiment` resolves through `./src/personalization.experiment.ts`.
|
|
50
|
+
- Export `./personalization.feature` resolves through `./src/personalization.feature.ts`.
|
|
51
|
+
- Export `./personalization.theme` resolves through `./src/personalization.theme.ts`.
|
|
52
|
+
- Export `./workflow-extension` resolves through `./src/workflow-extension.ts`.
|
|
53
|
+
- The package publishes 9 total export subpaths; keep docs aligned with `package.json`.
|
|
54
|
+
|
|
55
|
+
## Local Commands
|
|
56
|
+
|
|
57
|
+
- `bun run dev` — contractspec-bun-build dev
|
|
58
|
+
- `bun run build` — bun run prebuild && bun run build:bundle && bun run build:types
|
|
59
|
+
- `bun run test` — bun test --pass-with-no-tests
|
|
60
|
+
- `bun run lint` — bun lint:fix
|
|
61
|
+
- `bun run lint:check` — biome check .
|
|
62
|
+
- `bun run lint:fix` — biome check --write --unsafe --only=nursery/useSortedClasses . && biome check --write .
|
|
63
|
+
- `bun run typecheck` — tsc --noEmit
|
|
64
|
+
- `bun run publish:pkg` — bun publish --tolerate-republish --ignore-scripts --verbose
|
|
65
|
+
- `bun run publish:pkg:canary` — bun publish:pkg --tag canary
|
|
66
|
+
- `bun run clean` — rimraf dist .turbo
|
|
67
|
+
- `bun run build:bundle` — contractspec-bun-build transpile
|
|
68
|
+
- `bun run build:types` — contractspec-bun-build types
|
|
69
|
+
- `bun run prebuild` — contractspec-bun-build prebuild
|
|
70
|
+
|
|
71
|
+
## Recent Updates
|
|
72
|
+
|
|
73
|
+
- Replace eslint+prettier by biomejs to optimize speed.
|
|
74
|
+
- Missing contract layers.
|
|
75
|
+
|
|
76
|
+
## Notes
|
|
77
|
+
|
|
78
|
+
- Works alongside `@contractspec/lib.contracts-spec`, `@contractspec/lib.logger`, `@contractspec/lib.overlay-engine`, `@contractspec/lib.personalization`, `@contractspec/lib.workflow-composer`, ...
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// src/behavior-tracking.ts
|
|
3
|
-
import { createBehaviorTracker } from "@contractspec/lib.personalization/tracker";
|
|
4
|
-
import { InMemoryBehaviorStore } from "@contractspec/lib.personalization/store";
|
|
5
|
-
import { BehaviorAnalyzer } from "@contractspec/lib.personalization/analyzer";
|
|
6
3
|
import { Logger, LogLevel } from "@contractspec/lib.logger";
|
|
4
|
+
import { BehaviorAnalyzer } from "@contractspec/lib.personalization/analyzer";
|
|
5
|
+
import { InMemoryBehaviorStore } from "@contractspec/lib.personalization/store";
|
|
6
|
+
import { createBehaviorTracker } from "@contractspec/lib.personalization/tracker";
|
|
7
7
|
var logger = new Logger({
|
|
8
8
|
level: LogLevel.INFO,
|
|
9
9
|
environment: "production",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// src/behavior-tracking.ts
|
|
2
|
-
import { createBehaviorTracker } from "@contractspec/lib.personalization/tracker";
|
|
3
|
-
import { InMemoryBehaviorStore } from "@contractspec/lib.personalization/store";
|
|
4
|
-
import { BehaviorAnalyzer } from "@contractspec/lib.personalization/analyzer";
|
|
5
2
|
import { Logger, LogLevel } from "@contractspec/lib.logger";
|
|
3
|
+
import { BehaviorAnalyzer } from "@contractspec/lib.personalization/analyzer";
|
|
4
|
+
import { InMemoryBehaviorStore } from "@contractspec/lib.personalization/store";
|
|
5
|
+
import { createBehaviorTracker } from "@contractspec/lib.personalization/tracker";
|
|
6
6
|
var logger = new Logger({
|
|
7
7
|
level: LogLevel.INFO,
|
|
8
8
|
environment: "production",
|
package/dist/browser/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// src/behavior-tracking.ts
|
|
2
|
-
import { createBehaviorTracker } from "@contractspec/lib.personalization/tracker";
|
|
3
|
-
import { InMemoryBehaviorStore } from "@contractspec/lib.personalization/store";
|
|
4
|
-
import { BehaviorAnalyzer } from "@contractspec/lib.personalization/analyzer";
|
|
5
2
|
import { Logger, LogLevel } from "@contractspec/lib.logger";
|
|
3
|
+
import { BehaviorAnalyzer } from "@contractspec/lib.personalization/analyzer";
|
|
4
|
+
import { InMemoryBehaviorStore } from "@contractspec/lib.personalization/store";
|
|
5
|
+
import { createBehaviorTracker } from "@contractspec/lib.personalization/tracker";
|
|
6
6
|
var logger = new Logger({
|
|
7
7
|
level: LogLevel.INFO,
|
|
8
8
|
environment: "production",
|
|
@@ -112,13 +112,13 @@ var example = defineExample({
|
|
|
112
112
|
var example_default = example;
|
|
113
113
|
|
|
114
114
|
// src/overlay-customization.ts
|
|
115
|
-
import {
|
|
116
|
-
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
115
|
+
import { Logger as Logger2, LogLevel as LogLevel2 } from "@contractspec/lib.logger";
|
|
117
116
|
import {
|
|
118
117
|
OverlayEngine,
|
|
119
118
|
OverlayRegistry
|
|
120
119
|
} from "@contractspec/lib.overlay-engine";
|
|
121
|
-
import {
|
|
120
|
+
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
121
|
+
import { defineOverlay } from "@contractspec/lib.overlay-engine/spec";
|
|
122
122
|
var logger2 = new Logger2({
|
|
123
123
|
level: LogLevel2.INFO,
|
|
124
124
|
environment: "production",
|
|
@@ -162,10 +162,152 @@ async function runOverlayCustomizationExample() {
|
|
|
162
162
|
logger2.info("Overlay applied", { fields: result.target.fields });
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
+
// src/personalization.experiment.ts
|
|
166
|
+
import {
|
|
167
|
+
OwnersEnum,
|
|
168
|
+
StabilityEnum
|
|
169
|
+
} from "@contractspec/lib.contracts-spec/ownership";
|
|
170
|
+
var PersonalizationExperiment = {
|
|
171
|
+
meta: {
|
|
172
|
+
key: "personalization.experiment.overlay-copy",
|
|
173
|
+
version: "1.0.0",
|
|
174
|
+
title: "Personalization Overlay Copy Experiment",
|
|
175
|
+
description: "Tests a control onboarding copy against a personalized overlay variant.",
|
|
176
|
+
domain: "personalization",
|
|
177
|
+
owners: [OwnersEnum.PlatformCore],
|
|
178
|
+
tags: ["personalization", "experiment", "overlay"],
|
|
179
|
+
stability: StabilityEnum.Experimental
|
|
180
|
+
},
|
|
181
|
+
controlVariant: "control",
|
|
182
|
+
variants: [
|
|
183
|
+
{
|
|
184
|
+
id: "control",
|
|
185
|
+
key: "control",
|
|
186
|
+
description: "Default onboarding copy and standard workflow."
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
id: "personalized-overlay",
|
|
190
|
+
key: "personalized-overlay",
|
|
191
|
+
description: "Personalized copy with a branded theme override.",
|
|
192
|
+
overrides: [
|
|
193
|
+
{
|
|
194
|
+
type: "theme",
|
|
195
|
+
target: "personalization.theme.guided-onboarding",
|
|
196
|
+
version: "1.0.0"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
type: "workflow",
|
|
200
|
+
target: "billing.invoiceApproval",
|
|
201
|
+
version: "1.0.0"
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
}
|
|
205
|
+
],
|
|
206
|
+
allocation: {
|
|
207
|
+
type: "sticky",
|
|
208
|
+
attribute: "userId",
|
|
209
|
+
salt: "personalization-overlay-copy"
|
|
210
|
+
},
|
|
211
|
+
successMetrics: [
|
|
212
|
+
{
|
|
213
|
+
key: "checklist-completion-rate",
|
|
214
|
+
telemetryEvent: {
|
|
215
|
+
key: "personalization.assignment.completed",
|
|
216
|
+
version: "1.0.0"
|
|
217
|
+
},
|
|
218
|
+
aggregation: "count",
|
|
219
|
+
target: 1
|
|
220
|
+
}
|
|
221
|
+
],
|
|
222
|
+
tags: ["personalization", "experiment"]
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
// src/personalization.feature.ts
|
|
226
|
+
import { defineFeature } from "@contractspec/lib.contracts-spec";
|
|
227
|
+
var PersonalizationFeature = defineFeature({
|
|
228
|
+
meta: {
|
|
229
|
+
key: "personalization",
|
|
230
|
+
version: "1.0.0",
|
|
231
|
+
title: "Personalization Patterns",
|
|
232
|
+
description: "Behavior tracking, overlay customization, and workflow extension patterns",
|
|
233
|
+
domain: "personalization",
|
|
234
|
+
owners: ["@examples"],
|
|
235
|
+
tags: ["personalization", "behavior", "overlay", "workflow"],
|
|
236
|
+
stability: "experimental"
|
|
237
|
+
},
|
|
238
|
+
telemetry: [{ key: "personalization.telemetry", version: "1.0.0" }],
|
|
239
|
+
docs: [
|
|
240
|
+
"docs.examples.personalization",
|
|
241
|
+
"docs.examples.personalization.usage"
|
|
242
|
+
]
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
// src/personalization.theme.ts
|
|
246
|
+
import {
|
|
247
|
+
OwnersEnum as OwnersEnum2,
|
|
248
|
+
StabilityEnum as StabilityEnum2
|
|
249
|
+
} from "@contractspec/lib.contracts-spec/ownership";
|
|
250
|
+
var PersonalizationTheme = {
|
|
251
|
+
meta: {
|
|
252
|
+
key: "personalization.theme.guided-onboarding",
|
|
253
|
+
version: "1.0.0",
|
|
254
|
+
title: "Guided Onboarding Theme",
|
|
255
|
+
description: "Theme tokens used when the personalized onboarding experience is active.",
|
|
256
|
+
domain: "personalization",
|
|
257
|
+
owners: [OwnersEnum2.PlatformCore],
|
|
258
|
+
tags: ["personalization", "theme", "onboarding"],
|
|
259
|
+
stability: StabilityEnum2.Experimental,
|
|
260
|
+
scopes: ["tenant", "user"]
|
|
261
|
+
},
|
|
262
|
+
tokens: {
|
|
263
|
+
colors: {
|
|
264
|
+
surface: { value: "#FCF6E8" },
|
|
265
|
+
accent: { value: "#C8742A" },
|
|
266
|
+
text: { value: "#2F2419" }
|
|
267
|
+
},
|
|
268
|
+
radii: {
|
|
269
|
+
card: { value: 18 }
|
|
270
|
+
},
|
|
271
|
+
space: {
|
|
272
|
+
panel: { value: 24 }
|
|
273
|
+
},
|
|
274
|
+
typography: {
|
|
275
|
+
body: { value: 16 },
|
|
276
|
+
title: { value: 28 }
|
|
277
|
+
},
|
|
278
|
+
motion: {
|
|
279
|
+
stagger: { value: "180ms" }
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
components: [
|
|
283
|
+
{
|
|
284
|
+
component: "OnboardingChecklist",
|
|
285
|
+
variants: {
|
|
286
|
+
guided: {
|
|
287
|
+
props: {
|
|
288
|
+
emphasis: "warm"
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
],
|
|
294
|
+
overrides: [
|
|
295
|
+
{
|
|
296
|
+
scope: "tenant",
|
|
297
|
+
target: "tenant:acme",
|
|
298
|
+
tokens: {
|
|
299
|
+
colors: {
|
|
300
|
+
accent: { value: "#8A4B12" }
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
]
|
|
305
|
+
};
|
|
306
|
+
|
|
165
307
|
// src/workflow-extension.ts
|
|
166
|
-
import { StabilityEnum } from "@contractspec/lib.contracts-spec";
|
|
167
|
-
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
308
|
+
import { StabilityEnum as StabilityEnum3 } from "@contractspec/lib.contracts-spec";
|
|
168
309
|
import { Logger as Logger3, LogLevel as LogLevel3 } from "@contractspec/lib.logger";
|
|
310
|
+
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
169
311
|
var logger3 = new Logger3({
|
|
170
312
|
level: LogLevel3.INFO,
|
|
171
313
|
environment: "production",
|
|
@@ -180,7 +322,7 @@ var BaseWorkflow = {
|
|
|
180
322
|
tags: [],
|
|
181
323
|
description: "",
|
|
182
324
|
domain: "billing",
|
|
183
|
-
stability:
|
|
325
|
+
stability: StabilityEnum3.Stable
|
|
184
326
|
},
|
|
185
327
|
definition: {
|
|
186
328
|
steps: [
|
|
@@ -218,31 +360,13 @@ function logTenantWorkflowSteps(workflow) {
|
|
|
218
360
|
steps: workflow.definition.steps.map((step) => step.id)
|
|
219
361
|
});
|
|
220
362
|
}
|
|
221
|
-
|
|
222
|
-
// src/personalization.feature.ts
|
|
223
|
-
import { defineFeature } from "@contractspec/lib.contracts-spec";
|
|
224
|
-
var PersonalizationFeature = defineFeature({
|
|
225
|
-
meta: {
|
|
226
|
-
key: "personalization",
|
|
227
|
-
version: "1.0.0",
|
|
228
|
-
title: "Personalization Patterns",
|
|
229
|
-
description: "Behavior tracking, overlay customization, and workflow extension patterns",
|
|
230
|
-
domain: "personalization",
|
|
231
|
-
owners: ["@examples"],
|
|
232
|
-
tags: ["personalization", "behavior", "overlay", "workflow"],
|
|
233
|
-
stability: "experimental"
|
|
234
|
-
},
|
|
235
|
-
telemetry: [{ key: "personalization.telemetry", version: "1.0.0" }],
|
|
236
|
-
docs: [
|
|
237
|
-
"docs.examples.personalization",
|
|
238
|
-
"docs.examples.personalization.usage"
|
|
239
|
-
]
|
|
240
|
-
});
|
|
241
363
|
export {
|
|
242
364
|
runOverlayCustomizationExample,
|
|
243
365
|
runBehaviorTrackingExample,
|
|
244
366
|
logTenantWorkflowSteps,
|
|
245
367
|
example_default as example,
|
|
246
368
|
composeTenantWorkflowExample,
|
|
247
|
-
|
|
369
|
+
PersonalizationTheme,
|
|
370
|
+
PersonalizationFeature,
|
|
371
|
+
PersonalizationExperiment
|
|
248
372
|
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// src/overlay-customization.ts
|
|
2
|
-
import {
|
|
3
|
-
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
2
|
+
import { Logger, LogLevel } from "@contractspec/lib.logger";
|
|
4
3
|
import {
|
|
5
4
|
OverlayEngine,
|
|
6
5
|
OverlayRegistry
|
|
7
6
|
} from "@contractspec/lib.overlay-engine";
|
|
8
|
-
import {
|
|
7
|
+
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
8
|
+
import { defineOverlay } from "@contractspec/lib.overlay-engine/spec";
|
|
9
9
|
var logger = new Logger({
|
|
10
10
|
level: LogLevel.INFO,
|
|
11
11
|
environment: "production",
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// src/personalization.experiment.ts
|
|
2
|
+
import {
|
|
3
|
+
OwnersEnum,
|
|
4
|
+
StabilityEnum
|
|
5
|
+
} from "@contractspec/lib.contracts-spec/ownership";
|
|
6
|
+
var PersonalizationExperiment = {
|
|
7
|
+
meta: {
|
|
8
|
+
key: "personalization.experiment.overlay-copy",
|
|
9
|
+
version: "1.0.0",
|
|
10
|
+
title: "Personalization Overlay Copy Experiment",
|
|
11
|
+
description: "Tests a control onboarding copy against a personalized overlay variant.",
|
|
12
|
+
domain: "personalization",
|
|
13
|
+
owners: [OwnersEnum.PlatformCore],
|
|
14
|
+
tags: ["personalization", "experiment", "overlay"],
|
|
15
|
+
stability: StabilityEnum.Experimental
|
|
16
|
+
},
|
|
17
|
+
controlVariant: "control",
|
|
18
|
+
variants: [
|
|
19
|
+
{
|
|
20
|
+
id: "control",
|
|
21
|
+
key: "control",
|
|
22
|
+
description: "Default onboarding copy and standard workflow."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: "personalized-overlay",
|
|
26
|
+
key: "personalized-overlay",
|
|
27
|
+
description: "Personalized copy with a branded theme override.",
|
|
28
|
+
overrides: [
|
|
29
|
+
{
|
|
30
|
+
type: "theme",
|
|
31
|
+
target: "personalization.theme.guided-onboarding",
|
|
32
|
+
version: "1.0.0"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
type: "workflow",
|
|
36
|
+
target: "billing.invoiceApproval",
|
|
37
|
+
version: "1.0.0"
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
allocation: {
|
|
43
|
+
type: "sticky",
|
|
44
|
+
attribute: "userId",
|
|
45
|
+
salt: "personalization-overlay-copy"
|
|
46
|
+
},
|
|
47
|
+
successMetrics: [
|
|
48
|
+
{
|
|
49
|
+
key: "checklist-completion-rate",
|
|
50
|
+
telemetryEvent: {
|
|
51
|
+
key: "personalization.assignment.completed",
|
|
52
|
+
version: "1.0.0"
|
|
53
|
+
},
|
|
54
|
+
aggregation: "count",
|
|
55
|
+
target: 1
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
tags: ["personalization", "experiment"]
|
|
59
|
+
};
|
|
60
|
+
export {
|
|
61
|
+
PersonalizationExperiment
|
|
62
|
+
};
|