@contractspec/module.lifecycle-core 1.57.0 → 1.59.0

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.
Files changed (34) hide show
  1. package/dist/__tests__/stage-scorer.test.d.ts +2 -0
  2. package/dist/__tests__/stage-scorer.test.d.ts.map +1 -0
  3. package/dist/adapters/analytics-adapter.d.ts +7 -11
  4. package/dist/adapters/analytics-adapter.d.ts.map +1 -1
  5. package/dist/adapters/intent-adapter.d.ts +5 -9
  6. package/dist/adapters/intent-adapter.d.ts.map +1 -1
  7. package/dist/adapters/questionnaire-adapter.d.ts +7 -11
  8. package/dist/adapters/questionnaire-adapter.d.ts.map +1 -1
  9. package/dist/browser/index.js +427 -0
  10. package/dist/collectors/signal-collector.d.ts +17 -21
  11. package/dist/collectors/signal-collector.d.ts.map +1 -1
  12. package/dist/index.d.ts +8 -8
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +427 -5
  15. package/dist/node/index.js +427 -0
  16. package/dist/orchestrator/lifecycle-orchestrator.d.ts +16 -19
  17. package/dist/orchestrator/lifecycle-orchestrator.d.ts.map +1 -1
  18. package/dist/planning/milestone-planner.d.ts +5 -9
  19. package/dist/planning/milestone-planner.d.ts.map +1 -1
  20. package/dist/scoring/stage-scorer.d.ts +18 -19
  21. package/dist/scoring/stage-scorer.d.ts.map +1 -1
  22. package/package.json +20 -15
  23. package/dist/collectors/signal-collector.js +0 -65
  24. package/dist/collectors/signal-collector.js.map +0 -1
  25. package/dist/data/milestones-catalog.js +0 -74
  26. package/dist/data/milestones-catalog.js.map +0 -1
  27. package/dist/data/stage-weights.js +0 -170
  28. package/dist/data/stage-weights.js.map +0 -1
  29. package/dist/orchestrator/lifecycle-orchestrator.js +0 -53
  30. package/dist/orchestrator/lifecycle-orchestrator.js.map +0 -1
  31. package/dist/planning/milestone-planner.js +0 -17
  32. package/dist/planning/milestone-planner.js.map +0 -1
  33. package/dist/scoring/stage-scorer.js +0 -64
  34. package/dist/scoring/stage-scorer.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stage-scorer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage-scorer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/stage-scorer.test.ts"],"names":[],"mappings":""}
@@ -1,14 +1,10 @@
1
- import { LifecycleAxes, LifecycleMetricSnapshot, LifecycleSignal } from "@contractspec/lib.lifecycle";
2
-
3
- //#region src/adapters/analytics-adapter.d.ts
4
- interface AnalyticsAdapterResult {
5
- metrics?: LifecycleMetricSnapshot;
6
- signals?: LifecycleSignal[];
7
- axes?: Partial<LifecycleAxes>;
1
+ import type { LifecycleAxes, LifecycleMetricSnapshot, LifecycleSignal } from '@contractspec/lib.lifecycle';
2
+ export interface AnalyticsAdapterResult {
3
+ metrics?: LifecycleMetricSnapshot;
4
+ signals?: LifecycleSignal[];
5
+ axes?: Partial<LifecycleAxes>;
8
6
  }
9
- interface AnalyticsAdapter {
10
- fetch(): Promise<AnalyticsAdapterResult>;
7
+ export interface AnalyticsAdapter {
8
+ fetch(): Promise<AnalyticsAdapterResult>;
11
9
  }
12
- //#endregion
13
- export { AnalyticsAdapter, AnalyticsAdapterResult };
14
10
  //# sourceMappingURL=analytics-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analytics-adapter.d.ts","names":[],"sources":["../../src/adapters/analytics-adapter.ts"],"mappings":";;;UAMiB,sBAAA;EACf,OAAA,GAAU,uBAAA;EACV,OAAA,GAAU,eAAA;EACV,IAAA,GAAO,OAAA,CAAQ,aAAA;AAAA;AAAA,UAGA,gBAAA;EACf,KAAA,IAAS,OAAA,CAAQ,sBAAA;AAAA"}
1
+ {"version":3,"file":"analytics-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/analytics-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EACvB,eAAe,EAChB,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAC1C"}
@@ -1,12 +1,8 @@
1
- import { LifecycleSignal } from "@contractspec/lib.lifecycle";
2
-
3
- //#region src/adapters/intent-adapter.d.ts
4
- interface IntentAdapterResult {
5
- signals?: LifecycleSignal[];
1
+ import type { LifecycleSignal } from '@contractspec/lib.lifecycle';
2
+ export interface IntentAdapterResult {
3
+ signals?: LifecycleSignal[];
6
4
  }
7
- interface IntentAdapter {
8
- fetch(): Promise<IntentAdapterResult>;
5
+ export interface IntentAdapter {
6
+ fetch(): Promise<IntentAdapterResult>;
9
7
  }
10
- //#endregion
11
- export { IntentAdapter, IntentAdapterResult };
12
8
  //# sourceMappingURL=intent-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"intent-adapter.d.ts","names":[],"sources":["../../src/adapters/intent-adapter.ts"],"mappings":";;;UAEiB,mBAAA;EACf,OAAA,GAAU,eAAA;AAAA;AAAA,UAGK,aAAA;EACf,KAAA,IAAS,OAAA,CAAQ,mBAAA;AAAA"}
1
+ {"version":3,"file":"intent-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/intent-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACvC"}
@@ -1,14 +1,10 @@
1
- import { LifecycleAxes, LifecycleSignal } from "@contractspec/lib.lifecycle";
2
-
3
- //#region src/adapters/questionnaire-adapter.d.ts
4
- interface QuestionnaireAdapterResult {
5
- axes?: Partial<LifecycleAxes>;
6
- signals?: LifecycleSignal[];
7
- answers?: Record<string, unknown>;
1
+ import type { LifecycleAxes, LifecycleSignal } from '@contractspec/lib.lifecycle';
2
+ export interface QuestionnaireAdapterResult {
3
+ axes?: Partial<LifecycleAxes>;
4
+ signals?: LifecycleSignal[];
5
+ answers?: Record<string, unknown>;
8
6
  }
9
- interface QuestionnaireAdapter {
10
- fetch(): Promise<QuestionnaireAdapterResult>;
7
+ export interface QuestionnaireAdapter {
8
+ fetch(): Promise<QuestionnaireAdapterResult>;
11
9
  }
12
- //#endregion
13
- export { QuestionnaireAdapter, QuestionnaireAdapterResult };
14
10
  //# sourceMappingURL=questionnaire-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"questionnaire-adapter.d.ts","names":[],"sources":["../../src/adapters/questionnaire-adapter.ts"],"mappings":";;;UAKiB,0BAAA;EACf,IAAA,GAAO,OAAA,CAAQ,aAAA;EACf,OAAA,GAAU,eAAA;EACV,OAAA,GAAU,MAAA;AAAA;AAAA,UAGK,oBAAA;EACf,KAAA,IAAS,OAAA,CAAQ,0BAAA;AAAA"}
1
+ {"version":3,"file":"questionnaire-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/questionnaire-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EAChB,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,IAAI,OAAO,CAAC,0BAA0B,CAAC,CAAC;CAC9C"}
@@ -0,0 +1,427 @@
1
+ // src/collectors/signal-collector.ts
2
+ import {
3
+ CapitalPhase,
4
+ CompanyPhase,
5
+ ProductPhase
6
+ } from "@contractspec/lib.lifecycle";
7
+ var DEFAULT_AXES = {
8
+ product: ProductPhase.Sketch,
9
+ company: CompanyPhase.Solo,
10
+ capital: CapitalPhase.Bootstrapped
11
+ };
12
+
13
+ class StageSignalCollector {
14
+ options;
15
+ constructor(options) {
16
+ this.options = options;
17
+ }
18
+ async collect(input = {}) {
19
+ const axes = {
20
+ ...DEFAULT_AXES,
21
+ ...input.axes ?? {}
22
+ };
23
+ const metricsSnapshots = [];
24
+ const aggregatedSignals = [...input.signals ?? []];
25
+ const questionnaireAnswers = {
26
+ ...input.questionnaireAnswers ?? {}
27
+ };
28
+ if (input.metrics) {
29
+ metricsSnapshots.push(input.metrics);
30
+ }
31
+ if (this.options.analyticsAdapter) {
32
+ const result = await this.options.analyticsAdapter.fetch();
33
+ if (result.axes)
34
+ Object.assign(axes, result.axes);
35
+ if (result.metrics)
36
+ metricsSnapshots.push(result.metrics);
37
+ if (result.signals)
38
+ aggregatedSignals.push(...result.signals);
39
+ }
40
+ if (this.options.questionnaireAdapter) {
41
+ const result = await this.options.questionnaireAdapter.fetch();
42
+ if (result.axes)
43
+ Object.assign(axes, result.axes);
44
+ if (result.signals)
45
+ aggregatedSignals.push(...result.signals);
46
+ Object.assign(questionnaireAnswers, result.answers);
47
+ }
48
+ if (this.options.intentAdapter) {
49
+ const result = await this.options.intentAdapter.fetch();
50
+ if (result.signals)
51
+ aggregatedSignals.push(...result.signals);
52
+ }
53
+ const metrics = mergeMetricSnapshots(metricsSnapshots);
54
+ return {
55
+ axes,
56
+ metrics,
57
+ signals: dedupeSignals(aggregatedSignals),
58
+ questionnaireAnswers: Object.keys(questionnaireAnswers).length ? questionnaireAnswers : undefined
59
+ };
60
+ }
61
+ }
62
+ var mergeMetricSnapshots = (snapshots) => snapshots.reduce((acc, snapshot) => {
63
+ Object.entries(snapshot ?? {}).forEach(([key, value]) => {
64
+ if (value !== undefined && value !== null) {
65
+ acc[key] = value;
66
+ }
67
+ });
68
+ return acc;
69
+ }, {});
70
+ var dedupeSignals = (signals) => {
71
+ const seen = new Set;
72
+ return signals.filter((signal) => {
73
+ if (!signal.id)
74
+ return true;
75
+ if (seen.has(signal.id))
76
+ return false;
77
+ seen.add(signal.id);
78
+ return true;
79
+ });
80
+ };
81
+ // src/scoring/stage-scorer.ts
82
+ import {
83
+ LIFECYCLE_STAGE_META,
84
+ LifecycleStage
85
+ } from "@contractspec/lib.lifecycle";
86
+ // src/data/stage-weights.json
87
+ var stage_weights_default = {
88
+ Exploration: {
89
+ base: 0.35,
90
+ metrics: {
91
+ activeUsers: { weight: 0.3, direction: "lte", threshold: 5 },
92
+ customerCount: { weight: 0.2, direction: "lte", threshold: 3 },
93
+ teamSize: { weight: 0.1, direction: "lte", threshold: 3 }
94
+ },
95
+ signalKinds: {
96
+ qualitative: 0.4,
97
+ metric: 0.1
98
+ }
99
+ },
100
+ ProblemSolutionFit: {
101
+ base: 0.4,
102
+ metrics: {
103
+ activeUsers: { weight: 0.2, direction: "gte", threshold: 5 },
104
+ customerCount: { weight: 0.2, direction: "gte", threshold: 3 }
105
+ },
106
+ signalKinds: {
107
+ qualitative: 0.3,
108
+ event: 0.1
109
+ }
110
+ },
111
+ MvpEarlyTraction: {
112
+ base: 0.45,
113
+ metrics: {
114
+ activeUsers: { weight: 0.25, direction: "gte", threshold: 25 },
115
+ weeklyActiveUsers: {
116
+ weight: 0.25,
117
+ direction: "gte",
118
+ threshold: 20
119
+ },
120
+ retentionRate: { weight: 0.2, direction: "gte", threshold: 0.25 }
121
+ },
122
+ signalKinds: {
123
+ metric: 0.15,
124
+ event: 0.1
125
+ }
126
+ },
127
+ ProductMarketFit: {
128
+ base: 0.5,
129
+ metrics: {
130
+ retentionRate: {
131
+ weight: 0.35,
132
+ direction: "gte",
133
+ threshold: 0.45
134
+ },
135
+ monthlyRecurringRevenue: {
136
+ weight: 0.25,
137
+ direction: "gte",
138
+ threshold: 1e4
139
+ },
140
+ customerCount: { weight: 0.2, direction: "gte", threshold: 30 }
141
+ },
142
+ signalKinds: {
143
+ metric: 0.15,
144
+ event: 0.1
145
+ }
146
+ },
147
+ GrowthScaleUp: {
148
+ base: 0.55,
149
+ metrics: {
150
+ retentionRate: { weight: 0.2, direction: "gte", threshold: 0.55 },
151
+ monthlyRecurringRevenue: {
152
+ weight: 0.3,
153
+ direction: "gte",
154
+ threshold: 50000
155
+ },
156
+ teamSize: { weight: 0.15, direction: "gte", threshold: 15 }
157
+ },
158
+ signalKinds: {
159
+ event: 0.2,
160
+ metric: 0.15
161
+ }
162
+ },
163
+ ExpansionPlatform: {
164
+ base: 0.6,
165
+ metrics: {
166
+ monthlyRecurringRevenue: {
167
+ weight: 0.35,
168
+ direction: "gte",
169
+ threshold: 150000
170
+ },
171
+ customerCount: { weight: 0.2, direction: "gte", threshold: 100 },
172
+ teamSize: { weight: 0.15, direction: "gte", threshold: 40 }
173
+ },
174
+ signalKinds: {
175
+ event: 0.2,
176
+ milestone: 0.1
177
+ }
178
+ },
179
+ MaturityRenewal: {
180
+ base: 0.6,
181
+ metrics: {
182
+ monthlyRecurringRevenue: {
183
+ weight: 0.25,
184
+ direction: "gte",
185
+ threshold: 250000
186
+ },
187
+ teamSize: { weight: 0.15, direction: "gte", threshold: 80 },
188
+ burnMultiple: { weight: 0.2, direction: "lte", threshold: 1.5 }
189
+ },
190
+ signalKinds: {
191
+ event: 0.2,
192
+ milestone: 0.15
193
+ }
194
+ }
195
+ };
196
+
197
+ // src/scoring/stage-scorer.ts
198
+ var DEFAULT_WEIGHTS = stage_weights_default;
199
+
200
+ class StageScorer {
201
+ weights;
202
+ constructor(weights = DEFAULT_WEIGHTS) {
203
+ this.weights = weights;
204
+ }
205
+ score(input) {
206
+ const kindStrength = evaluateSignalKinds(input.signals);
207
+ const scores = Object.values(LifecycleStage).filter(isStageValue).map((stage) => {
208
+ const stageName = LifecycleStage[stage];
209
+ const config = this.weights[stageName] ?? { base: 0.5 };
210
+ let score = config.base ?? 0.5;
211
+ let contributions = 0;
212
+ const totalPossible = Object.keys(config.metrics ?? {}).length + Object.keys(config.signalKinds ?? {}).length || 1;
213
+ const supportingSignals = [];
214
+ if (config.metrics) {
215
+ Object.entries(config.metrics).forEach(([metricKey, metricConfig]) => {
216
+ const value = input.metrics[metricKey];
217
+ if (value === undefined || value === null)
218
+ return;
219
+ if (passesThreshold(value, metricConfig)) {
220
+ score += metricConfig.weight;
221
+ contributions += 1;
222
+ supportingSignals.push(`metric:${metricKey}`);
223
+ } else {
224
+ score += metricConfig.weight * 0.25;
225
+ }
226
+ });
227
+ }
228
+ if (config.signalKinds) {
229
+ Object.entries(config.signalKinds).forEach(([kind, weight]) => {
230
+ const strength = kindStrength[kind] ?? 0;
231
+ if (strength > 0 && typeof weight === "number") {
232
+ score += weight;
233
+ contributions += 1;
234
+ supportingSignals.push(`signal:${kind}`);
235
+ }
236
+ });
237
+ }
238
+ score = clamp(score, 0, 1.25);
239
+ const confidence = clamp(contributions / totalPossible, 0.1, 1);
240
+ return {
241
+ stage,
242
+ score,
243
+ confidence,
244
+ supportingSignals
245
+ };
246
+ });
247
+ return scores.sort((a, b) => {
248
+ if (b.score === a.score) {
249
+ return b.confidence - a.confidence;
250
+ }
251
+ return b.score - a.score;
252
+ });
253
+ }
254
+ }
255
+ var passesThreshold = (value, config) => {
256
+ const direction = config.direction ?? "gte";
257
+ if (direction === "gte") {
258
+ return value >= config.threshold;
259
+ }
260
+ return value <= config.threshold;
261
+ };
262
+ var clamp = (value, min, max) => Math.min(Math.max(value, min), max);
263
+ var evaluateSignalKinds = (signals) => signals.reduce((acc, signal) => {
264
+ const key = signal.kind ?? "unknown";
265
+ acc[key] = (acc[key] ?? 0) + (signal.weight ?? 1);
266
+ return acc;
267
+ }, {});
268
+ var isStageValue = (value) => typeof value === "number" && (value in LIFECYCLE_STAGE_META);
269
+ // src/orchestrator/lifecycle-orchestrator.ts
270
+ import {
271
+ LIFECYCLE_STAGE_META as LIFECYCLE_STAGE_META2,
272
+ LifecycleStage as LifecycleStage2
273
+ } from "@contractspec/lib.lifecycle";
274
+
275
+ class LifecycleOrchestrator {
276
+ collector;
277
+ scorer;
278
+ planner;
279
+ constructor(options) {
280
+ this.collector = options.collector;
281
+ this.scorer = options.scorer;
282
+ this.planner = options.milestonePlanner;
283
+ }
284
+ async run(input) {
285
+ const collected = await this.collector.collect(input);
286
+ const scorecard = this.scorer.score({
287
+ metrics: collected.metrics,
288
+ signals: collected.signals
289
+ });
290
+ const top = scorecard[0] ?? fallbackScore();
291
+ const meta = LIFECYCLE_STAGE_META2[top.stage];
292
+ return {
293
+ stage: top.stage,
294
+ confidence: top.confidence,
295
+ axes: collected.axes,
296
+ signals: collected.signals,
297
+ metrics: toMetricRecord(collected.metrics),
298
+ gaps: meta.focusAreas.slice(0, 3),
299
+ focusAreas: meta.focusAreas,
300
+ scorecard,
301
+ generatedAt: new Date().toISOString()
302
+ };
303
+ }
304
+ getUpcomingMilestones(stage, completedMilestoneIds = [], limit = 5) {
305
+ if (!this.planner)
306
+ return [];
307
+ return this.planner.getUpcoming(stage, completedMilestoneIds, limit);
308
+ }
309
+ }
310
+ var fallbackScore = () => ({
311
+ stage: LifecycleStage2.Exploration,
312
+ score: 0.3,
313
+ confidence: 0.3,
314
+ supportingSignals: []
315
+ });
316
+ var toMetricRecord = (snapshot) => Object.entries(snapshot ?? {}).reduce((acc, [key, value]) => {
317
+ if (typeof value === "number") {
318
+ acc[key] = value;
319
+ }
320
+ return acc;
321
+ }, {});
322
+ // src/data/milestones-catalog.json
323
+ var milestones_catalog_default = [
324
+ {
325
+ id: "stage0-problem-statement",
326
+ stage: 0,
327
+ category: "product",
328
+ title: "Write the pain statement",
329
+ description: "Capture the clearest description of the top problem in the customer’s own words.",
330
+ priority: 1,
331
+ actionItems: [
332
+ "Interview at least 5 ideal customers",
333
+ "Synthesize quotes into a one-page brief"
334
+ ]
335
+ },
336
+ {
337
+ id: "stage1-prototype-loop",
338
+ stage: 1,
339
+ category: "product",
340
+ title: "Prototype feedback loop",
341
+ description: "Ship a clickable prototype and gather 3 rounds of feedback.",
342
+ priority: 2,
343
+ actionItems: [
344
+ "Create a low-fidelity prototype",
345
+ "Schedule standing feedback calls"
346
+ ]
347
+ },
348
+ {
349
+ id: "stage2-activation",
350
+ stage: 2,
351
+ category: "operations",
352
+ title: "Activation checklist",
353
+ description: "Define the minimum steps required for a new user to succeed.",
354
+ priority: 1,
355
+ actionItems: [
356
+ "Document onboarding flow",
357
+ "Instrument activation analytics"
358
+ ]
359
+ },
360
+ {
361
+ id: "stage3-retention-narrative",
362
+ stage: 3,
363
+ category: "product",
364
+ title: "Retention narrative",
365
+ description: "Create the before/after story that proves why users stay.",
366
+ priority: 2,
367
+ actionItems: [
368
+ "Interview 3 retained users",
369
+ "Publish a one-pager with concrete metrics"
370
+ ]
371
+ },
372
+ {
373
+ id: "stage4-growth-loop",
374
+ stage: 4,
375
+ category: "growth",
376
+ title: "Install a growth loop",
377
+ description: "Stand up a repeatable acquisition → activation → referral motion.",
378
+ priority: 1,
379
+ actionItems: [
380
+ "Define loop metrics",
381
+ "Assign owners for each stage",
382
+ "Review weekly"
383
+ ]
384
+ },
385
+ {
386
+ id: "stage5-platform-blueprint",
387
+ stage: 5,
388
+ category: "product",
389
+ title: "Platform blueprint",
390
+ description: "Align on APIs, integrations, and governance for partners.",
391
+ priority: 2,
392
+ actionItems: [
393
+ "Create integration scoring rubric",
394
+ "Publish partner onboarding checklist"
395
+ ]
396
+ },
397
+ {
398
+ id: "stage6-renewal-ops",
399
+ stage: 6,
400
+ category: "operations",
401
+ title: "Renewal operating rhythm",
402
+ description: "Decide whether to optimize, reinvest, or sunset each major surface.",
403
+ priority: 1,
404
+ actionItems: [
405
+ "Hold quarterly renewal review",
406
+ "Document reinvestment bets"
407
+ ]
408
+ }
409
+ ];
410
+
411
+ // src/planning/milestone-planner.ts
412
+ class LifecycleMilestonePlanner {
413
+ milestones;
414
+ constructor(customCatalog) {
415
+ this.milestones = customCatalog ?? milestones_catalog_default;
416
+ }
417
+ getUpcoming(stage, completedIds = [], limit = 5) {
418
+ const completedSet = new Set(completedIds);
419
+ return this.milestones.filter((milestone) => milestone.stage === stage && !completedSet.has(milestone.id)).sort((a, b) => a.priority - b.priority).slice(0, limit);
420
+ }
421
+ }
422
+ export {
423
+ StageSignalCollector,
424
+ StageScorer,
425
+ LifecycleOrchestrator,
426
+ LifecycleMilestonePlanner
427
+ };
@@ -1,25 +1,21 @@
1
- import { AnalyticsAdapter } from "../adapters/analytics-adapter.js";
2
- import { QuestionnaireAdapter } from "../adapters/questionnaire-adapter.js";
3
- import { IntentAdapter } from "../adapters/intent-adapter.js";
4
- import { LifecycleAssessmentInput, LifecycleAxes, LifecycleMetricSnapshot, LifecycleSignal } from "@contractspec/lib.lifecycle";
5
-
6
- //#region src/collectors/signal-collector.d.ts
7
- interface StageSignalCollectorOptions {
8
- analyticsAdapter?: AnalyticsAdapter;
9
- questionnaireAdapter?: QuestionnaireAdapter;
10
- intentAdapter?: IntentAdapter;
1
+ import type { LifecycleAssessmentInput, LifecycleAxes, LifecycleMetricSnapshot, LifecycleSignal } from '@contractspec/lib.lifecycle';
2
+ import type { AnalyticsAdapter } from '../adapters/analytics-adapter';
3
+ import type { QuestionnaireAdapter } from '../adapters/questionnaire-adapter';
4
+ import type { IntentAdapter } from '../adapters/intent-adapter';
5
+ export interface StageSignalCollectorOptions {
6
+ analyticsAdapter?: AnalyticsAdapter;
7
+ questionnaireAdapter?: QuestionnaireAdapter;
8
+ intentAdapter?: IntentAdapter;
11
9
  }
12
- interface StageSignalCollectorResult {
13
- axes: LifecycleAxes;
14
- metrics: LifecycleMetricSnapshot;
15
- signals: LifecycleSignal[];
16
- questionnaireAnswers?: Record<string, unknown>;
10
+ export interface StageSignalCollectorResult {
11
+ axes: LifecycleAxes;
12
+ metrics: LifecycleMetricSnapshot;
13
+ signals: LifecycleSignal[];
14
+ questionnaireAnswers?: Record<string, unknown>;
17
15
  }
18
- declare class StageSignalCollector {
19
- private readonly options;
20
- constructor(options: StageSignalCollectorOptions);
21
- collect(input?: LifecycleAssessmentInput): Promise<StageSignalCollectorResult>;
16
+ export declare class StageSignalCollector {
17
+ private readonly options;
18
+ constructor(options: StageSignalCollectorOptions);
19
+ collect(input?: LifecycleAssessmentInput): Promise<StageSignalCollectorResult>;
22
20
  }
23
- //#endregion
24
- export { StageSignalCollector, StageSignalCollectorOptions, StageSignalCollectorResult };
25
21
  //# sourceMappingURL=signal-collector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signal-collector.d.ts","names":[],"sources":["../../src/collectors/signal-collector.ts"],"mappings":";;;;;;UAqBiB,2BAAA;EACf,gBAAA,GAAmB,gBAAA;EACnB,oBAAA,GAAuB,oBAAA;EACvB,aAAA,GAAgB,aAAA;AAAA;AAAA,UAGD,0BAAA;EACf,IAAA,EAAM,aAAA;EACN,OAAA,EAAS,uBAAA;EACT,OAAA,EAAS,eAAA;EACT,oBAAA,GAAuB,MAAA;AAAA;AAAA,cAGZ,oBAAA;EAAA,iBACM,OAAA;cAEL,OAAA,EAAS,2BAAA;EAIf,OAAA,CACJ,KAAA,GAAO,wBAAA,GACN,OAAA,CAAQ,0BAAA;AAAA"}
1
+ {"version":3,"file":"signal-collector.d.ts","sourceRoot":"","sources":["../../src/collectors/signal-collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,aAAa,EACb,uBAAuB,EACvB,eAAe,EAChB,MAAM,6BAA6B,CAAC;AAMrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAQhE,MAAM,WAAW,2BAA2B;IAC1C,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,uBAAuB,CAAC;IACjC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChD;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;gBAE1C,OAAO,EAAE,2BAA2B;IAI1C,OAAO,CACX,KAAK,GAAE,wBAA6B,GACnC,OAAO,CAAC,0BAA0B,CAAC;CA6CvC"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { AnalyticsAdapter, AnalyticsAdapterResult } from "./adapters/analytics-adapter.js";
2
- import { QuestionnaireAdapter, QuestionnaireAdapterResult } from "./adapters/questionnaire-adapter.js";
3
- import { IntentAdapter, IntentAdapterResult } from "./adapters/intent-adapter.js";
4
- import { StageSignalCollector, StageSignalCollectorOptions, StageSignalCollectorResult } from "./collectors/signal-collector.js";
5
- import { StageScoreInput, StageScorer } from "./scoring/stage-scorer.js";
6
- import { LifecycleMilestonePlanner } from "./planning/milestone-planner.js";
7
- import { LifecycleOrchestrator, LifecycleOrchestratorOptions } from "./orchestrator/lifecycle-orchestrator.js";
8
- export { AnalyticsAdapter, AnalyticsAdapterResult, IntentAdapter, IntentAdapterResult, LifecycleMilestonePlanner, LifecycleOrchestrator, LifecycleOrchestratorOptions, QuestionnaireAdapter, QuestionnaireAdapterResult, StageScoreInput, StageScorer, StageSignalCollector, StageSignalCollectorOptions, StageSignalCollectorResult };
1
+ export * from './collectors/signal-collector';
2
+ export * from './adapters/analytics-adapter';
3
+ export * from './adapters/questionnaire-adapter';
4
+ export * from './adapters/intent-adapter';
5
+ export * from './scoring/stage-scorer';
6
+ export * from './orchestrator/lifecycle-orchestrator';
7
+ export * from './planning/milestone-planner';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC"}