본문으로 건너뛰기
cccskills
무료GitHub에 공개

add-a-feature

Manage OpenWork feature releases with feature flags, switches that control access to new behavior. Register features before coding, release them by organization and deployment, prepare a global shutdown option, and remove temporary flags after rollout.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

원문원문 설명 보기

Add a new feature, put work behind a feature flag, roll something out (per organization, for everyone, cloud or self-hosted), revert or kill a feature, or make a big change to existing behavior such as a new engine. Use BEFORE writing the feature code, and when finishing or removing a rollout.

연동 도구MySQL
설치 방법 보기

이럴 때 유용합니다

  • Registering a feature before implementation
  • Releasing a feature to selected organizations
  • Separating cloud and self-hosted availability
  • Stopping a feature across a deployment
  • Removing temporary flags after rollout

포함된 파일(1)

  • SKILL.md5.9 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Skill: Add a feature

Every new user-visible feature, and every change existing users would notice, is a feature in the registry, declared before any feature code, off. Nothing big ships ungated.

Registry: packages/features/src/registry.ts (package @openwork/features). That file is the only one you edit to declare a feature. The rules live in resolve.ts and are tested in resolve.test.ts (pnpm --filter @openwork/features test).

The model: one rollout, several dimensions

A feature is rolled out, and reverted, along these dimensions, resolved in this order by one function (resolveFeature) everywhere it is checked:

  1. Deployments: products it exists on (cloud, self_hosted). Fixed in code.
  2. Kill switch: off everywhere at once, outranking everything below. This is the revert; no deploy.
  3. Operator lock: a self-hosted operator forces it on or off for the whole install (Helm config.features.<key>).
  4. Organization override: platform admins turn it on or off for one organization in /admin.
  5. Everyone: on or off for everyone on the deployment, changed in /admin without a deploy.

Steps 2, 4 and 5 are set per deployment in /admin (Features page and each organization's row) or with the admin MCP tools den_list_features, den_set_feature_rollout and den_set_org_capability.

Does this need a feature?

Yes, if any of these is true:

  • People get a new screen, tab, button, tool, route family, worker, or engine.
  • Existing users would notice the change (a flow works differently, something moves or disappears).
  • It should roll out gradually, be revertable, or might not belong on self-hosted installs.

No for bug fixes, copy changes, refactors and internal tooling.

Not a feature either: something that only keeps older clients working (compat shim with a removal condition), something worked out from what is configured (derive it in code), or a setting that changes how something works rather than whether people get it (put it in env.ts / Helm config.<area>).

1. Declare it, off

newThing: {
  label: "New thing",
  description: "What a person gets, in words they see in the product.",
  since: "2026-10",
  deployments: ["cloud", "self_hosted"],
  default: false,
},
  • Key: lowerCamelCase, no consecutive capitals. Permanent: also the Helm key, DEN_FEATURE_NEW_THING, the API field and stored rows.
  • Deployments: leave one out on purpose (e.g. ["cloud"] for a cloud-only feature).
  • default: false for new work. A fresh deployment, and a client that cannot reach Den, uses it, so never ship half-done work as true.
  • permanent: true only when the switch itself is part of the product (e.g. turning Connect off for one organization). Rollouts are temporary.

Then run pnpm features:sync. It regenerates the Helm files and the Den API contract/SDK (feature keys are part of API schemas). It prepares a disposable local database and removes it afterwards; MySQL must be running (pnpm dev:den:mysql). Commit the Helm files, packages/docs/openapi.json, and packages/sdk/src/gen/** together. Do not stop after Helm generation if the contract step fails.

2. Make it safe to turn off at any moment

Before shipping, answer: what happens when the kill switch is used? In-flight work, stored data, and what the person sees must survive a revert. For example, a new engine switches only when nothing is running, falls back on failure, and keeps history readable after a revert.

3. Gate the code

Only through the registry. Never read organization metadata or an environment variable to decide whether a feature is on.

  • den-api, one check: await organizationFeatureEnabled(orgId, "newThing", { userId })
  • den-api, several checks: const features = await getOrganizationFeatures(orgId, { userId })
  • den-api route guard: requireFeature("newThing") after orgMemberRoute(); answers 404 feature_disabled
  • Inside a transaction that must stay consistent: pass { database: tx, lock: "share" }
  • Den web: orgFeatureEnabled(orgContext, "newThing") (from app/(den)/_lib/den-org.ts), backed by GET /v1/org features
  • People without an organization (signed-out desktop): read GET /v1/features; a missing key means off

Gated UI follows DESIGN.md P4: show a locked entry point with a plain reason rather than silently removing it, when the person could act on it.

4. Roll it out

  1. Turn it on for our own organization (override in /admin).
  2. Turn it on for more organizations, one override at a time, checking errors as you go.
  3. Turn it on for everyone in /admin › Features. Organizations can still be turned off one by one.
  4. Anything wrong: Turn off everywhere (kill switch). Fix, restore, continue.
  5. Once it is on everywhere: set default: true, then delete the entry and every check. pnpm features:check asks for a decision six months after since unless the entry is permanent.

Evals turn features on per organization through the admin API: enableOrganizationCapabilities(seed, admin, { newThing: true }) in evals/worlds/dashboards.ts.

Never

  • Add a DEN_*_ENABLED env var for a product surface (CI rejects new ones).
  • Read or write organization.metadata.capabilities (CI rejects it).
  • Hand-write an /admin control, a /v1/org field, or a Helm line for a feature.
  • Ship something on self-hosted by accident: choose deployments on purpose.

In the PR

Name the feature and its deployments under "How is this implemented?", e.g. "Behind newThing (cloud and self-hosted, off), safe to kill: falls back to the old flow." Run pnpm features:check before pushing.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Connect OpenCode browser tools to a locally running OpenWork Electron app to inspect its UI, enter a task, and check the response. This skill supports exploration and debugging through CDP, Chrome's remote control protocol.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Connecting browser tools to a local Electron development app
  • Inspecting screen state during debugging
  • Entering a task in the composer and running it
different-ai/openwork2.4만2026년 10월 18일 업데이트

Check added lines in a change for information identifying customers, prospects, partners, or outside individuals. Report locations and generic remediation without reproducing identities, and escalate cases where the information is already public.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Checking changes for customer and partner identities
  • Reviewing documents and test data for identifying details
  • Reporting disclosure locations without repeating identities
different-ai/openwork2.4만2026년 10월 18일 업데이트

Connects supported AI clients, including Claude Code and Codex, to OpenWork through MCP, a protocol for accessing external tools. It guides account sign-in and verifies that tools for finding and running organization capabilities are available.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Connecting an AI client to OpenWork organization resources
  • Signing in and verifying available MCP tools
  • Switching organizations or troubleshooting authentication
different-ai/openwork2.4만2026년 10월 18일 업데이트

Review an outside contributor’s pull request before running its code. Identify concealed behavior, obfuscated code, risky dependencies, and build hooks, with file locations and specific checks for maintainers to follow up.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Screening an outside contributor’s pull request before execution
  • Checking encoded code and unexplained network calls
  • Reviewing dependency changes and installation scripts
different-ai/openwork2.4만2026년 10월 18일 업데이트

Create an OpenCode plugin for OpenWork with custom tools and hooks, which run code at specific events. The skill builds the plugin file and adds its entry to the project configuration.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Adding custom tools to OpenWork
  • Creating a plugin to save and list notes
  • Running custom code before or after tool execution
different-ai/openwork2.4만2026년 10월 18일 업데이트

daytona

무료

Set up and troubleshoot Daytona sandbox environments, which provide isolated spaces for running applications. The skill covers CLI authentication, persistent desktop and server sandboxes, diagnostic logs, shared secrets storage, snapshot refreshes, and environment deletion.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Troubleshooting Daytona authentication and organization selection
  • Keeping an Electron or server sandbox available for debugging
  • Preparing shared secrets storage for sandboxes
different-ai/openwork2.4만2026년 10월 18일 업데이트

different-ai의 스킬 모두 보기

이 스킬의 문제 신고