@contractspec/lib.feature-flags 1.46.2 → 1.48.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 (28) hide show
  1. package/dist/contracts/src/capabilities/capabilities.d.ts +17 -2
  2. package/dist/contracts/src/capabilities/capabilities.d.ts.map +1 -1
  3. package/dist/contracts/src/capabilities/index.d.ts +1 -1
  4. package/dist/contracts/src/docs/index.d.ts +1 -1
  5. package/dist/contracts/src/examples/registry.d.ts +1 -1
  6. package/dist/contracts/src/index.d.ts +1 -1
  7. package/dist/contracts/src/integrations/openbanking/openbanking.feature.d.ts +1 -1
  8. package/dist/contracts/src/integrations/providers/elevenlabs.d.ts +2 -1
  9. package/dist/contracts/src/integrations/providers/gcs-storage.d.ts +2 -1
  10. package/dist/contracts/src/integrations/providers/gmail.d.ts +2 -1
  11. package/dist/contracts/src/integrations/providers/google-calendar.d.ts +2 -1
  12. package/dist/contracts/src/integrations/providers/mistral.d.ts +2 -1
  13. package/dist/contracts/src/integrations/providers/postmark.d.ts +2 -1
  14. package/dist/contracts/src/integrations/providers/powens.d.ts +2 -1
  15. package/dist/contracts/src/integrations/providers/qdrant.d.ts +2 -1
  16. package/dist/contracts/src/integrations/providers/stripe.d.ts +2 -1
  17. package/dist/contracts/src/integrations/providers/twilio-sms.d.ts +2 -1
  18. package/dist/entities/index.js.map +1 -1
  19. package/dist/feature-flags.capability.d.ts +9 -0
  20. package/dist/feature-flags.capability.d.ts.map +1 -0
  21. package/dist/feature-flags.capability.js +25 -0
  22. package/dist/feature-flags.capability.js.map +1 -0
  23. package/dist/feature-flags.feature.d.ts +0 -1
  24. package/dist/feature-flags.feature.d.ts.map +1 -1
  25. package/dist/feature-flags.feature.js +9 -2
  26. package/dist/feature-flags.feature.js.map +1 -1
  27. package/package.json +7 -8
  28. /package/dist/contracts/src/docs/tech/{templates/runtime.docblock.d.ts → contracts/README.docblock.d.ts} +0 -0
@@ -1,7 +1,17 @@
1
- import "../ownership.js";
1
+ import { OwnerShipMeta } from "../ownership.js";
2
2
 
3
3
  //#region ../contracts/src/capabilities/capabilities.d.ts
4
4
  type CapabilityKind = 'api' | 'event' | 'data' | 'ui' | 'integration';
5
+ type CapabilitySurface = 'operation' | 'event' | 'workflow' | 'presentation' | 'resource';
6
+ interface CapabilitySurfaceRef {
7
+ surface: CapabilitySurface;
8
+ key: string;
9
+ version: string;
10
+ description?: string;
11
+ }
12
+ interface CapabilityMeta extends OwnerShipMeta {
13
+ kind: CapabilityKind;
14
+ }
5
15
  interface CapabilityRequirement {
6
16
  key: string;
7
17
  version?: string;
@@ -13,6 +23,11 @@ interface CapabilityRef {
13
23
  key: string;
14
24
  version: string;
15
25
  }
26
+ interface CapabilitySpec {
27
+ meta: CapabilityMeta;
28
+ provides?: CapabilitySurfaceRef[];
29
+ requires?: CapabilityRequirement[];
30
+ }
16
31
  //#endregion
17
- export { CapabilityKind, CapabilityRef, CapabilityRequirement };
32
+ export { CapabilityKind, CapabilityMeta, CapabilityRef, CapabilityRequirement, CapabilitySpec, CapabilitySurface, CapabilitySurfaceRef };
18
33
  //# sourceMappingURL=capabilities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","names":[],"sources":["../../../../../contracts/src/capabilities/capabilities.ts"],"sourcesContent":[],"mappings":";;;KAGY,cAAA;UAoBK,qBAAA;;;SAGR;;;;UAKQ,aAAA"}
1
+ {"version":3,"file":"capabilities.d.ts","names":[],"sources":["../../../../../contracts/src/capabilities/capabilities.ts"],"sourcesContent":[],"mappings":";;;KAGY,cAAA;KAEA,iBAAA;AAFA,UASK,oBAAA,CATS;EAEd,OAAA,EAQD,iBARkB;EAOZ,GAAA,EAAA,MAAA;EAOA,OAAA,EAAA,MAAA;EAIA,WAAA,CAAA,EAAA,MAAA;AAQjB;AAKiB,UAjBA,cAAA,SAAuB,aAiBT,CAAA;EACvB,IAAA,EAjBA,cAiBA;;AAEK,UAhBI,qBAAA,CAgBJ;EAAqB,GAAA,EAAA,MAAA;;SAbzB;;;;UAKQ,aAAA;;;;UAKA,cAAA;QACT;aACK;aACA"}
@@ -1,2 +1,2 @@
1
- import { CapabilityKind, CapabilityRef, CapabilityRequirement } from "./capabilities.js";
1
+ import { CapabilityKind, CapabilityMeta, CapabilityRef, CapabilityRequirement, CapabilitySpec, CapabilitySurface, CapabilitySurfaceRef } from "./capabilities.js";
2
2
  import "./openbanking.js";
@@ -5,11 +5,11 @@ import "./tech/lifecycle-stage-system.docblock.js";
5
5
  import "./tech/presentation-runtime.docblock.js";
6
6
  import "./tech/auth/better-auth-nextjs.docblock.js";
7
7
  import "./tech/schema/README.docblock.js";
8
- import "./tech/templates/runtime.docblock.js";
9
8
  import "../workflow/overview.docblock.js";
10
9
  import "./tech/mcp-endpoints.docblock.js";
11
10
  import "./tech/vscode-extension.docblock.js";
12
11
  import "./tech/telemetry-ingest.docblock.js";
12
+ import "./tech/contracts/README.docblock.js";
13
13
  import "./tech/contracts/openapi-export.docblock.js";
14
14
  import "./tech/contracts/openapi-import.docblock.js";
15
15
  import "../workspace-config/workspace-config.docblock.js";
@@ -1,2 +1,2 @@
1
- import "../registry-utils.js";
1
+ import "../registry.js";
2
2
  import "./types.js";
@@ -6,7 +6,7 @@ import { Owner, OwnerShipMeta, OwnersEnum, Stability, StabilityEnum, Tag, TagsEn
6
6
  import "./registry-utils.js";
7
7
  import { PolicyRef } from "./policy/spec.js";
8
8
  import "./telemetry/index.js";
9
- import { CapabilityKind, CapabilityRef, CapabilityRequirement } from "./capabilities/capabilities.js";
9
+ import { CapabilityKind, CapabilityMeta, CapabilityRef, CapabilityRequirement, CapabilitySpec, CapabilitySurface, CapabilitySurfaceRef } from "./capabilities/capabilities.js";
10
10
  import "./capabilities/index.js";
11
11
  import { ExperimentRef } from "./experiments/spec.js";
12
12
  import { ResourceRefDescriptor } from "./resources.js";
@@ -1 +1 @@
1
- import "../../features/index.js";
1
+ import "../../index.js";
@@ -1 +1,2 @@
1
- import "../spec.js";
1
+ import "../spec.js";
2
+ import "../index.js";
@@ -1 +1,2 @@
1
- import "../spec.js";
1
+ import "../spec.js";
2
+ import "../index.js";
@@ -1 +1,2 @@
1
- import "../spec.js";
1
+ import "../spec.js";
2
+ import "../index.js";
@@ -1 +1,2 @@
1
- import "../spec.js";
1
+ import "../spec.js";
2
+ import "../index.js";
@@ -1 +1,2 @@
1
- import "../spec.js";
1
+ import "../spec.js";
2
+ import "../index.js";
@@ -1 +1,2 @@
1
- import "../spec.js";
1
+ import "../spec.js";
2
+ import "../index.js";
@@ -1 +1,2 @@
1
- import "../spec.js";
1
+ import "../spec.js";
2
+ import "../index.js";
@@ -1 +1,2 @@
1
- import "../spec.js";
1
+ import "../spec.js";
2
+ import "../index.js";
@@ -1 +1,2 @@
1
- import "../spec.js";
1
+ import "../spec.js";
2
+ import "../index.js";
@@ -1 +1,2 @@
1
- import "../spec.js";
1
+ import "../spec.js";
2
+ import "../index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["featureFlagsSchemaContribution: ModuleSchemaContribution"],"sources":["../../src/entities/index.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/lib.schema';\nimport type { ModuleSchemaContribution } from '@contractspec/lib.schema';\n\n/**\n * Feature flag status enum.\n */\nexport const FlagStatusEnum = defineEntityEnum({\n name: 'FlagStatus',\n values: ['OFF', 'ON', 'GRADUAL'] as const,\n schema: 'lssm_feature_flags',\n description: 'Status of a feature flag.',\n});\n\n/**\n * Targeting rule operator enum.\n */\nexport const RuleOperatorEnum = defineEntityEnum({\n name: 'RuleOperator',\n values: [\n 'EQ',\n 'NEQ',\n 'IN',\n 'NIN',\n 'CONTAINS',\n 'NOT_CONTAINS',\n 'GT',\n 'GTE',\n 'LT',\n 'LTE',\n 'PERCENTAGE',\n ] as const,\n schema: 'lssm_feature_flags',\n description: 'Operator for targeting rule conditions.',\n});\n\n/**\n * Experiment status enum.\n */\nexport const ExperimentStatusEnum = defineEntityEnum({\n name: 'ExperimentStatus',\n values: ['DRAFT', 'RUNNING', 'PAUSED', 'COMPLETED', 'CANCELLED'] as const,\n schema: 'lssm_feature_flags',\n description: 'Status of an experiment.',\n});\n\n/**\n * FeatureFlag entity - defines a feature flag.\n */\nexport const FeatureFlagEntity = defineEntity({\n name: 'FeatureFlag',\n description: 'A feature flag for controlling feature availability.',\n schema: 'lssm_feature_flags',\n map: 'feature_flag',\n fields: {\n id: field.id({ description: 'Unique flag identifier' }),\n key: field.string({\n isUnique: true,\n description: 'Flag key (e.g., new_dashboard)',\n }),\n name: field.string({ description: 'Human-readable name' }),\n description: field.string({\n isOptional: true,\n description: 'Description of the flag',\n }),\n\n // Status and default value\n status: field.enum('FlagStatus', {\n default: 'OFF',\n description: 'Flag status',\n }),\n defaultValue: field.boolean({\n default: false,\n description: 'Default value when no rules match',\n }),\n\n // Multivariate support\n variants: field.json({\n isOptional: true,\n description: 'Variant definitions for multivariate flags',\n }),\n\n // Scope\n orgId: field.string({\n isOptional: true,\n description: 'Organization scope (null = global)',\n }),\n\n // Metadata\n tags: field.json({\n isOptional: true,\n description: 'Tags for categorization',\n }),\n metadata: field.json({\n isOptional: true,\n description: 'Additional metadata',\n }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n targetingRules: field.hasMany('FlagTargetingRule'),\n experiments: field.hasMany('Experiment'),\n evaluations: field.hasMany('FlagEvaluation'),\n },\n indexes: [index.on(['orgId', 'key']), index.on(['status'])],\n enums: [FlagStatusEnum],\n});\n\n/**\n * FlagTargetingRule entity - conditions for targeting.\n */\nexport const FlagTargetingRuleEntity = defineEntity({\n name: 'FlagTargetingRule',\n description: 'A targeting rule for conditional flag evaluation.',\n schema: 'lssm_feature_flags',\n map: 'flag_targeting_rule',\n fields: {\n id: field.id({ description: 'Unique rule identifier' }),\n flagId: field.foreignKey({ description: 'Parent feature flag' }),\n\n // Rule definition\n name: field.string({\n isOptional: true,\n description: 'Rule name for debugging',\n }),\n priority: field.int({\n default: 0,\n description: 'Rule priority (lower = higher priority)',\n }),\n enabled: field.boolean({\n default: true,\n description: 'Whether rule is active',\n }),\n\n // Condition\n attribute: field.string({\n description: 'Target attribute (userId, orgId, plan, segment, etc.)',\n }),\n operator: field.enum('RuleOperator', {\n description: 'Comparison operator',\n }),\n value: field.json({ description: 'Target value(s)' }),\n\n // Result\n rolloutPercentage: field.int({\n isOptional: true,\n description: 'Percentage for gradual rollout (0-100)',\n }),\n serveValue: field.boolean({\n isOptional: true,\n description: 'Boolean value to serve',\n }),\n serveVariant: field.string({\n isOptional: true,\n description: 'Variant key to serve (for multivariate)',\n }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n flag: field.belongsTo('FeatureFlag', ['flagId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [index.on(['flagId', 'priority']), index.on(['attribute'])],\n enums: [RuleOperatorEnum],\n});\n\n/**\n * Experiment entity - A/B test configuration.\n */\nexport const ExperimentEntity = defineEntity({\n name: 'Experiment',\n description: 'An A/B test experiment.',\n schema: 'lssm_feature_flags',\n map: 'experiment',\n fields: {\n id: field.id({ description: 'Unique experiment identifier' }),\n key: field.string({ isUnique: true, description: 'Experiment key' }),\n name: field.string({ description: 'Human-readable name' }),\n description: field.string({\n isOptional: true,\n description: 'Experiment description',\n }),\n hypothesis: field.string({\n isOptional: true,\n description: 'Experiment hypothesis',\n }),\n\n // Associated flag\n flagId: field.foreignKey({ description: 'Associated feature flag' }),\n\n // Configuration\n status: field.enum('ExperimentStatus', {\n default: 'DRAFT',\n description: 'Experiment status',\n }),\n variants: field.json({\n description: 'Variant definitions with split ratios',\n }),\n metrics: field.json({ isOptional: true, description: 'Metrics to track' }),\n\n // Targeting\n audiencePercentage: field.int({\n default: 100,\n description: 'Percentage of audience to include',\n }),\n audienceFilter: field.json({\n isOptional: true,\n description: 'Audience filter criteria',\n }),\n\n // Timeline\n scheduledStartAt: field.dateTime({\n isOptional: true,\n description: 'Scheduled start time',\n }),\n scheduledEndAt: field.dateTime({\n isOptional: true,\n description: 'Scheduled end time',\n }),\n startedAt: field.dateTime({\n isOptional: true,\n description: 'Actual start time',\n }),\n endedAt: field.dateTime({\n isOptional: true,\n description: 'Actual end time',\n }),\n\n // Results\n winningVariant: field.string({\n isOptional: true,\n description: 'Declared winning variant',\n }),\n results: field.json({\n isOptional: true,\n description: 'Experiment results summary',\n }),\n\n // Scope\n orgId: field.string({\n isOptional: true,\n description: 'Organization scope',\n }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n flag: field.belongsTo('FeatureFlag', ['flagId'], ['id'], {\n onDelete: 'Cascade',\n }),\n assignments: field.hasMany('ExperimentAssignment'),\n },\n indexes: [\n index.on(['status']),\n index.on(['orgId', 'status']),\n index.on(['flagId']),\n ],\n enums: [ExperimentStatusEnum],\n});\n\n/**\n * ExperimentAssignment entity - tracks which variant a subject is assigned to.\n */\nexport const ExperimentAssignmentEntity = defineEntity({\n name: 'ExperimentAssignment',\n description: 'Tracks experiment variant assignments.',\n schema: 'lssm_feature_flags',\n map: 'experiment_assignment',\n fields: {\n id: field.id({ description: 'Unique assignment identifier' }),\n experimentId: field.foreignKey({ description: 'Parent experiment' }),\n\n // Subject\n subjectType: field.string({\n description: 'Subject type (user, org, session)',\n }),\n subjectId: field.string({ description: 'Subject identifier' }),\n\n // Assignment\n variant: field.string({ description: 'Assigned variant key' }),\n bucket: field.int({ description: 'Hash bucket (0-99)' }),\n\n // Context\n context: field.json({\n isOptional: true,\n description: 'Context at assignment time',\n }),\n\n // Timestamps\n assignedAt: field.dateTime({ description: 'Assignment timestamp' }),\n\n // Relations\n experiment: field.belongsTo('Experiment', ['experimentId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.unique(['experimentId', 'subjectType', 'subjectId'], {\n name: 'experiment_assignment_unique',\n }),\n index.on(['subjectType', 'subjectId']),\n ],\n});\n\n/**\n * FlagEvaluation entity - evaluation log for analytics.\n */\nexport const FlagEvaluationEntity = defineEntity({\n name: 'FlagEvaluation',\n description: 'Log of flag evaluations for debugging and analytics.',\n schema: 'lssm_feature_flags',\n map: 'flag_evaluation',\n fields: {\n id: field.id({ description: 'Unique evaluation identifier' }),\n flagId: field.foreignKey({ description: 'Evaluated flag' }),\n flagKey: field.string({\n description: 'Flag key (denormalized for queries)',\n }),\n\n // Subject\n subjectType: field.string({\n description: 'Subject type (user, org, anonymous)',\n }),\n subjectId: field.string({ description: 'Subject identifier' }),\n\n // Result\n result: field.boolean({ description: 'Evaluation result' }),\n variant: field.string({\n isOptional: true,\n description: 'Served variant (for multivariate)',\n }),\n\n // Match info\n matchedRuleId: field.string({\n isOptional: true,\n description: 'Rule that matched (if any)',\n }),\n reason: field.string({\n description: 'Evaluation reason (default, rule, experiment, etc.)',\n }),\n\n // Context\n context: field.json({\n isOptional: true,\n description: 'Evaluation context',\n }),\n\n // Timestamps\n evaluatedAt: field.dateTime({ description: 'Evaluation timestamp' }),\n\n // Relations\n flag: field.belongsTo('FeatureFlag', ['flagId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.on(['flagKey', 'evaluatedAt']),\n index.on(['subjectType', 'subjectId', 'evaluatedAt']),\n index.on(['flagId', 'evaluatedAt']),\n ],\n});\n\n/**\n * All feature flag entities for schema composition.\n */\nexport const featureFlagEntities = [\n FeatureFlagEntity,\n FlagTargetingRuleEntity,\n ExperimentEntity,\n ExperimentAssignmentEntity,\n FlagEvaluationEntity,\n];\n\n/**\n * Module schema contribution for feature flags.\n */\nexport const featureFlagsSchemaContribution: ModuleSchemaContribution = {\n moduleId: '@contractspec/lib.feature-flags',\n entities: featureFlagEntities,\n enums: [FlagStatusEnum, RuleOperatorEnum, ExperimentStatusEnum],\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/entities/index.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/lib.schema';\nimport type { ModuleSchemaContribution } from '@contractspec/lib.schema';\n\n/**\n * Feature flag status enum.\n */\nexport const FlagStatusEnum = defineEntityEnum({\n name: 'FlagStatus',\n values: ['OFF', 'ON', 'GRADUAL'] as const,\n schema: 'lssm_feature_flags',\n description: 'Status of a feature flag.',\n});\n\n/**\n * Targeting rule operator enum.\n */\nexport const RuleOperatorEnum = defineEntityEnum({\n name: 'RuleOperator',\n values: [\n 'EQ',\n 'NEQ',\n 'IN',\n 'NIN',\n 'CONTAINS',\n 'NOT_CONTAINS',\n 'GT',\n 'GTE',\n 'LT',\n 'LTE',\n 'PERCENTAGE',\n ] as const,\n schema: 'lssm_feature_flags',\n description: 'Operator for targeting rule conditions.',\n});\n\n/**\n * Experiment status enum.\n */\nexport const ExperimentStatusEnum = defineEntityEnum({\n name: 'ExperimentStatus',\n values: ['DRAFT', 'RUNNING', 'PAUSED', 'COMPLETED', 'CANCELLED'] as const,\n schema: 'lssm_feature_flags',\n description: 'Status of an experiment.',\n});\n\n/**\n * FeatureFlag entity - defines a feature flag.\n */\nexport const FeatureFlagEntity = defineEntity({\n name: 'FeatureFlag',\n description: 'A feature flag for controlling feature availability.',\n schema: 'lssm_feature_flags',\n map: 'feature_flag',\n fields: {\n id: field.id({ description: 'Unique flag identifier' }),\n key: field.string({\n isUnique: true,\n description: 'Flag key (e.g., new_dashboard)',\n }),\n name: field.string({ description: 'Human-readable name' }),\n description: field.string({\n isOptional: true,\n description: 'Description of the flag',\n }),\n\n // Status and default value\n status: field.enum('FlagStatus', {\n default: 'OFF',\n description: 'Flag status',\n }),\n defaultValue: field.boolean({\n default: false,\n description: 'Default value when no rules match',\n }),\n\n // Multivariate support\n variants: field.json({\n isOptional: true,\n description: 'Variant definitions for multivariate flags',\n }),\n\n // Scope\n orgId: field.string({\n isOptional: true,\n description: 'Organization scope (null = global)',\n }),\n\n // Metadata\n tags: field.json({\n isOptional: true,\n description: 'Tags for categorization',\n }),\n metadata: field.json({\n isOptional: true,\n description: 'Additional metadata',\n }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n targetingRules: field.hasMany('FlagTargetingRule'),\n experiments: field.hasMany('Experiment'),\n evaluations: field.hasMany('FlagEvaluation'),\n },\n indexes: [index.on(['orgId', 'key']), index.on(['status'])],\n enums: [FlagStatusEnum],\n});\n\n/**\n * FlagTargetingRule entity - conditions for targeting.\n */\nexport const FlagTargetingRuleEntity = defineEntity({\n name: 'FlagTargetingRule',\n description: 'A targeting rule for conditional flag evaluation.',\n schema: 'lssm_feature_flags',\n map: 'flag_targeting_rule',\n fields: {\n id: field.id({ description: 'Unique rule identifier' }),\n flagId: field.foreignKey({ description: 'Parent feature flag' }),\n\n // Rule definition\n name: field.string({\n isOptional: true,\n description: 'Rule name for debugging',\n }),\n priority: field.int({\n default: 0,\n description: 'Rule priority (lower = higher priority)',\n }),\n enabled: field.boolean({\n default: true,\n description: 'Whether rule is active',\n }),\n\n // Condition\n attribute: field.string({\n description: 'Target attribute (userId, orgId, plan, segment, etc.)',\n }),\n operator: field.enum('RuleOperator', {\n description: 'Comparison operator',\n }),\n value: field.json({ description: 'Target value(s)' }),\n\n // Result\n rolloutPercentage: field.int({\n isOptional: true,\n description: 'Percentage for gradual rollout (0-100)',\n }),\n serveValue: field.boolean({\n isOptional: true,\n description: 'Boolean value to serve',\n }),\n serveVariant: field.string({\n isOptional: true,\n description: 'Variant key to serve (for multivariate)',\n }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n flag: field.belongsTo('FeatureFlag', ['flagId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [index.on(['flagId', 'priority']), index.on(['attribute'])],\n enums: [RuleOperatorEnum],\n});\n\n/**\n * Experiment entity - A/B test configuration.\n */\nexport const ExperimentEntity = defineEntity({\n name: 'Experiment',\n description: 'An A/B test experiment.',\n schema: 'lssm_feature_flags',\n map: 'experiment',\n fields: {\n id: field.id({ description: 'Unique experiment identifier' }),\n key: field.string({ isUnique: true, description: 'Experiment key' }),\n name: field.string({ description: 'Human-readable name' }),\n description: field.string({\n isOptional: true,\n description: 'Experiment description',\n }),\n hypothesis: field.string({\n isOptional: true,\n description: 'Experiment hypothesis',\n }),\n\n // Associated flag\n flagId: field.foreignKey({ description: 'Associated feature flag' }),\n\n // Configuration\n status: field.enum('ExperimentStatus', {\n default: 'DRAFT',\n description: 'Experiment status',\n }),\n variants: field.json({\n description: 'Variant definitions with split ratios',\n }),\n metrics: field.json({ isOptional: true, description: 'Metrics to track' }),\n\n // Targeting\n audiencePercentage: field.int({\n default: 100,\n description: 'Percentage of audience to include',\n }),\n audienceFilter: field.json({\n isOptional: true,\n description: 'Audience filter criteria',\n }),\n\n // Timeline\n scheduledStartAt: field.dateTime({\n isOptional: true,\n description: 'Scheduled start time',\n }),\n scheduledEndAt: field.dateTime({\n isOptional: true,\n description: 'Scheduled end time',\n }),\n startedAt: field.dateTime({\n isOptional: true,\n description: 'Actual start time',\n }),\n endedAt: field.dateTime({\n isOptional: true,\n description: 'Actual end time',\n }),\n\n // Results\n winningVariant: field.string({\n isOptional: true,\n description: 'Declared winning variant',\n }),\n results: field.json({\n isOptional: true,\n description: 'Experiment results summary',\n }),\n\n // Scope\n orgId: field.string({\n isOptional: true,\n description: 'Organization scope',\n }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n\n // Relations\n flag: field.belongsTo('FeatureFlag', ['flagId'], ['id'], {\n onDelete: 'Cascade',\n }),\n assignments: field.hasMany('ExperimentAssignment'),\n },\n indexes: [\n index.on(['status']),\n index.on(['orgId', 'status']),\n index.on(['flagId']),\n ],\n enums: [ExperimentStatusEnum],\n});\n\n/**\n * ExperimentAssignment entity - tracks which variant a subject is assigned to.\n */\nexport const ExperimentAssignmentEntity = defineEntity({\n name: 'ExperimentAssignment',\n description: 'Tracks experiment variant assignments.',\n schema: 'lssm_feature_flags',\n map: 'experiment_assignment',\n fields: {\n id: field.id({ description: 'Unique assignment identifier' }),\n experimentId: field.foreignKey({ description: 'Parent experiment' }),\n\n // Subject\n subjectType: field.string({\n description: 'Subject type (user, org, session)',\n }),\n subjectId: field.string({ description: 'Subject identifier' }),\n\n // Assignment\n variant: field.string({ description: 'Assigned variant key' }),\n bucket: field.int({ description: 'Hash bucket (0-99)' }),\n\n // Context\n context: field.json({\n isOptional: true,\n description: 'Context at assignment time',\n }),\n\n // Timestamps\n assignedAt: field.dateTime({ description: 'Assignment timestamp' }),\n\n // Relations\n experiment: field.belongsTo('Experiment', ['experimentId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.unique(['experimentId', 'subjectType', 'subjectId'], {\n name: 'experiment_assignment_unique',\n }),\n index.on(['subjectType', 'subjectId']),\n ],\n});\n\n/**\n * FlagEvaluation entity - evaluation log for analytics.\n */\nexport const FlagEvaluationEntity = defineEntity({\n name: 'FlagEvaluation',\n description: 'Log of flag evaluations for debugging and analytics.',\n schema: 'lssm_feature_flags',\n map: 'flag_evaluation',\n fields: {\n id: field.id({ description: 'Unique evaluation identifier' }),\n flagId: field.foreignKey({ description: 'Evaluated flag' }),\n flagKey: field.string({\n description: 'Flag key (denormalized for queries)',\n }),\n\n // Subject\n subjectType: field.string({\n description: 'Subject type (user, org, anonymous)',\n }),\n subjectId: field.string({ description: 'Subject identifier' }),\n\n // Result\n result: field.boolean({ description: 'Evaluation result' }),\n variant: field.string({\n isOptional: true,\n description: 'Served variant (for multivariate)',\n }),\n\n // Match info\n matchedRuleId: field.string({\n isOptional: true,\n description: 'Rule that matched (if any)',\n }),\n reason: field.string({\n description: 'Evaluation reason (default, rule, experiment, etc.)',\n }),\n\n // Context\n context: field.json({\n isOptional: true,\n description: 'Evaluation context',\n }),\n\n // Timestamps\n evaluatedAt: field.dateTime({ description: 'Evaluation timestamp' }),\n\n // Relations\n flag: field.belongsTo('FeatureFlag', ['flagId'], ['id'], {\n onDelete: 'Cascade',\n }),\n },\n indexes: [\n index.on(['flagKey', 'evaluatedAt']),\n index.on(['subjectType', 'subjectId', 'evaluatedAt']),\n index.on(['flagId', 'evaluatedAt']),\n ],\n});\n\n/**\n * All feature flag entities for schema composition.\n */\nexport const featureFlagEntities = [\n FeatureFlagEntity,\n FlagTargetingRuleEntity,\n ExperimentEntity,\n ExperimentAssignmentEntity,\n FlagEvaluationEntity,\n];\n\n/**\n * Module schema contribution for feature flags.\n */\nexport const featureFlagsSchemaContribution: ModuleSchemaContribution = {\n moduleId: '@contractspec/lib.feature-flags',\n entities: featureFlagEntities,\n enums: [FlagStatusEnum, RuleOperatorEnum, ExperimentStatusEnum],\n};\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { CapabilitySpec } from "./contracts/src/capabilities/capabilities.js";
2
+ import "./contracts/src/index.js";
3
+
4
+ //#region src/feature-flags.capability.d.ts
5
+ declare const FeatureFlagsCapability: CapabilitySpec;
6
+ declare const ExperimentsCapability: CapabilitySpec;
7
+ //#endregion
8
+ export { ExperimentsCapability, FeatureFlagsCapability };
9
+ //# sourceMappingURL=feature-flags.capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flags.capability.d.ts","names":[],"sources":["../src/feature-flags.capability.ts"],"sourcesContent":[],"mappings":";;;;cAEa,wBAUX;cAEW,uBAUX"}
@@ -0,0 +1,25 @@
1
+ import { StabilityEnum, defineCapability } from "@contractspec/lib.contracts";
2
+
3
+ //#region src/feature-flags.capability.ts
4
+ const FeatureFlagsCapability = defineCapability({ meta: {
5
+ key: "feature-flags",
6
+ version: "1.0.0",
7
+ kind: "api",
8
+ stability: StabilityEnum.Experimental,
9
+ description: "Feature flag management and evaluation",
10
+ owners: ["@platform.featureflags"],
11
+ tags: ["feature-flags", "configuration"]
12
+ } });
13
+ const ExperimentsCapability = defineCapability({ meta: {
14
+ key: "experiments",
15
+ version: "1.0.0",
16
+ kind: "api",
17
+ stability: StabilityEnum.Experimental,
18
+ description: "A/B testing and experimentation platform",
19
+ owners: ["@platform.featureflags"],
20
+ tags: ["experiments", "ab-testing"]
21
+ } });
22
+
23
+ //#endregion
24
+ export { ExperimentsCapability, FeatureFlagsCapability };
25
+ //# sourceMappingURL=feature-flags.capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flags.capability.js","names":[],"sources":["../src/feature-flags.capability.ts"],"sourcesContent":["import { defineCapability, StabilityEnum } from '@contractspec/lib.contracts';\n\nexport const FeatureFlagsCapability = defineCapability({\n meta: {\n key: 'feature-flags',\n version: '1.0.0',\n kind: 'api',\n stability: StabilityEnum.Experimental,\n description: 'Feature flag management and evaluation',\n owners: ['@platform.featureflags'],\n tags: ['feature-flags', 'configuration'],\n },\n});\n\nexport const ExperimentsCapability = defineCapability({\n meta: {\n key: 'experiments',\n version: '1.0.0',\n kind: 'api',\n stability: StabilityEnum.Experimental,\n description: 'A/B testing and experimentation platform',\n owners: ['@platform.featureflags'],\n tags: ['experiments', 'ab-testing'],\n },\n});\n"],"mappings":";;;AAEA,MAAa,yBAAyB,iBAAiB,EACrD,MAAM;CACJ,KAAK;CACL,SAAS;CACT,MAAM;CACN,WAAW,cAAc;CACzB,aAAa;CACb,QAAQ,CAAC,yBAAyB;CAClC,MAAM,CAAC,iBAAiB,gBAAgB;CACzC,EACF,CAAC;AAEF,MAAa,wBAAwB,iBAAiB,EACpD,MAAM;CACJ,KAAK;CACL,SAAS;CACT,MAAM;CACN,WAAW,cAAc;CACzB,aAAa;CACb,QAAQ,CAAC,yBAAyB;CAClC,MAAM,CAAC,eAAe,aAAa;CACpC,EACF,CAAC"}
@@ -2,7 +2,6 @@ import { FeatureModuleSpec } from "./contracts/src/features/types.js";
2
2
  import "./contracts/src/index.js";
3
3
 
4
4
  //#region src/feature-flags.feature.d.ts
5
-
6
5
  /**
7
6
  * Feature Flags feature module that bundles flag management,
8
7
  * targeting rules, and A/B experiment capabilities.
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags.feature.d.ts","names":[],"sources":["../src/feature-flags.feature.ts"],"sourcesContent":[],"mappings":";;;;;;;;;cAWa,qBAAqB"}
1
+ {"version":3,"file":"feature-flags.feature.d.ts","names":[],"sources":["../src/feature-flags.feature.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAWa,cAAA,mBAoEX,EAAA,iBAAA"}
@@ -1,9 +1,16 @@
1
+ import { defineFeature } from "@contractspec/lib.contracts";
2
+
1
3
  //#region src/feature-flags.feature.ts
2
4
  /**
5
+ * Feature Flags Feature Module Specification
6
+ *
7
+ * Defines the feature module for feature flag and experiment management.
8
+ */
9
+ /**
3
10
  * Feature Flags feature module that bundles flag management,
4
11
  * targeting rules, and A/B experiment capabilities.
5
12
  */
6
- const FeatureFlagsFeature = {
13
+ const FeatureFlagsFeature = defineFeature({
7
14
  meta: {
8
15
  key: "feature-flags",
9
16
  version: "1.0.0",
@@ -134,7 +141,7 @@ const FeatureFlagsFeature = {
134
141
  version: "1.0.0"
135
142
  }]
136
143
  }
137
- };
144
+ });
138
145
 
139
146
  //#endregion
140
147
  export { FeatureFlagsFeature };
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags.feature.js","names":["FeatureFlagsFeature: FeatureModuleSpec"],"sources":["../src/feature-flags.feature.ts"],"sourcesContent":["/**\n * Feature Flags Feature Module Specification\n *\n * Defines the feature module for feature flag and experiment management.\n */\nimport type { FeatureModuleSpec } from '@contractspec/lib.contracts';\n\n/**\n * Feature Flags feature module that bundles flag management,\n * targeting rules, and A/B experiment capabilities.\n */\nexport const FeatureFlagsFeature: FeatureModuleSpec = {\n meta: {\n key: 'feature-flags',\n version: '1.0.0',\n title: 'Feature Flags',\n description:\n 'Feature flag management with targeting rules and A/B experiments',\n domain: 'platform',\n owners: ['@platform.feature-flags'],\n tags: ['feature-flags', 'experiments', 'targeting'],\n stability: 'stable',\n },\n\n // All contract operations included in this feature\n operations: [\n // Flag CRUD operations\n { key: 'flag.create', version: '1.0.0' },\n { key: 'flag.update', version: '1.0.0' },\n { key: 'flag.delete', version: '1.0.0' },\n { key: 'flag.toggle', version: '1.0.0' },\n { key: 'flag.get', version: '1.0.0' },\n { key: 'flag.list', version: '1.0.0' },\n { key: 'flag.evaluate', version: '1.0.0' },\n\n // Targeting rule operations\n { key: 'flag.rule.create', version: '1.0.0' },\n { key: 'flag.rule.delete', version: '1.0.0' },\n\n // Experiment operations\n { key: 'experiment.create', version: '1.0.0' },\n { key: 'experiment.start', version: '1.0.0' },\n { key: 'experiment.stop', version: '1.0.0' },\n { key: 'experiment.get', version: '1.0.0' },\n ],\n\n // Events emitted by this feature\n events: [\n // Flag events\n { key: 'flag.created', version: '1.0.0' },\n { key: 'flag.updated', version: '1.0.0' },\n { key: 'flag.deleted', version: '1.0.0' },\n { key: 'flag.toggled', version: '1.0.0' },\n { key: 'flag.evaluated', version: '1.0.0' },\n\n // Rule events\n { key: 'flag.rule_created', version: '1.0.0' },\n { key: 'flag.rule_deleted', version: '1.0.0' },\n\n // Experiment events\n { key: 'experiment.created', version: '1.0.0' },\n { key: 'experiment.started', version: '1.0.0' },\n { key: 'experiment.stopped', version: '1.0.0' },\n { key: 'experiment.variant_assigned', version: '1.0.0' },\n ],\n\n // No presentations for this library feature\n presentations: [],\n opToPresentation: [],\n presentationsTargets: [],\n\n // Capability definitions\n capabilities: {\n provides: [\n { key: 'feature-flags', version: '1.0.0' },\n { key: 'experiments', version: '1.0.0' },\n ],\n requires: [{ key: 'identity', version: '1.0.0' }],\n },\n};\n"],"mappings":";;;;;AAWA,MAAaA,sBAAyC;CACpD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,OAAO;EACP,aACE;EACF,QAAQ;EACR,QAAQ,CAAC,0BAA0B;EACnC,MAAM;GAAC;GAAiB;GAAe;GAAY;EACnD,WAAW;EACZ;CAGD,YAAY;EAEV;GAAE,KAAK;GAAe,SAAS;GAAS;EACxC;GAAE,KAAK;GAAe,SAAS;GAAS;EACxC;GAAE,KAAK;GAAe,SAAS;GAAS;EACxC;GAAE,KAAK;GAAe,SAAS;GAAS;EACxC;GAAE,KAAK;GAAY,SAAS;GAAS;EACrC;GAAE,KAAK;GAAa,SAAS;GAAS;EACtC;GAAE,KAAK;GAAiB,SAAS;GAAS;EAG1C;GAAE,KAAK;GAAoB,SAAS;GAAS;EAC7C;GAAE,KAAK;GAAoB,SAAS;GAAS;EAG7C;GAAE,KAAK;GAAqB,SAAS;GAAS;EAC9C;GAAE,KAAK;GAAoB,SAAS;GAAS;EAC7C;GAAE,KAAK;GAAmB,SAAS;GAAS;EAC5C;GAAE,KAAK;GAAkB,SAAS;GAAS;EAC5C;CAGD,QAAQ;EAEN;GAAE,KAAK;GAAgB,SAAS;GAAS;EACzC;GAAE,KAAK;GAAgB,SAAS;GAAS;EACzC;GAAE,KAAK;GAAgB,SAAS;GAAS;EACzC;GAAE,KAAK;GAAgB,SAAS;GAAS;EACzC;GAAE,KAAK;GAAkB,SAAS;GAAS;EAG3C;GAAE,KAAK;GAAqB,SAAS;GAAS;EAC9C;GAAE,KAAK;GAAqB,SAAS;GAAS;EAG9C;GAAE,KAAK;GAAsB,SAAS;GAAS;EAC/C;GAAE,KAAK;GAAsB,SAAS;GAAS;EAC/C;GAAE,KAAK;GAAsB,SAAS;GAAS;EAC/C;GAAE,KAAK;GAA+B,SAAS;GAAS;EACzD;CAGD,eAAe,EAAE;CACjB,kBAAkB,EAAE;CACpB,sBAAsB,EAAE;CAGxB,cAAc;EACZ,UAAU,CACR;GAAE,KAAK;GAAiB,SAAS;GAAS,EAC1C;GAAE,KAAK;GAAe,SAAS;GAAS,CACzC;EACD,UAAU,CAAC;GAAE,KAAK;GAAY,SAAS;GAAS,CAAC;EAClD;CACF"}
1
+ {"version":3,"file":"feature-flags.feature.js","names":[],"sources":["../src/feature-flags.feature.ts"],"sourcesContent":["/**\n * Feature Flags Feature Module Specification\n *\n * Defines the feature module for feature flag and experiment management.\n */\nimport { defineFeature } from '@contractspec/lib.contracts';\n\n/**\n * Feature Flags feature module that bundles flag management,\n * targeting rules, and A/B experiment capabilities.\n */\nexport const FeatureFlagsFeature = defineFeature({\n meta: {\n key: 'feature-flags',\n version: '1.0.0',\n title: 'Feature Flags',\n description:\n 'Feature flag management with targeting rules and A/B experiments',\n domain: 'platform',\n owners: ['@platform.feature-flags'],\n tags: ['feature-flags', 'experiments', 'targeting'],\n stability: 'stable',\n },\n\n // All contract operations included in this feature\n operations: [\n // Flag CRUD operations\n { key: 'flag.create', version: '1.0.0' },\n { key: 'flag.update', version: '1.0.0' },\n { key: 'flag.delete', version: '1.0.0' },\n { key: 'flag.toggle', version: '1.0.0' },\n { key: 'flag.get', version: '1.0.0' },\n { key: 'flag.list', version: '1.0.0' },\n { key: 'flag.evaluate', version: '1.0.0' },\n\n // Targeting rule operations\n { key: 'flag.rule.create', version: '1.0.0' },\n { key: 'flag.rule.delete', version: '1.0.0' },\n\n // Experiment operations\n { key: 'experiment.create', version: '1.0.0' },\n { key: 'experiment.start', version: '1.0.0' },\n { key: 'experiment.stop', version: '1.0.0' },\n { key: 'experiment.get', version: '1.0.0' },\n ],\n\n // Events emitted by this feature\n events: [\n // Flag events\n { key: 'flag.created', version: '1.0.0' },\n { key: 'flag.updated', version: '1.0.0' },\n { key: 'flag.deleted', version: '1.0.0' },\n { key: 'flag.toggled', version: '1.0.0' },\n { key: 'flag.evaluated', version: '1.0.0' },\n\n // Rule events\n { key: 'flag.rule_created', version: '1.0.0' },\n { key: 'flag.rule_deleted', version: '1.0.0' },\n\n // Experiment events\n { key: 'experiment.created', version: '1.0.0' },\n { key: 'experiment.started', version: '1.0.0' },\n { key: 'experiment.stopped', version: '1.0.0' },\n { key: 'experiment.variant_assigned', version: '1.0.0' },\n ],\n\n // No presentations for this library feature\n presentations: [],\n opToPresentation: [],\n presentationsTargets: [],\n\n // Capability definitions\n capabilities: {\n provides: [\n { key: 'feature-flags', version: '1.0.0' },\n { key: 'experiments', version: '1.0.0' },\n ],\n requires: [{ key: 'identity', version: '1.0.0' }],\n },\n});\n"],"mappings":";;;;;;;;;;;;AAWA,MAAa,sBAAsB,cAAc;CAC/C,MAAM;EACJ,KAAK;EACL,SAAS;EACT,OAAO;EACP,aACE;EACF,QAAQ;EACR,QAAQ,CAAC,0BAA0B;EACnC,MAAM;GAAC;GAAiB;GAAe;GAAY;EACnD,WAAW;EACZ;CAGD,YAAY;EAEV;GAAE,KAAK;GAAe,SAAS;GAAS;EACxC;GAAE,KAAK;GAAe,SAAS;GAAS;EACxC;GAAE,KAAK;GAAe,SAAS;GAAS;EACxC;GAAE,KAAK;GAAe,SAAS;GAAS;EACxC;GAAE,KAAK;GAAY,SAAS;GAAS;EACrC;GAAE,KAAK;GAAa,SAAS;GAAS;EACtC;GAAE,KAAK;GAAiB,SAAS;GAAS;EAG1C;GAAE,KAAK;GAAoB,SAAS;GAAS;EAC7C;GAAE,KAAK;GAAoB,SAAS;GAAS;EAG7C;GAAE,KAAK;GAAqB,SAAS;GAAS;EAC9C;GAAE,KAAK;GAAoB,SAAS;GAAS;EAC7C;GAAE,KAAK;GAAmB,SAAS;GAAS;EAC5C;GAAE,KAAK;GAAkB,SAAS;GAAS;EAC5C;CAGD,QAAQ;EAEN;GAAE,KAAK;GAAgB,SAAS;GAAS;EACzC;GAAE,KAAK;GAAgB,SAAS;GAAS;EACzC;GAAE,KAAK;GAAgB,SAAS;GAAS;EACzC;GAAE,KAAK;GAAgB,SAAS;GAAS;EACzC;GAAE,KAAK;GAAkB,SAAS;GAAS;EAG3C;GAAE,KAAK;GAAqB,SAAS;GAAS;EAC9C;GAAE,KAAK;GAAqB,SAAS;GAAS;EAG9C;GAAE,KAAK;GAAsB,SAAS;GAAS;EAC/C;GAAE,KAAK;GAAsB,SAAS;GAAS;EAC/C;GAAE,KAAK;GAAsB,SAAS;GAAS;EAC/C;GAAE,KAAK;GAA+B,SAAS;GAAS;EACzD;CAGD,eAAe,EAAE;CACjB,kBAAkB,EAAE;CACpB,sBAAsB,EAAE;CAGxB,cAAc;EACZ,UAAU,CACR;GAAE,KAAK;GAAiB,SAAS;GAAS,EAC1C;GAAE,KAAK;GAAe,SAAS;GAAS,CACzC;EACD,UAAU,CAAC;GAAE,KAAK;GAAY,SAAS;GAAS,CAAC;EAClD;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/lib.feature-flags",
3
- "version": "1.46.2",
3
+ "version": "1.48.0",
4
4
  "description": "Feature flags and experiments module for ContractSpec applications",
5
5
  "keywords": [
6
6
  "contractspec",
@@ -9,7 +9,6 @@
9
9
  "toggles",
10
10
  "typescript"
11
11
  ],
12
- "main": "./dist/index.js",
13
12
  "types": "./dist/index.d.ts",
14
13
  "type": "module",
15
14
  "scripts": {
@@ -25,13 +24,13 @@
25
24
  "lint:check": "eslint src"
26
25
  },
27
26
  "dependencies": {
28
- "@contractspec/lib.schema": "1.46.2",
29
- "@contractspec/lib.contracts": "1.46.2",
30
- "zod": "^4.1.13"
27
+ "@contractspec/lib.schema": "1.48.0",
28
+ "@contractspec/lib.contracts": "1.48.0",
29
+ "zod": "^4.3.5"
31
30
  },
32
31
  "devDependencies": {
33
- "@contractspec/tool.typescript": "1.46.2",
34
- "@contractspec/tool.tsdown": "1.46.2",
32
+ "@contractspec/tool.typescript": "1.48.0",
33
+ "@contractspec/tool.tsdown": "1.48.0",
35
34
  "typescript": "^5.9.3"
36
35
  },
37
36
  "exports": {
@@ -42,10 +41,10 @@
42
41
  "./entities": "./dist/entities/index.js",
43
42
  "./evaluation": "./dist/evaluation/index.js",
44
43
  "./events": "./dist/events.js",
44
+ "./feature-flags.capability": "./dist/feature-flags.capability.js",
45
45
  "./feature-flags.feature": "./dist/feature-flags.feature.js",
46
46
  "./*": "./*"
47
47
  },
48
- "module": "./dist/index.js",
49
48
  "files": [
50
49
  "dist",
51
50
  "README.md"