Skip to main content

add-feature-flag

Use when: putting a new or existing feature behind a feature flag (dev feature) in OpenCTI, adding attributes, GraphQL endpoints, managers or UI that must be hidden until a flag is enabled, or removing a feature flag

소스 정보

저장소
OpenCTI-Platform/opencti
최근 소스 활동
2026년 10월 8일 16:11
감지된 SKILL.md 언어
영어
스타
10,123
포크
1,478

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
add-feature-flag
description
Use when: putting a new or existing feature behind a feature flag (dev feature) in OpenCTI, adding attributes, GraphQL endpoints, managers or UI that must be hidden until a flag is enabled, or removing a feature flag
# Add a Feature Flag Full rules and rationale: [Feature Flags](../../instructions/backend/patterns/feature-flags.md). ## Prerequisites - **Flag name**: UPPER_SNAKE_CASE string (e.g. `MY_FEATURE`) and its constant (`MY_FEATURE_FEATURE_FLAG`). - **Scope**: list of new attributes / mappings, GraphQL endpoints, domain entry points and UI screens of the feature. ## Procedure ### Step 1 — Declare the constant Add `export const MY_FEATURE_FEATURE_FLAG = 'MY_FEATURE';` with a one-line comment in `opencti-platform/opencti-graphql/src/config/conf.js`, next to the other flags. ### Step 2 — Flag every new attribute definition (DO NOT SKIP) For **each** attribute added by the feature — in a module definition's `attributes`, in `src/modules/attributes/*-registrationAttributes.ts`, or as a new entry in the `mappings` of an object attribute — add: ```ts featureFlag: MY_FEATURE_FEATURE_FLAG, ``` Without it the field is pushed into the ElasticSearch index mapping at startup even when the flag is off, and nothing fails. Re-read every attribute you added before moving on. ### Step 3 — Gate GraphQL endpoints Add `@ff(flags: ["MY_FEATURE"])` to every new query, mutation and field (`softFail: true` for fields read early by the front end). Run `yarn build:schema`. ### Step 4 — Gate domain logic `enforceEnableFeatureFlag(MY_FEATURE_FEATURE_FLAG)` at the start of mutations / entry points; `isFeatureEnabled(MY_FEATURE_FEATURE_FLAG)` for conditional branches. ### Step 5 — Gate managers - **New manager:** import `ManagerDefinition` and `registerManager` from `src/manager/managerModule.ts`. Import the new manager file for side effects in `src/manager/index.ts`, and register it with `if (isFeatureEnabled(MY_FEATURE_FEATURE_FLAG)) { registerManager(DEFINITION); }`. Gate the registration, never `enabled()` / `enabledToStart()`: a registered manager shows in the platform modules and startup logs even when the flag is off. Keep its own `enabledByConfig` config. Do not add it to `src/managers.ts`. - **Existing manager:** leave its registration alone; branch inside the handler with `isFeatureEnabled(MY_FEATURE_FEATURE_FLAG)`. Reference: `src/manager/workflowStatusCleanupManager.ts`. Details in the Managers section of [Feature Flags](../../instructions/backend/patterns/feature-flags.md). ### Step 6 — Gate the UI `const { isFeatureEnable } = useHelper();` then `isFeatureEnable('MY_FEATURE')` around menus, routes, tabs and form fields. Run `yarn relay` if GraphQL changed. ### Step 7 — Verify - `grep -rn "featureFlag: MY_FEATURE_FEATURE_FLAG"` lists **every** new attribute and mapping. - With fresh test indices, start the platform with the flag disabled: new attributes are absent from the index mapping and attribute registry. GraphQL fields remain in the schema, but flagged resolvers reject access (or return the soft-fail default); the new manager is neither logged at startup nor listed in the platform modules. - Start with `APP__ENABLED_DEV_FEATURES='["MY_FEATURE"]'`: the feature works end to end. ## Removing a flag Delete the constant, every `featureFlag: MY_FEATURE_FEATURE_FLAG`, every `@ff(...)` and every `enforceEnableFeatureFlag` / `isFeatureEnabled` / `isFeatureEnable` call for it; unwrap the `if` around `registerManager`. Search for `MY_FEATURE` in `opencti-graphql` and `opencti-front` and verify that no declarations or guards for this flag remain; retain legitimate feature and manager identifiers.
GitHub에서 보기