@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.
@@ -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 17ms
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 7ms
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 7ms
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 -- `@contractspec/example.personalization`
1
+ # AI Agent Guide `@contractspec/example.personalization`
2
2
 
3
3
  Scope: `packages/examples/personalization/*`
4
4
 
5
- Personalization examples: behavior tracking, overlay customization, and workflow extension.
5
+ Personalization examples: behavior tracking, overlay customization, workflow extension.
6
6
 
7
7
  ## Quick Context
8
8
 
9
- - **Layer**: example
10
- - **Related Packages**: `lib.personalization`, `lib.overlay-engine`, `lib.workflow-composer`, `lib.contracts-spec`, `lib.logger`
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
- ## What This Demonstrates
14
+ ## Architecture
13
15
 
14
- - Behavior tracking integration pattern
15
- - Overlay customization via overlay-engine
16
- - Workflow extension via workflow-composer
17
- - Multi-lib composition in a single example
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 Exports
24
+ ## Public Surface
20
25
 
21
- - `.` -- root barrel
22
- - `./behavior-tracking` -- tracking patterns
23
- - `./overlay-customization` -- overlay config
24
- - `./workflow-extension` -- workflow extension
25
- - `./docs`, `./example`
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
- - Build: `bun run build`
30
- - Dev: `bun run dev`
31
- - Test: `bun test --pass-with-no-tests`
32
- - Typecheck: `bun run typecheck`
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 patterns** -- behavior tracking, overlay customization, and workflow extension examples.
5
+ **Personalization examples: behavior tracking, overlay customization, workflow extension.**
6
6
 
7
7
  ## What This Demonstrates
8
8
 
9
- - Behavior tracking with the personalization lib tracker
10
- - Overlay customization using the overlay-engine
11
- - Workflow extension patterns for adaptive UX
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
- ## Exports
16
+ ## Running Locally
14
17
 
15
- - `.` -- aggregated re-exports
16
- - `./behavior-tracking` -- behavior tracking example
17
- - `./overlay-customization` -- overlay customization example
18
- - `./workflow-extension` -- workflow extension example
19
- - `./docs` -- DocBlock documentation
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
- ```ts
25
- import { behaviorTrackingExample } from "@contractspec/example.personalization/behavior-tracking";
26
- import { overlayCustomizationExample } from "@contractspec/example.personalization/overlay-customization";
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",
@@ -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 { defineOverlay } from "@contractspec/lib.overlay-engine/spec";
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 { Logger as Logger2, LogLevel as LogLevel2 } from "@contractspec/lib.logger";
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 { defineOverlay } from "@contractspec/lib.overlay-engine/spec";
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 { Logger, LogLevel } from "@contractspec/lib.logger";
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 { default as example } from './example';
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 { defineOverlay } from "@contractspec/lib.overlay-engine/spec";
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 { Logger as Logger2, LogLevel as LogLevel2 } from "@contractspec/lib.logger";
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",
@@ -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 { defineOverlay } from "@contractspec/lib.overlay-engine/spec";
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 { Logger as Logger2, LogLevel as LogLevel2 } from "@contractspec/lib.logger";
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 { defineOverlay } from "@contractspec/lib.overlay-engine/spec";
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 { Logger, LogLevel } from "@contractspec/lib.logger";
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 { defineOverlay } from "@contractspec/lib.overlay-engine/spec";
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 { Logger, LogLevel } from "@contractspec/lib.logger";
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.6",
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": "eslint src --fix",
75
- "lint:check": "eslint src",
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.6",
82
- "@contractspec/lib.overlay-engine": "3.7.6",
83
- "@contractspec/lib.workflow-composer": "3.7.6",
84
- "@contractspec/lib.contracts-spec": "3.7.6",
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": {
@@ -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
- 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',
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
- const store = new InMemoryBehaviorStore();
16
- const tracker = createBehaviorTracker({
17
- store,
18
- context: {
19
- tenantId: 'acme',
20
- userId: 'user-123',
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
- 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();
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
- const analyzer = new BehaviorAnalyzer(store);
41
- const insights = await analyzer.analyze({
42
- tenantId: 'acme',
43
- userId: 'user-123',
44
- });
40
+ const analyzer = new BehaviorAnalyzer(store);
41
+ const insights = await analyzer.analyze({
42
+ tenantId: 'acme',
43
+ userId: 'user-123',
44
+ });
45
45
 
46
- logger.info('Behavior insights computed', { insights });
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
- 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
- },
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
- 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
- },
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 { default as example } from './example';
5
+ export * from './workflow-extension';
6
6
  import './docs';
@@ -1,57 +1,57 @@
1
- import { defineOverlay } from '@contractspec/lib.overlay-engine/spec';
2
- import { signOverlay } from '@contractspec/lib.overlay-engine/signer';
1
+ import { Logger, LogLevel } from '@contractspec/lib.logger';
3
2
  import {
4
- OverlayEngine,
5
- OverlayRegistry,
3
+ OverlayEngine,
4
+ OverlayRegistry,
6
5
  } from '@contractspec/lib.overlay-engine';
7
- import { Logger, LogLevel } from '@contractspec/lib.logger';
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
- 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',
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
- const registry = new OverlayRegistry({ allowUnsigned: true });
19
- const engine = new OverlayEngine({ registry });
18
+ const registry = new OverlayRegistry({ allowUnsigned: true });
19
+ const engine = new OverlayEngine({ registry });
20
20
 
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
- });
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
- const signed = await signOverlay(overlay, process.env.PRIVATE_KEY_PEM ?? '');
39
- registry.register(signed);
38
+ const signed = await signOverlay(overlay, process.env.PRIVATE_KEY_PEM ?? '');
39
+ registry.register(signed);
40
40
 
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
- });
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
- logger.info('Overlay applied', { fields: result.target.fields });
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
- 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
- },
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
- telemetry: [{ key: 'personalization.telemetry', version: '1.0.0' }],
16
+ telemetry: [{ key: 'personalization.telemetry', version: '1.0.0' }],
17
17
 
18
- docs: [
19
- 'docs.examples.personalization',
20
- 'docs.examples.personalization.usage',
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
- 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',
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
- 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
- },
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
- 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
- });
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
- return composer.compose({
53
- base: BaseWorkflow,
54
- tenantId: 'acme',
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
- logger.info('Tenant workflow composed', {
60
- workflow: workflow.meta.key,
61
- steps: workflow.definition.steps.map((step) => step.id),
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
- "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/*": ["../../libs/personalization/src/*"],
9
- "@contractspec/lib.contracts-spec/*": ["../../libs/contracts/src/*"],
10
- "@contractspec/lib.contracts-spec": ["../../libs/contracts/src/index.ts"],
11
- "@contractspec/lib.overlay-engine/*": ["../../libs/overlay-engine/src/*"],
12
- "@contractspec/lib.overlay-engine": ["../../libs/overlay-engine/src/index.ts"]
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
@@ -1,5 +1,5 @@
1
1
  import { defineConfig, moduleLibrary } from '@contractspec/tool.bun';
2
2
 
3
3
  export default defineConfig(() => ({
4
- ...moduleLibrary,
4
+ ...moduleLibrary,
5
5
  }));