@contractspec/example.personalization 3.7.6 → 3.7.7
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 +3 -3
- package/AGENTS.md +43 -19
- package/README.md +61 -16
- package/dist/behavior-tracking.js +3 -3
- package/dist/browser/behavior-tracking.js +3 -3
- package/dist/browser/index.js +27 -27
- package/dist/browser/overlay-customization.js +3 -3
- package/dist/browser/workflow-extension.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +27 -27
- package/dist/node/behavior-tracking.js +3 -3
- package/dist/node/index.js +27 -27
- package/dist/node/overlay-customization.js +3 -3
- package/dist/node/workflow-extension.js +1 -1
- package/dist/overlay-customization.js +3 -3
- package/dist/workflow-extension.js +1 -1
- package/package.json +7 -7
- package/src/behavior-tracking.ts +37 -37
- package/src/docs/personalization.docblock.ts +21 -21
- package/src/example.ts +26 -26
- package/src/index.ts +2 -2
- package/src/overlay-customization.ts +45 -45
- package/src/personalization.feature.ts +16 -16
- package/src/workflow-extension.ts +47 -47
- package/tsconfig.json +17 -15
- package/tsdown.config.js +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -3,7 +3,7 @@ $ bun run prebuild && bun run build:bundle && bun run build:types
|
|
|
3
3
|
$ contractspec-bun-build prebuild
|
|
4
4
|
$ contractspec-bun-build transpile
|
|
5
5
|
[contractspec-bun-build] transpile target=bun root=src entries=8 noBundle=false
|
|
6
|
-
Bundled 8 modules in
|
|
6
|
+
Bundled 8 modules in 5ms
|
|
7
7
|
|
|
8
8
|
./behavior-tracking.js 1.33 KB (entry point)
|
|
9
9
|
./index.js 7.60 KB (entry point)
|
|
@@ -15,7 +15,7 @@ Bundled 8 modules in 17ms
|
|
|
15
15
|
./workflow-extension.js 1.59 KB (entry point)
|
|
16
16
|
|
|
17
17
|
[contractspec-bun-build] transpile target=node root=src entries=8 noBundle=false
|
|
18
|
-
Bundled 8 modules in
|
|
18
|
+
Bundled 8 modules in 5ms
|
|
19
19
|
|
|
20
20
|
./behavior-tracking.js 1.32 KB (entry point)
|
|
21
21
|
./index.js 7.59 KB (entry point)
|
|
@@ -27,7 +27,7 @@ Bundled 8 modules in 7ms
|
|
|
27
27
|
./workflow-extension.js 1.58 KB (entry point)
|
|
28
28
|
|
|
29
29
|
[contractspec-bun-build] transpile target=browser root=src entries=8 noBundle=false
|
|
30
|
-
Bundled 8 modules in
|
|
30
|
+
Bundled 8 modules in 17ms
|
|
31
31
|
|
|
32
32
|
./behavior-tracking.js 1.32 KB (entry point)
|
|
33
33
|
./index.js 7.59 KB (entry point)
|
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/README.md
CHANGED
|
@@ -1,27 +1,72 @@
|
|
|
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
|
-
- Overlay customization
|
|
11
|
-
- Workflow extension
|
|
9
|
+
- Behavior tracking integration pattern.
|
|
10
|
+
- Overlay customization via overlay-engine.
|
|
11
|
+
- Workflow extension via workflow-composer.
|
|
12
|
+
- Multi-lib composition in a single example.
|
|
13
|
+
- `src/docs/` contains docblocks and documentation-facing exports.
|
|
14
|
+
- `src/docs/` contains docblocks and documentation-facing exports.
|
|
12
15
|
|
|
13
|
-
##
|
|
16
|
+
## Running Locally
|
|
14
17
|
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
- `./example` -- example spec definition
|
|
18
|
+
From `packages/examples/personalization`:
|
|
19
|
+
- `bun run dev`
|
|
20
|
+
- `bun run build`
|
|
21
|
+
- `bun run test`
|
|
22
|
+
- `bun run typecheck`
|
|
21
23
|
|
|
22
24
|
## Usage
|
|
23
25
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
Use `@contractspec/example.personalization` as a reference implementation, or import its exported surfaces into a workspace that composes ContractSpec examples and bundles.
|
|
27
|
+
|
|
28
|
+
## Architecture
|
|
29
|
+
|
|
30
|
+
- `src/behavior-tracking.ts` is part of the package's public or composition surface.
|
|
31
|
+
- `src/docs/` contains docblocks and documentation-facing exports.
|
|
32
|
+
- `src/example.ts` is the runnable example entrypoint.
|
|
33
|
+
- `src/index.ts` is the root public barrel and package entrypoint.
|
|
34
|
+
- `src/overlay-customization.ts` is part of the package's public or composition surface.
|
|
35
|
+
- `src/personalization.feature.ts` defines a feature entrypoint.
|
|
36
|
+
- `src/workflow-extension.ts` is part of the package's public or composition surface.
|
|
37
|
+
|
|
38
|
+
## Public Entry Points
|
|
39
|
+
|
|
40
|
+
- Export `.` resolves through `./src/index.ts`.
|
|
41
|
+
- Export `./behavior-tracking` resolves through `./src/behavior-tracking.ts`.
|
|
42
|
+
- Export `./docs` resolves through `./src/docs/index.ts`.
|
|
43
|
+
- Export `./docs/personalization.docblock` resolves through `./src/docs/personalization.docblock.ts`.
|
|
44
|
+
- Export `./example` resolves through `./src/example.ts`.
|
|
45
|
+
- Export `./overlay-customization` resolves through `./src/overlay-customization.ts`.
|
|
46
|
+
- Export `./personalization.feature` resolves through `./src/personalization.feature.ts`.
|
|
47
|
+
- Export `./workflow-extension` resolves through `./src/workflow-extension.ts`.
|
|
48
|
+
|
|
49
|
+
## Local Commands
|
|
50
|
+
|
|
51
|
+
- `bun run dev` — contractspec-bun-build dev
|
|
52
|
+
- `bun run build` — bun run prebuild && bun run build:bundle && bun run build:types
|
|
53
|
+
- `bun run test` — bun test --pass-with-no-tests
|
|
54
|
+
- `bun run lint` — bun lint:fix
|
|
55
|
+
- `bun run lint:check` — biome check .
|
|
56
|
+
- `bun run lint:fix` — biome check --write --unsafe --only=nursery/useSortedClasses . && biome check --write .
|
|
57
|
+
- `bun run typecheck` — tsc --noEmit
|
|
58
|
+
- `bun run publish:pkg` — bun publish --tolerate-republish --ignore-scripts --verbose
|
|
59
|
+
- `bun run publish:pkg:canary` — bun publish:pkg --tag canary
|
|
60
|
+
- `bun run clean` — rimraf dist .turbo
|
|
61
|
+
- `bun run build:bundle` — contractspec-bun-build transpile
|
|
62
|
+
- `bun run build:types` — contractspec-bun-build types
|
|
63
|
+
- `bun run prebuild` — contractspec-bun-build prebuild
|
|
64
|
+
|
|
65
|
+
## Recent Updates
|
|
66
|
+
|
|
67
|
+
- Replace eslint+prettier by biomejs to optimize speed.
|
|
68
|
+
- Missing contract layers.
|
|
69
|
+
|
|
70
|
+
## Notes
|
|
71
|
+
|
|
72
|
+
- 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,30 @@ async function runOverlayCustomizationExample() {
|
|
|
162
162
|
logger2.info("Overlay applied", { fields: result.target.fields });
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
+
// src/personalization.feature.ts
|
|
166
|
+
import { defineFeature } from "@contractspec/lib.contracts-spec";
|
|
167
|
+
var PersonalizationFeature = defineFeature({
|
|
168
|
+
meta: {
|
|
169
|
+
key: "personalization",
|
|
170
|
+
version: "1.0.0",
|
|
171
|
+
title: "Personalization Patterns",
|
|
172
|
+
description: "Behavior tracking, overlay customization, and workflow extension patterns",
|
|
173
|
+
domain: "personalization",
|
|
174
|
+
owners: ["@examples"],
|
|
175
|
+
tags: ["personalization", "behavior", "overlay", "workflow"],
|
|
176
|
+
stability: "experimental"
|
|
177
|
+
},
|
|
178
|
+
telemetry: [{ key: "personalization.telemetry", version: "1.0.0" }],
|
|
179
|
+
docs: [
|
|
180
|
+
"docs.examples.personalization",
|
|
181
|
+
"docs.examples.personalization.usage"
|
|
182
|
+
]
|
|
183
|
+
});
|
|
184
|
+
|
|
165
185
|
// src/workflow-extension.ts
|
|
166
186
|
import { StabilityEnum } from "@contractspec/lib.contracts-spec";
|
|
167
|
-
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
168
187
|
import { Logger as Logger3, LogLevel as LogLevel3 } from "@contractspec/lib.logger";
|
|
188
|
+
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
169
189
|
var logger3 = new Logger3({
|
|
170
190
|
level: LogLevel3.INFO,
|
|
171
191
|
environment: "production",
|
|
@@ -218,26 +238,6 @@ function logTenantWorkflowSteps(workflow) {
|
|
|
218
238
|
steps: workflow.definition.steps.map((step) => step.id)
|
|
219
239
|
});
|
|
220
240
|
}
|
|
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
241
|
export {
|
|
242
242
|
runOverlayCustomizationExample,
|
|
243
243
|
runBehaviorTrackingExample,
|
|
@@ -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",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/workflow-extension.ts
|
|
2
2
|
import { StabilityEnum } from "@contractspec/lib.contracts-spec";
|
|
3
|
-
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
4
3
|
import { Logger, LogLevel } from "@contractspec/lib.logger";
|
|
4
|
+
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
5
5
|
var logger = new Logger({
|
|
6
6
|
level: LogLevel.INFO,
|
|
7
7
|
environment: "production",
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from './behavior-tracking';
|
|
2
|
+
export { default as example } from './example';
|
|
2
3
|
export * from './overlay-customization';
|
|
3
|
-
export * from './workflow-extension';
|
|
4
4
|
export * from './personalization.feature';
|
|
5
|
-
export
|
|
5
|
+
export * from './workflow-extension';
|
|
6
6
|
import './docs';
|
package/dist/index.js
CHANGED
|
@@ -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",
|
|
@@ -113,13 +113,13 @@ var example = defineExample({
|
|
|
113
113
|
var example_default = example;
|
|
114
114
|
|
|
115
115
|
// src/overlay-customization.ts
|
|
116
|
-
import {
|
|
117
|
-
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
116
|
+
import { Logger as Logger2, LogLevel as LogLevel2 } from "@contractspec/lib.logger";
|
|
118
117
|
import {
|
|
119
118
|
OverlayEngine,
|
|
120
119
|
OverlayRegistry
|
|
121
120
|
} from "@contractspec/lib.overlay-engine";
|
|
122
|
-
import {
|
|
121
|
+
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
122
|
+
import { defineOverlay } from "@contractspec/lib.overlay-engine/spec";
|
|
123
123
|
var logger2 = new Logger2({
|
|
124
124
|
level: LogLevel2.INFO,
|
|
125
125
|
environment: "production",
|
|
@@ -163,10 +163,30 @@ async function runOverlayCustomizationExample() {
|
|
|
163
163
|
logger2.info("Overlay applied", { fields: result.target.fields });
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
+
// src/personalization.feature.ts
|
|
167
|
+
import { defineFeature } from "@contractspec/lib.contracts-spec";
|
|
168
|
+
var PersonalizationFeature = defineFeature({
|
|
169
|
+
meta: {
|
|
170
|
+
key: "personalization",
|
|
171
|
+
version: "1.0.0",
|
|
172
|
+
title: "Personalization Patterns",
|
|
173
|
+
description: "Behavior tracking, overlay customization, and workflow extension patterns",
|
|
174
|
+
domain: "personalization",
|
|
175
|
+
owners: ["@examples"],
|
|
176
|
+
tags: ["personalization", "behavior", "overlay", "workflow"],
|
|
177
|
+
stability: "experimental"
|
|
178
|
+
},
|
|
179
|
+
telemetry: [{ key: "personalization.telemetry", version: "1.0.0" }],
|
|
180
|
+
docs: [
|
|
181
|
+
"docs.examples.personalization",
|
|
182
|
+
"docs.examples.personalization.usage"
|
|
183
|
+
]
|
|
184
|
+
});
|
|
185
|
+
|
|
166
186
|
// src/workflow-extension.ts
|
|
167
187
|
import { StabilityEnum } from "@contractspec/lib.contracts-spec";
|
|
168
|
-
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
169
188
|
import { Logger as Logger3, LogLevel as LogLevel3 } from "@contractspec/lib.logger";
|
|
189
|
+
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
170
190
|
var logger3 = new Logger3({
|
|
171
191
|
level: LogLevel3.INFO,
|
|
172
192
|
environment: "production",
|
|
@@ -219,26 +239,6 @@ function logTenantWorkflowSteps(workflow) {
|
|
|
219
239
|
steps: workflow.definition.steps.map((step) => step.id)
|
|
220
240
|
});
|
|
221
241
|
}
|
|
222
|
-
|
|
223
|
-
// src/personalization.feature.ts
|
|
224
|
-
import { defineFeature } from "@contractspec/lib.contracts-spec";
|
|
225
|
-
var PersonalizationFeature = defineFeature({
|
|
226
|
-
meta: {
|
|
227
|
-
key: "personalization",
|
|
228
|
-
version: "1.0.0",
|
|
229
|
-
title: "Personalization Patterns",
|
|
230
|
-
description: "Behavior tracking, overlay customization, and workflow extension patterns",
|
|
231
|
-
domain: "personalization",
|
|
232
|
-
owners: ["@examples"],
|
|
233
|
-
tags: ["personalization", "behavior", "overlay", "workflow"],
|
|
234
|
-
stability: "experimental"
|
|
235
|
-
},
|
|
236
|
-
telemetry: [{ key: "personalization.telemetry", version: "1.0.0" }],
|
|
237
|
-
docs: [
|
|
238
|
-
"docs.examples.personalization",
|
|
239
|
-
"docs.examples.personalization.usage"
|
|
240
|
-
]
|
|
241
|
-
});
|
|
242
242
|
export {
|
|
243
243
|
runOverlayCustomizationExample,
|
|
244
244
|
runBehaviorTrackingExample,
|
|
@@ -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/node/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,30 @@ async function runOverlayCustomizationExample() {
|
|
|
162
162
|
logger2.info("Overlay applied", { fields: result.target.fields });
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
+
// src/personalization.feature.ts
|
|
166
|
+
import { defineFeature } from "@contractspec/lib.contracts-spec";
|
|
167
|
+
var PersonalizationFeature = defineFeature({
|
|
168
|
+
meta: {
|
|
169
|
+
key: "personalization",
|
|
170
|
+
version: "1.0.0",
|
|
171
|
+
title: "Personalization Patterns",
|
|
172
|
+
description: "Behavior tracking, overlay customization, and workflow extension patterns",
|
|
173
|
+
domain: "personalization",
|
|
174
|
+
owners: ["@examples"],
|
|
175
|
+
tags: ["personalization", "behavior", "overlay", "workflow"],
|
|
176
|
+
stability: "experimental"
|
|
177
|
+
},
|
|
178
|
+
telemetry: [{ key: "personalization.telemetry", version: "1.0.0" }],
|
|
179
|
+
docs: [
|
|
180
|
+
"docs.examples.personalization",
|
|
181
|
+
"docs.examples.personalization.usage"
|
|
182
|
+
]
|
|
183
|
+
});
|
|
184
|
+
|
|
165
185
|
// src/workflow-extension.ts
|
|
166
186
|
import { StabilityEnum } from "@contractspec/lib.contracts-spec";
|
|
167
|
-
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
168
187
|
import { Logger as Logger3, LogLevel as LogLevel3 } from "@contractspec/lib.logger";
|
|
188
|
+
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
169
189
|
var logger3 = new Logger3({
|
|
170
190
|
level: LogLevel3.INFO,
|
|
171
191
|
environment: "production",
|
|
@@ -218,26 +238,6 @@ function logTenantWorkflowSteps(workflow) {
|
|
|
218
238
|
steps: workflow.definition.steps.map((step) => step.id)
|
|
219
239
|
});
|
|
220
240
|
}
|
|
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
241
|
export {
|
|
242
242
|
runOverlayCustomizationExample,
|
|
243
243
|
runBehaviorTrackingExample,
|
|
@@ -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",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/workflow-extension.ts
|
|
2
2
|
import { StabilityEnum } from "@contractspec/lib.contracts-spec";
|
|
3
|
-
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
4
3
|
import { Logger, LogLevel } from "@contractspec/lib.logger";
|
|
4
|
+
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
5
5
|
var logger = new Logger({
|
|
6
6
|
level: LogLevel.INFO,
|
|
7
7
|
environment: "production",
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// src/overlay-customization.ts
|
|
3
|
-
import {
|
|
4
|
-
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
3
|
+
import { Logger, LogLevel } from "@contractspec/lib.logger";
|
|
5
4
|
import {
|
|
6
5
|
OverlayEngine,
|
|
7
6
|
OverlayRegistry
|
|
8
7
|
} from "@contractspec/lib.overlay-engine";
|
|
9
|
-
import {
|
|
8
|
+
import { signOverlay } from "@contractspec/lib.overlay-engine/signer";
|
|
9
|
+
import { defineOverlay } from "@contractspec/lib.overlay-engine/spec";
|
|
10
10
|
var logger = new Logger({
|
|
11
11
|
level: LogLevel.INFO,
|
|
12
12
|
environment: "production",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// src/workflow-extension.ts
|
|
3
3
|
import { StabilityEnum } from "@contractspec/lib.contracts-spec";
|
|
4
|
-
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
5
4
|
import { Logger, LogLevel } from "@contractspec/lib.logger";
|
|
5
|
+
import { WorkflowComposer } from "@contractspec/lib.workflow-composer";
|
|
6
6
|
var logger = new Logger({
|
|
7
7
|
level: LogLevel.INFO,
|
|
8
8
|
environment: "production",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contractspec/example.personalization",
|
|
3
|
-
"version": "3.7.
|
|
3
|
+
"version": "3.7.7",
|
|
4
4
|
"description": "Personalization examples: behavior tracking, overlay customization, workflow extension.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -71,17 +71,17 @@
|
|
|
71
71
|
"dev": "contractspec-bun-build dev",
|
|
72
72
|
"clean": "rimraf dist .turbo",
|
|
73
73
|
"lint": "bun lint:fix",
|
|
74
|
-
"lint:fix": "
|
|
75
|
-
"lint:check": "
|
|
74
|
+
"lint:fix": "biome check --write --unsafe --only=nursery/useSortedClasses . && biome check --write .",
|
|
75
|
+
"lint:check": "biome check .",
|
|
76
76
|
"test": "bun test --pass-with-no-tests",
|
|
77
77
|
"prebuild": "contractspec-bun-build prebuild",
|
|
78
78
|
"typecheck": "tsc --noEmit"
|
|
79
79
|
},
|
|
80
80
|
"dependencies": {
|
|
81
|
-
"@contractspec/lib.personalization": "6.0.
|
|
82
|
-
"@contractspec/lib.overlay-engine": "3.7.
|
|
83
|
-
"@contractspec/lib.workflow-composer": "3.7.
|
|
84
|
-
"@contractspec/lib.contracts-spec": "
|
|
81
|
+
"@contractspec/lib.personalization": "6.0.7",
|
|
82
|
+
"@contractspec/lib.overlay-engine": "3.7.7",
|
|
83
|
+
"@contractspec/lib.workflow-composer": "3.7.7",
|
|
84
|
+
"@contractspec/lib.contracts-spec": "4.0.0",
|
|
85
85
|
"@contractspec/lib.logger": "3.7.6"
|
|
86
86
|
},
|
|
87
87
|
"devDependencies": {
|
package/src/behavior-tracking.ts
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import { createBehaviorTracker } from '@contractspec/lib.personalization/tracker';
|
|
2
|
-
import { InMemoryBehaviorStore } from '@contractspec/lib.personalization/store';
|
|
3
|
-
import { BehaviorAnalyzer } from '@contractspec/lib.personalization/analyzer';
|
|
4
1
|
import { Logger, LogLevel } from '@contractspec/lib.logger';
|
|
2
|
+
import { BehaviorAnalyzer } from '@contractspec/lib.personalization/analyzer';
|
|
3
|
+
import { InMemoryBehaviorStore } from '@contractspec/lib.personalization/store';
|
|
4
|
+
import { createBehaviorTracker } from '@contractspec/lib.personalization/tracker';
|
|
5
5
|
|
|
6
6
|
const logger = new Logger({
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
level: process.env.NODE_ENV === 'production' ? LogLevel.INFO : LogLevel.DEBUG,
|
|
8
|
+
environment:
|
|
9
|
+
(process.env.NODE_ENV as 'production' | 'development' | 'test') ||
|
|
10
|
+
'development',
|
|
11
|
+
enableColors: process.env.NODE_ENV !== 'production',
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
export async function runBehaviorTrackingExample(): Promise<void> {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
const store = new InMemoryBehaviorStore();
|
|
16
|
+
const tracker = createBehaviorTracker({
|
|
17
|
+
store,
|
|
18
|
+
context: {
|
|
19
|
+
tenantId: 'acme',
|
|
20
|
+
userId: 'user-123',
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
24
|
+
tracker.trackFieldAccess({
|
|
25
|
+
operation: 'billing.createOrder',
|
|
26
|
+
field: 'internalNotes',
|
|
27
|
+
});
|
|
28
|
+
tracker.trackFieldAccess({
|
|
29
|
+
operation: 'billing.createOrder',
|
|
30
|
+
field: 'customerReference',
|
|
31
|
+
});
|
|
32
|
+
tracker.trackFeatureUsage({ feature: 'workflow-editor', action: 'opened' });
|
|
33
|
+
tracker.trackWorkflowStep({
|
|
34
|
+
workflow: 'invoice-approval',
|
|
35
|
+
step: 'review',
|
|
36
|
+
status: 'entered',
|
|
37
|
+
});
|
|
38
|
+
await tracker.flush();
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
const analyzer = new BehaviorAnalyzer(store);
|
|
41
|
+
const insights = await analyzer.analyze({
|
|
42
|
+
tenantId: 'acme',
|
|
43
|
+
userId: 'user-123',
|
|
44
|
+
});
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
logger.info('Behavior insights computed', { insights });
|
|
47
47
|
}
|
|
@@ -2,27 +2,27 @@ import type { DocBlock } from '@contractspec/lib.contracts-spec/docs';
|
|
|
2
2
|
import { registerDocBlocks } from '@contractspec/lib.contracts-spec/docs';
|
|
3
3
|
|
|
4
4
|
const blocks: DocBlock[] = [
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
5
|
+
{
|
|
6
|
+
id: 'docs.examples.personalization',
|
|
7
|
+
title: 'Personalization Patterns (example)',
|
|
8
|
+
summary:
|
|
9
|
+
'Behavior tracking, overlay-driven UI tweaks, and tenant workflow extension patterns.',
|
|
10
|
+
kind: 'reference',
|
|
11
|
+
visibility: 'public',
|
|
12
|
+
route: '/docs/examples/personalization',
|
|
13
|
+
tags: ['personalization', 'overlays', 'workflows', 'example'],
|
|
14
|
+
body: `## Includes\n- Behavior tracking + insight analysis.\n- Overlay customization (hide fields, rename labels).\n- Workflow extension (inject tenant-specific steps).\n\n## Guardrails\n- Keep tracking events structured and non-PII.\n- Keep overlays signed and scoped.\n- Keep workflow composition deterministic.`,
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: 'docs.examples.personalization.usage',
|
|
18
|
+
title: 'Personalization — Usage',
|
|
19
|
+
summary: 'How to run the small examples and swap adapters.',
|
|
20
|
+
kind: 'usage',
|
|
21
|
+
visibility: 'public',
|
|
22
|
+
route: '/docs/examples/personalization/usage',
|
|
23
|
+
tags: ['personalization', 'usage'],
|
|
24
|
+
body: `## Usage\n- Call \`runBehaviorTrackingExample()\` for insights.\n- Call \`runOverlayCustomizationExample()\` to apply overlays.\n- Call \`composeTenantWorkflowExample()\` and \`logTenantWorkflowSteps()\` to inspect steps.\n\n## Notes\n- Replace in-memory stores with app-layer storage.\n- Keep PII out of logs and markdown outputs.`,
|
|
25
|
+
},
|
|
26
26
|
];
|
|
27
27
|
|
|
28
28
|
registerDocBlocks(blocks);
|
package/src/example.ts
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import { defineExample } from '@contractspec/lib.contracts-spec';
|
|
2
2
|
|
|
3
3
|
const example = defineExample({
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
4
|
+
meta: {
|
|
5
|
+
key: 'personalization',
|
|
6
|
+
version: '1.0.0',
|
|
7
|
+
title: 'Personalization Patterns',
|
|
8
|
+
description:
|
|
9
|
+
'Small examples for behavior tracking, overlay-based UI customization, and tenant workflow extension.',
|
|
10
|
+
kind: 'library',
|
|
11
|
+
visibility: 'public',
|
|
12
|
+
stability: 'experimental',
|
|
13
|
+
owners: ['@platform.core'],
|
|
14
|
+
tags: ['personalization', 'overlays', 'behavior', 'workflows'],
|
|
15
|
+
},
|
|
16
|
+
docs: {
|
|
17
|
+
rootDocId: 'docs.examples.personalization',
|
|
18
|
+
usageDocId: 'docs.examples.personalization.usage',
|
|
19
|
+
},
|
|
20
|
+
entrypoints: {
|
|
21
|
+
packageName: '@contractspec/example.personalization',
|
|
22
|
+
docs: './docs',
|
|
23
|
+
},
|
|
24
|
+
surfaces: {
|
|
25
|
+
templates: true,
|
|
26
|
+
sandbox: { enabled: true, modes: ['markdown', 'specs'] },
|
|
27
|
+
studio: { enabled: true, installable: true },
|
|
28
|
+
mcp: { enabled: true },
|
|
29
|
+
},
|
|
30
30
|
});
|
|
31
31
|
|
|
32
32
|
export default example;
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from './behavior-tracking';
|
|
2
|
+
export { default as example } from './example';
|
|
2
3
|
export * from './overlay-customization';
|
|
3
|
-
export * from './workflow-extension';
|
|
4
4
|
export * from './personalization.feature';
|
|
5
|
-
export
|
|
5
|
+
export * from './workflow-extension';
|
|
6
6
|
import './docs';
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { signOverlay } from '@contractspec/lib.overlay-engine/signer';
|
|
1
|
+
import { Logger, LogLevel } from '@contractspec/lib.logger';
|
|
3
2
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
OverlayEngine,
|
|
4
|
+
OverlayRegistry,
|
|
6
5
|
} from '@contractspec/lib.overlay-engine';
|
|
7
|
-
import {
|
|
6
|
+
import { signOverlay } from '@contractspec/lib.overlay-engine/signer';
|
|
7
|
+
import { defineOverlay } from '@contractspec/lib.overlay-engine/spec';
|
|
8
8
|
|
|
9
9
|
const logger = new Logger({
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
level: process.env.NODE_ENV === 'production' ? LogLevel.INFO : LogLevel.DEBUG,
|
|
11
|
+
environment:
|
|
12
|
+
(process.env.NODE_ENV as 'production' | 'development' | 'test') ||
|
|
13
|
+
'development',
|
|
14
|
+
enableColors: process.env.NODE_ENV !== 'production',
|
|
15
15
|
});
|
|
16
16
|
|
|
17
17
|
export async function runOverlayCustomizationExample(): Promise<void> {
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
const registry = new OverlayRegistry({ allowUnsigned: true });
|
|
19
|
+
const engine = new OverlayEngine({ registry });
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
21
|
+
const overlay = defineOverlay({
|
|
22
|
+
overlayId: 'demo-overlay',
|
|
23
|
+
version: '1.0.0',
|
|
24
|
+
appliesTo: {
|
|
25
|
+
capability: 'billing.createOrder',
|
|
26
|
+
tenantId: 'demo',
|
|
27
|
+
},
|
|
28
|
+
modifications: [
|
|
29
|
+
{ type: 'hideField', field: 'internalNotes' },
|
|
30
|
+
{
|
|
31
|
+
type: 'renameLabel',
|
|
32
|
+
field: 'customerReference',
|
|
33
|
+
newLabel: 'PO Number',
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
});
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
const signed = await signOverlay(overlay, process.env.PRIVATE_KEY_PEM ?? '');
|
|
39
|
+
registry.register(signed);
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
41
|
+
const result = engine.apply({
|
|
42
|
+
target: {
|
|
43
|
+
fields: [
|
|
44
|
+
{
|
|
45
|
+
key: 'customerReference',
|
|
46
|
+
label: 'Customer Reference',
|
|
47
|
+
visible: true,
|
|
48
|
+
},
|
|
49
|
+
{ key: 'internalNotes', label: 'Internal Notes', visible: true },
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
capability: 'billing.createOrder',
|
|
53
|
+
tenantId: 'demo',
|
|
54
|
+
});
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
logger.info('Overlay applied', { fields: result.target.fields });
|
|
57
57
|
}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import { defineFeature } from '@contractspec/lib.contracts-spec';
|
|
2
2
|
|
|
3
3
|
export const PersonalizationFeature = defineFeature({
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
4
|
+
meta: {
|
|
5
|
+
key: 'personalization',
|
|
6
|
+
version: '1.0.0',
|
|
7
|
+
title: 'Personalization Patterns',
|
|
8
|
+
description:
|
|
9
|
+
'Behavior tracking, overlay customization, and workflow extension patterns',
|
|
10
|
+
domain: 'personalization',
|
|
11
|
+
owners: ['@examples'],
|
|
12
|
+
tags: ['personalization', 'behavior', 'overlay', 'workflow'],
|
|
13
|
+
stability: 'experimental',
|
|
14
|
+
},
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
telemetry: [{ key: 'personalization.telemetry', version: '1.0.0' }],
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
docs: [
|
|
19
|
+
'docs.examples.personalization',
|
|
20
|
+
'docs.examples.personalization.usage',
|
|
21
|
+
],
|
|
22
22
|
});
|
|
@@ -1,63 +1,63 @@
|
|
|
1
1
|
import { StabilityEnum } from '@contractspec/lib.contracts-spec';
|
|
2
2
|
import type { WorkflowSpec } from '@contractspec/lib.contracts-spec/workflow/spec';
|
|
3
|
-
import { WorkflowComposer } from '@contractspec/lib.workflow-composer';
|
|
4
3
|
import { Logger, LogLevel } from '@contractspec/lib.logger';
|
|
4
|
+
import { WorkflowComposer } from '@contractspec/lib.workflow-composer';
|
|
5
5
|
|
|
6
6
|
const logger = new Logger({
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
level: process.env.NODE_ENV === 'production' ? LogLevel.INFO : LogLevel.DEBUG,
|
|
8
|
+
environment:
|
|
9
|
+
(process.env.NODE_ENV as 'production' | 'development' | 'test') ||
|
|
10
|
+
'development',
|
|
11
|
+
enableColors: process.env.NODE_ENV !== 'production',
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
const BaseWorkflow: WorkflowSpec = {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
15
|
+
meta: {
|
|
16
|
+
key: 'billing.invoiceApproval',
|
|
17
|
+
version: '1.0.0',
|
|
18
|
+
title: 'Invoice Approval',
|
|
19
|
+
owners: [],
|
|
20
|
+
tags: [],
|
|
21
|
+
description: '',
|
|
22
|
+
domain: 'billing',
|
|
23
|
+
stability: StabilityEnum.Stable,
|
|
24
|
+
},
|
|
25
|
+
definition: {
|
|
26
|
+
steps: [
|
|
27
|
+
{ id: 'validate-invoice', type: 'automation', label: 'Validate Invoice' },
|
|
28
|
+
{ id: 'final-approval', type: 'human', label: 'Final Approval' },
|
|
29
|
+
],
|
|
30
|
+
transitions: [{ from: 'validate-invoice', to: 'final-approval' }],
|
|
31
|
+
},
|
|
32
32
|
};
|
|
33
33
|
|
|
34
34
|
export function composeTenantWorkflowExample(): WorkflowSpec {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
35
|
+
const composer = new WorkflowComposer();
|
|
36
|
+
composer.register({
|
|
37
|
+
workflow: 'billing.invoiceApproval',
|
|
38
|
+
tenantId: 'acme',
|
|
39
|
+
customSteps: [
|
|
40
|
+
{
|
|
41
|
+
after: 'validate-invoice',
|
|
42
|
+
inject: {
|
|
43
|
+
id: 'acme-legal',
|
|
44
|
+
type: 'human',
|
|
45
|
+
label: 'ACME Legal Review',
|
|
46
|
+
},
|
|
47
|
+
transitionTo: 'final-approval',
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
});
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
return composer.compose({
|
|
53
|
+
base: BaseWorkflow,
|
|
54
|
+
tenantId: 'acme',
|
|
55
|
+
});
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
export function logTenantWorkflowSteps(workflow: WorkflowSpec): void {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
logger.info('Tenant workflow composed', {
|
|
60
|
+
workflow: workflow.meta.key,
|
|
61
|
+
steps: workflow.definition.steps.map((step) => step.id),
|
|
62
|
+
});
|
|
63
63
|
}
|
package/tsconfig.json
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
2
|
+
"extends": "@contractspec/tool.typescript/react-library.json",
|
|
3
|
+
"include": ["src"],
|
|
4
|
+
"exclude": ["node_modules", "dist"],
|
|
5
|
+
"compilerOptions": {
|
|
6
|
+
"outDir": "dist",
|
|
7
|
+
"paths": {
|
|
8
|
+
"@contractspec/lib.personalization/*": [
|
|
9
|
+
"../../libs/personalization/src/*"
|
|
10
|
+
],
|
|
11
|
+
"@contractspec/lib.contracts-spec/*": ["../../libs/contracts/src/*"],
|
|
12
|
+
"@contractspec/lib.contracts-spec": ["../../libs/contracts/src/index.ts"],
|
|
13
|
+
"@contractspec/lib.overlay-engine/*": ["../../libs/overlay-engine/src/*"],
|
|
14
|
+
"@contractspec/lib.overlay-engine": [
|
|
15
|
+
"../../libs/overlay-engine/src/index.ts"
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
}
|
|
15
19
|
}
|
|
16
|
-
|
|
17
|
-
|
package/tsdown.config.js
CHANGED