{
  "schemaVersion": 1,
  "sensitiveFieldsExcluded": true,
  "generatedAt": "1970-01-01T00:00:00.000Z",
  "packageName": "@happyvertical/smrt-features",
  "packageVersion": "0.51.10",
  "sourceManifestPath": "dist/manifest.json",
  "agentDocPath": "AGENTS.md",
  "sourceHashes": {
    "manifest": "a5b890207a742d596c9b136b2dc6951fabf9b37a6f3b5751655324db38864137",
    "packageJson": "0718b97ec922d2599a43c933b143270daeb422e5392775a4212d6110b5886262",
    "agents": "0d14be2150e562d6834a67a6fd2a5d8bf63a1654e1f5a5165d1c97c2057574a8"
  },
  "exports": [
    ".",
    "./manifest",
    "./manifest.json"
  ],
  "dependencies": {
    "@happyvertical/smrt-core": "workspace:*",
    "@happyvertical/smrt-cli": "workspace:*",
    "@happyvertical/smrt-users": "workspace:*",
    "@happyvertical/smrt-vitest": "workspace:*",
    "@types/node": "24.13.2",
    "typescript": "5.9.3",
    "vite": "8.1.4",
    "vitest": "4.1.10"
  },
  "smrtDependencies": [
    "@happyvertical/smrt-cli",
    "@happyvertical/smrt-core",
    "@happyvertical/smrt-users",
    "@happyvertical/smrt-vitest"
  ],
  "sdkDependencies": [],
  "tags": [
    "cross-package",
    "feature-flags",
    "feature-toggles",
    "multi-tenant",
    "rollout",
    "smrt"
  ],
  "risks": [
    "sensitive-fields-excluded"
  ],
  "objects": [
    {
      "name": "FeatureDefinition",
      "qualifiedName": "@happyvertical/smrt-features:FeatureDefinition",
      "collection": "featuredefinitions",
      "tableName": "_smrt_feature_definitions",
      "packageName": "@happyvertical/smrt-features",
      "extends": "SmrtObject",
      "fields": [
        {
          "name": "featureKey",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "packageName",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "qualifiedClassName",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "className",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "localId",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "defaultEnabled",
          "type": "boolean",
          "required": false,
          "columnType": "BOOLEAN",
          "default": false
        },
        {
          "name": "label",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "description",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "metadata",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "visibility",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "public"
        }
      ],
      "relationships": [],
      "methods": [
        "getMetadata",
        "setMetadata"
      ],
      "methodSignatures": [
        {
          "name": "getMetadata",
          "returns": "FeatureMetadata"
        },
        {
          "name": "setMetadata",
          "params": [
            "metadata: FeatureMetadata | null"
          ],
          "returns": "void"
        }
      ],
      "conflictColumns": [
        "feature_key"
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "featuredefinitions.list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-features:FeatureDefinition",
          "path": "/featuredefinitions",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "featuredefinitions.get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-features:FeatureDefinition",
          "path": "/featuredefinitions/[id]",
          "method": "GET"
        },
        {
          "kind": "cli",
          "name": "featuredefinition_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-features:FeatureDefinition"
        },
        {
          "kind": "cli",
          "name": "featuredefinition_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-features:FeatureDefinition"
        },
        {
          "kind": "mcp",
          "name": "featuredefinition_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-features:FeatureDefinition"
        },
        {
          "kind": "mcp",
          "name": "featuredefinition_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-features:FeatureDefinition"
        }
      ],
      "withheldSurfaces": [
        {
          "kind": "api",
          "operation": "getMetadata",
          "code": "not-included",
          "reason": "not listed in api.include",
          "objectName": "@happyvertical/smrt-features:FeatureDefinition"
        },
        {
          "kind": "api",
          "operation": "setMetadata",
          "code": "not-included",
          "reason": "not listed in api.include",
          "objectName": "@happyvertical/smrt-features:FeatureDefinition"
        }
      ],
      "relationshipFeatures": [
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "FeatureDefinitionCollection",
      "qualifiedName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
      "collection": "featuredefinitions",
      "tableName": "_smrt_feature_definitions",
      "packageName": "@happyvertical/smrt-features",
      "extends": "SmrtCollection",
      "fields": [],
      "relationships": [],
      "methods": [
        "findByFeatureKey",
        "findByPackageName",
        "upsertDefinition"
      ],
      "methodSignatures": [
        {
          "name": "findByFeatureKey",
          "async": true,
          "params": [
            "featureKey: string"
          ],
          "returns": "Promise<FeatureDefinition | null>"
        },
        {
          "name": "findByPackageName",
          "async": true,
          "params": [
            "packageName: string"
          ],
          "returns": "Promise<FeatureDefinition[]>"
        },
        {
          "name": "upsertDefinition",
          "async": true,
          "params": [
            "seed: FeatureDefinitionSeed"
          ],
          "returns": "Promise<object>"
        }
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "featuredefinitions.findByFeatureKey",
          "operation": "findByFeatureKey",
          "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
          "path": "/featuredefinitions/findByFeatureKey",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "featuredefinitions.findByPackageName",
          "operation": "findByPackageName",
          "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
          "path": "/featuredefinitions/findByPackageName",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "featuredefinitions.upsertDefinition",
          "operation": "upsertDefinition",
          "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
          "path": "/featuredefinitions/upsertDefinition",
          "method": "POST"
        },
        {
          "kind": "cli",
          "name": "featuredefinitioncollection_findByFeatureKey",
          "operation": "findByFeatureKey",
          "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
        },
        {
          "kind": "cli",
          "name": "featuredefinitioncollection_findByPackageName",
          "operation": "findByPackageName",
          "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
        },
        {
          "kind": "cli",
          "name": "featuredefinitioncollection_upsertDefinition",
          "operation": "upsertDefinition",
          "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
        },
        {
          "kind": "mcp",
          "name": "featuredefinitioncollection_findbyfeaturekey",
          "operation": "findByFeatureKey",
          "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
        },
        {
          "kind": "mcp",
          "name": "featuredefinitioncollection_findbypackagename",
          "operation": "findByPackageName",
          "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
        },
        {
          "kind": "mcp",
          "name": "featuredefinitioncollection_upsertdefinition",
          "operation": "upsertDefinition",
          "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
        }
      ],
      "relationshipFeatures": [
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "FeatureOverride",
      "qualifiedName": "@happyvertical/smrt-features:FeatureOverride",
      "collection": "featureoverrides",
      "tableName": "_smrt_feature_overrides",
      "packageName": "@happyvertical/smrt-features",
      "extends": "SmrtObject",
      "fields": [
        {
          "name": "featureKey",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": ""
        },
        {
          "name": "scopeType",
          "type": "text",
          "required": false,
          "columnType": "TEXT",
          "default": "global"
        },
        {
          "name": "scopeId",
          "type": "text",
          "required": false,
          "columnType": "TEXT"
        },
        {
          "name": "effect",
          "type": "text",
          "required": false,
          "columnType": "TEXT"
        }
      ],
      "relationships": [],
      "methods": [
        "isDisabled",
        "isEnabled",
        "isInherit"
      ],
      "methodSignatures": [
        {
          "name": "isDisabled",
          "returns": "boolean"
        },
        {
          "name": "isEnabled",
          "returns": "boolean"
        },
        {
          "name": "isInherit",
          "returns": "boolean"
        }
      ],
      "conflictColumns": [
        "feature_key",
        "scope_type",
        "scope_id"
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "featureoverrides.list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-features:FeatureOverride",
          "path": "/featureoverrides",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "featureoverrides.get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-features:FeatureOverride",
          "path": "/featureoverrides/[id]",
          "method": "GET"
        },
        {
          "kind": "api",
          "name": "featureoverrides.create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-features:FeatureOverride",
          "path": "/featureoverrides",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "featureoverrides.update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-features:FeatureOverride",
          "path": "/featureoverrides/[id]",
          "method": "PATCH"
        },
        {
          "kind": "api",
          "name": "featureoverrides.delete",
          "operation": "delete",
          "objectName": "@happyvertical/smrt-features:FeatureOverride",
          "path": "/featureoverrides/[id]",
          "method": "DELETE"
        },
        {
          "kind": "cli",
          "name": "featureoverride_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-features:FeatureOverride"
        },
        {
          "kind": "cli",
          "name": "featureoverride_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-features:FeatureOverride"
        },
        {
          "kind": "cli",
          "name": "featureoverride_create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-features:FeatureOverride"
        },
        {
          "kind": "cli",
          "name": "featureoverride_update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-features:FeatureOverride"
        },
        {
          "kind": "cli",
          "name": "featureoverride_delete",
          "operation": "delete",
          "objectName": "@happyvertical/smrt-features:FeatureOverride"
        },
        {
          "kind": "mcp",
          "name": "featureoverride_list",
          "operation": "list",
          "objectName": "@happyvertical/smrt-features:FeatureOverride"
        },
        {
          "kind": "mcp",
          "name": "featureoverride_get",
          "operation": "get",
          "objectName": "@happyvertical/smrt-features:FeatureOverride"
        },
        {
          "kind": "mcp",
          "name": "featureoverride_create",
          "operation": "create",
          "objectName": "@happyvertical/smrt-features:FeatureOverride"
        },
        {
          "kind": "mcp",
          "name": "featureoverride_update",
          "operation": "update",
          "objectName": "@happyvertical/smrt-features:FeatureOverride"
        },
        {
          "kind": "mcp",
          "name": "featureoverride_delete",
          "operation": "delete",
          "objectName": "@happyvertical/smrt-features:FeatureOverride"
        }
      ],
      "withheldSurfaces": [
        {
          "kind": "api",
          "operation": "isDisabled",
          "code": "not-included",
          "reason": "not listed in api.include",
          "objectName": "@happyvertical/smrt-features:FeatureOverride"
        },
        {
          "kind": "api",
          "operation": "isEnabled",
          "code": "not-included",
          "reason": "not listed in api.include",
          "objectName": "@happyvertical/smrt-features:FeatureOverride"
        },
        {
          "kind": "api",
          "operation": "isInherit",
          "code": "not-included",
          "reason": "not listed in api.include",
          "objectName": "@happyvertical/smrt-features:FeatureOverride"
        }
      ],
      "relationshipFeatures": [
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    },
    {
      "name": "FeatureOverrideCollection",
      "qualifiedName": "@happyvertical/smrt-features:FeatureOverrideCollection",
      "collection": "featureoverrides",
      "tableName": "_smrt_feature_overrides",
      "packageName": "@happyvertical/smrt-features",
      "extends": "SmrtCollection",
      "fields": [],
      "relationships": [],
      "methods": [
        "findByFeatureAndScope",
        "findByFeatureKey",
        "getGlobalOverride",
        "getOverrideMap",
        "getTenantOverride",
        "removeOverride",
        "setGlobalOverride",
        "setOverride",
        "setTenantOverride"
      ],
      "methodSignatures": [
        {
          "name": "findByFeatureAndScope",
          "async": true,
          "params": [
            "featureKey: string",
            "scopeType: FeatureScopeType",
            "scopeId: string"
          ],
          "returns": "Promise<FeatureOverride | null>"
        },
        {
          "name": "findByFeatureKey",
          "async": true,
          "params": [
            "featureKey: string"
          ],
          "returns": "Promise<FeatureOverride[]>"
        },
        {
          "name": "getGlobalOverride",
          "async": true,
          "params": [
            "featureKey: string"
          ],
          "returns": "Promise<FeatureOverride | null>"
        },
        {
          "name": "getOverrideMap",
          "async": true,
          "params": [
            "featureKey: string",
            "scopeType: FeatureScopeType",
            "scopeIds: string[]"
          ],
          "returns": "Promise<Map<string, FeatureOverride>>"
        },
        {
          "name": "getTenantOverride",
          "async": true,
          "params": [
            "featureKey: string",
            "tenantId: string"
          ],
          "returns": "Promise<FeatureOverride | null>"
        },
        {
          "name": "removeOverride",
          "async": true,
          "params": [
            "featureKey: string",
            "scopeType: FeatureScopeType",
            "scopeId: string"
          ],
          "returns": "Promise<boolean>"
        },
        {
          "name": "setGlobalOverride",
          "async": true,
          "params": [
            "featureKey: string",
            "effect: FeatureOverrideEffect"
          ],
          "returns": "Promise<FeatureOverride>"
        },
        {
          "name": "setOverride",
          "async": true,
          "params": [
            "featureKey: string",
            "scopeType: FeatureScopeType",
            "scopeId: string",
            "effect: FeatureOverrideEffect"
          ],
          "returns": "Promise<FeatureOverride>"
        },
        {
          "name": "setTenantOverride",
          "async": true,
          "params": [
            "featureKey: string",
            "tenantId: string",
            "effect: FeatureOverrideEffect"
          ],
          "returns": "Promise<FeatureOverride>"
        }
      ],
      "surfaces": [
        {
          "kind": "api",
          "name": "featureoverrides.findByFeatureKey",
          "operation": "findByFeatureKey",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
          "path": "/featureoverrides/findByFeatureKey",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "featureoverrides.findByFeatureAndScope",
          "operation": "findByFeatureAndScope",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
          "path": "/featureoverrides/findByFeatureAndScope",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "featureoverrides.getGlobalOverride",
          "operation": "getGlobalOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
          "path": "/featureoverrides/getGlobalOverride",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "featureoverrides.getTenantOverride",
          "operation": "getTenantOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
          "path": "/featureoverrides/getTenantOverride",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "featureoverrides.getOverrideMap",
          "operation": "getOverrideMap",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
          "path": "/featureoverrides/getOverrideMap",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "featureoverrides.setOverride",
          "operation": "setOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
          "path": "/featureoverrides/setOverride",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "featureoverrides.setGlobalOverride",
          "operation": "setGlobalOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
          "path": "/featureoverrides/setGlobalOverride",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "featureoverrides.setTenantOverride",
          "operation": "setTenantOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
          "path": "/featureoverrides/setTenantOverride",
          "method": "POST"
        },
        {
          "kind": "api",
          "name": "featureoverrides.removeOverride",
          "operation": "removeOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
          "path": "/featureoverrides/removeOverride",
          "method": "POST"
        },
        {
          "kind": "cli",
          "name": "featureoverridecollection_findByFeatureKey",
          "operation": "findByFeatureKey",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "cli",
          "name": "featureoverridecollection_findByFeatureAndScope",
          "operation": "findByFeatureAndScope",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "cli",
          "name": "featureoverridecollection_getGlobalOverride",
          "operation": "getGlobalOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "cli",
          "name": "featureoverridecollection_getTenantOverride",
          "operation": "getTenantOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "cli",
          "name": "featureoverridecollection_getOverrideMap",
          "operation": "getOverrideMap",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "cli",
          "name": "featureoverridecollection_setOverride",
          "operation": "setOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "cli",
          "name": "featureoverridecollection_setGlobalOverride",
          "operation": "setGlobalOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "cli",
          "name": "featureoverridecollection_setTenantOverride",
          "operation": "setTenantOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "cli",
          "name": "featureoverridecollection_removeOverride",
          "operation": "removeOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "mcp",
          "name": "featureoverridecollection_findbyfeaturekey",
          "operation": "findByFeatureKey",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "mcp",
          "name": "featureoverridecollection_findbyfeatureandscope",
          "operation": "findByFeatureAndScope",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "mcp",
          "name": "featureoverridecollection_getglobaloverride",
          "operation": "getGlobalOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "mcp",
          "name": "featureoverridecollection_gettenantoverride",
          "operation": "getTenantOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "mcp",
          "name": "featureoverridecollection_getoverridemap",
          "operation": "getOverrideMap",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "mcp",
          "name": "featureoverridecollection_setoverride",
          "operation": "setOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "mcp",
          "name": "featureoverridecollection_setglobaloverride",
          "operation": "setGlobalOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "mcp",
          "name": "featureoverridecollection_settenantoverride",
          "operation": "setTenantOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        },
        {
          "kind": "mcp",
          "name": "featureoverridecollection_removeoverride",
          "operation": "removeOverride",
          "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
        }
      ],
      "relationshipFeatures": [
        "uuidColumns"
      ],
      "tags": [],
      "risks": []
    }
  ],
  "surfaces": [
    {
      "kind": "api",
      "name": "featuredefinitions.list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-features:FeatureDefinition",
      "path": "/featuredefinitions",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "featuredefinitions.get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-features:FeatureDefinition",
      "path": "/featuredefinitions/[id]",
      "method": "GET"
    },
    {
      "kind": "cli",
      "name": "featuredefinition_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-features:FeatureDefinition"
    },
    {
      "kind": "cli",
      "name": "featuredefinition_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-features:FeatureDefinition"
    },
    {
      "kind": "mcp",
      "name": "featuredefinition_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-features:FeatureDefinition"
    },
    {
      "kind": "mcp",
      "name": "featuredefinition_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-features:FeatureDefinition"
    },
    {
      "kind": "api",
      "name": "featuredefinitions.findByFeatureKey",
      "operation": "findByFeatureKey",
      "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
      "path": "/featuredefinitions/findByFeatureKey",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "featuredefinitions.findByPackageName",
      "operation": "findByPackageName",
      "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
      "path": "/featuredefinitions/findByPackageName",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "featuredefinitions.upsertDefinition",
      "operation": "upsertDefinition",
      "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
      "path": "/featuredefinitions/upsertDefinition",
      "method": "POST"
    },
    {
      "kind": "cli",
      "name": "featuredefinitioncollection_findByFeatureKey",
      "operation": "findByFeatureKey",
      "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
    },
    {
      "kind": "cli",
      "name": "featuredefinitioncollection_findByPackageName",
      "operation": "findByPackageName",
      "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
    },
    {
      "kind": "cli",
      "name": "featuredefinitioncollection_upsertDefinition",
      "operation": "upsertDefinition",
      "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
    },
    {
      "kind": "mcp",
      "name": "featuredefinitioncollection_findbyfeaturekey",
      "operation": "findByFeatureKey",
      "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
    },
    {
      "kind": "mcp",
      "name": "featuredefinitioncollection_findbypackagename",
      "operation": "findByPackageName",
      "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
    },
    {
      "kind": "mcp",
      "name": "featuredefinitioncollection_upsertdefinition",
      "operation": "upsertDefinition",
      "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
    },
    {
      "kind": "api",
      "name": "featureoverrides.list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-features:FeatureOverride",
      "path": "/featureoverrides",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "featureoverrides.get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-features:FeatureOverride",
      "path": "/featureoverrides/[id]",
      "method": "GET"
    },
    {
      "kind": "api",
      "name": "featureoverrides.create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-features:FeatureOverride",
      "path": "/featureoverrides",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "featureoverrides.update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-features:FeatureOverride",
      "path": "/featureoverrides/[id]",
      "method": "PATCH"
    },
    {
      "kind": "api",
      "name": "featureoverrides.delete",
      "operation": "delete",
      "objectName": "@happyvertical/smrt-features:FeatureOverride",
      "path": "/featureoverrides/[id]",
      "method": "DELETE"
    },
    {
      "kind": "cli",
      "name": "featureoverride_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-features:FeatureOverride"
    },
    {
      "kind": "cli",
      "name": "featureoverride_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-features:FeatureOverride"
    },
    {
      "kind": "cli",
      "name": "featureoverride_create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-features:FeatureOverride"
    },
    {
      "kind": "cli",
      "name": "featureoverride_update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-features:FeatureOverride"
    },
    {
      "kind": "cli",
      "name": "featureoverride_delete",
      "operation": "delete",
      "objectName": "@happyvertical/smrt-features:FeatureOverride"
    },
    {
      "kind": "mcp",
      "name": "featureoverride_list",
      "operation": "list",
      "objectName": "@happyvertical/smrt-features:FeatureOverride"
    },
    {
      "kind": "mcp",
      "name": "featureoverride_get",
      "operation": "get",
      "objectName": "@happyvertical/smrt-features:FeatureOverride"
    },
    {
      "kind": "mcp",
      "name": "featureoverride_create",
      "operation": "create",
      "objectName": "@happyvertical/smrt-features:FeatureOverride"
    },
    {
      "kind": "mcp",
      "name": "featureoverride_update",
      "operation": "update",
      "objectName": "@happyvertical/smrt-features:FeatureOverride"
    },
    {
      "kind": "mcp",
      "name": "featureoverride_delete",
      "operation": "delete",
      "objectName": "@happyvertical/smrt-features:FeatureOverride"
    },
    {
      "kind": "api",
      "name": "featureoverrides.findByFeatureKey",
      "operation": "findByFeatureKey",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
      "path": "/featureoverrides/findByFeatureKey",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "featureoverrides.findByFeatureAndScope",
      "operation": "findByFeatureAndScope",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
      "path": "/featureoverrides/findByFeatureAndScope",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "featureoverrides.getGlobalOverride",
      "operation": "getGlobalOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
      "path": "/featureoverrides/getGlobalOverride",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "featureoverrides.getTenantOverride",
      "operation": "getTenantOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
      "path": "/featureoverrides/getTenantOverride",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "featureoverrides.getOverrideMap",
      "operation": "getOverrideMap",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
      "path": "/featureoverrides/getOverrideMap",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "featureoverrides.setOverride",
      "operation": "setOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
      "path": "/featureoverrides/setOverride",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "featureoverrides.setGlobalOverride",
      "operation": "setGlobalOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
      "path": "/featureoverrides/setGlobalOverride",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "featureoverrides.setTenantOverride",
      "operation": "setTenantOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
      "path": "/featureoverrides/setTenantOverride",
      "method": "POST"
    },
    {
      "kind": "api",
      "name": "featureoverrides.removeOverride",
      "operation": "removeOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
      "path": "/featureoverrides/removeOverride",
      "method": "POST"
    },
    {
      "kind": "cli",
      "name": "featureoverridecollection_findByFeatureKey",
      "operation": "findByFeatureKey",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "cli",
      "name": "featureoverridecollection_findByFeatureAndScope",
      "operation": "findByFeatureAndScope",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "cli",
      "name": "featureoverridecollection_getGlobalOverride",
      "operation": "getGlobalOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "cli",
      "name": "featureoverridecollection_getTenantOverride",
      "operation": "getTenantOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "cli",
      "name": "featureoverridecollection_getOverrideMap",
      "operation": "getOverrideMap",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "cli",
      "name": "featureoverridecollection_setOverride",
      "operation": "setOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "cli",
      "name": "featureoverridecollection_setGlobalOverride",
      "operation": "setGlobalOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "cli",
      "name": "featureoverridecollection_setTenantOverride",
      "operation": "setTenantOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "cli",
      "name": "featureoverridecollection_removeOverride",
      "operation": "removeOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "mcp",
      "name": "featureoverridecollection_findbyfeaturekey",
      "operation": "findByFeatureKey",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "mcp",
      "name": "featureoverridecollection_findbyfeatureandscope",
      "operation": "findByFeatureAndScope",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "mcp",
      "name": "featureoverridecollection_getglobaloverride",
      "operation": "getGlobalOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "mcp",
      "name": "featureoverridecollection_gettenantoverride",
      "operation": "getTenantOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "mcp",
      "name": "featureoverridecollection_getoverridemap",
      "operation": "getOverrideMap",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "mcp",
      "name": "featureoverridecollection_setoverride",
      "operation": "setOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "mcp",
      "name": "featureoverridecollection_setglobaloverride",
      "operation": "setGlobalOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "mcp",
      "name": "featureoverridecollection_settenantoverride",
      "operation": "setTenantOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    },
    {
      "kind": "mcp",
      "name": "featureoverridecollection_removeoverride",
      "operation": "removeOverride",
      "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
    }
  ],
  "prompts": [],
  "relationshipsV2": {
    "foreignKeyFields": 0,
    "crossPackageRefFields": 0,
    "junctionCollections": 0,
    "hierarchicalObjects": 0,
    "polymorphicAssociations": 0,
    "uuidColumns": 4
  },
  "agentDoc": "# smrt-features\n\nCode-first feature flag system with global, app-level, and tenant-hierarchy resolution.\n\n## Core pieces\n\n- `FeatureDefinition` (`_smrt_feature_definitions` table) — code-owned definition mirrored to DB at registration\n- `FeatureOverride` (`_smrt_feature_overrides` table) — runtime override state, scoped by `(featureKey, scopeType, scopeId)`\n- `FeatureResolver` — resolves the effective state of a feature in a given context, walking the scope chain\n- `FeatureSyncService` — keeps `_smrt_feature_definitions` in sync with code-registered defaults at boot\n\n## Resolution chain (priority high → low)\n\n1. User scope (`scopeType: 'user'`) — when context includes a userId\n2. Tenant scope (`scopeType: 'tenant'`) — walks up the tenant hierarchy when a `FeatureTenantHierarchyProvider` is configured (DI); otherwise resolves a flat tenant scope\n3. Global scope (`scopeType: 'global'`, `scopeId: GLOBAL_FEATURE_SCOPE_ID`)\n4. Definition default (registered in code)\n\n## Conventions\n\n- Feature keys should be namespaced by package or domain, e.g. `commerce.invoice.draft-mode`, `content.editor.ai-suggestions`\n- Definitions are code-owned. Don't write `FeatureDefinition` rows directly — use `FeatureSyncService.syncDefinitions()` at startup with the manifest of expected features\n- Overrides are write-time validated against the matching definition (effect must be a known `FeatureOverrideEffect`, scope must be valid for the definition's `allowedScopes`)\n- Tenant-hierarchy resolution is an optional integration wired by dependency injection (`FeatureTenantHierarchyProvider`), not a static dependency — `smrt-features` never imports `@happyvertical/smrt-users`. Without a configured provider, tenant-hierarchy resolution falls back to a flat tenant scope. (The consumer that wants hierarchy installs `smrt-users` itself and supplies the provider; `smrt-users` is a dev-only dependency here for tests.)\n\n## Integration with `@happyvertical/smrt-users`\n\nWhen `smrt-users` is present, `FeatureResolver` uses it to walk the tenant hierarchy (parent → grandparent → root). Configure via `FeatureTenantHierarchyProvider`. Without it, tenant lookup is single-level.\n"
}