proto
Read this before designing/writing .proto files. Do not read if you are simply consuming proto.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Read this before designing/writing .proto files. Do not read if you are simply consuming proto.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Use when reading or writing any ShoMetrics log.
Use when changing or reviewing code that crosses major application boundaries such as settings, Property Inspector, actions, runtime sources/helpers, rendering, persistence, validation, generated contracts, IPC, version-skewed helper/plugin APIs, or adapters. Keep boundaries explicit and avoid over-engineered plumbing, option bags, duplicated models, and defensive code for impossible states.
Use when writing, reviewing, or changing code in this repo for language-neutral naming, ownership boundaries, comments/documentation, test structure, exception scope, and avoiding speculative abstractions; pair with language-specific skills such as typescript-coding-style or csharp-coding-style when applicable.
Use when writing, reviewing, or changing C#/.NET code in this repo, especially packages/source-windows Core, Helper, ControlPanel, .csproj, .editorconfig, NativeAOT, nullable, async/threading, and modern C# feature decisions. Pair with coding-style for language-neutral naming, comments, tests, and ownership rules.
Use when changing Sho Metrics Hub internationalization, including Property Inspector user-visible copy, Stream Deck manifest locale JSON, i18n message groups, locale resolution, generated i18n scripts, supported locales, translation wording, or dev locale override behavior.
Use when making or reviewing naming changes in this repo, including function verb choices, domain vocabulary, boundary vocabulary, file/type/export names, stored/resolved/settings field names, renderer contract names, and historical vocabulary cleanup.
| name | proto |
| description | Read this before designing/writing .proto files. Do not read if you are simply consuming proto. |
You are an expert engineer specializing in Node.js, Buf, protobuf-es generated code, and proto3.
Rule source anchors live in references/AIP_RULE_MAPPING.md. Do not read that
mapping by default; use this skill as the source of truth unless the user asks
to audit or revise proto rules.
Terms used below:
oneof arm, registry-owned string ID, or
documented map key. Do not use generic blobs just because the future is fuzzy.These apply to every .proto file in this repo.
proto3. Proto changes must pass buf lint, buf build, and default VS Code Buf diagnostics. Do not choose a style that requires every developer to change editor settings.v1. File names are snake_case, package directories match the package, and files flow from primary messages to helpers to package-level enums.lower_snake_case field names and concise UpperCamelCase message names. Comment non-obvious semantics, extension boundaries, and security-sensitive fields. Avoid vague names like data, info, or config unless the domain noun makes them precise.maximum_power_watts or polling_frequency_seconds. API time fields use Timestamp/Duration. Client settings may use simple unit-suffixed scalars only for whole-number UI values where presence/range validation matters more than time arithmetic or shared API tooling. Standard codes use standard suffixes such as language_code, region_code, currency_code, mime_type, and time_zone.source_id, metric_id, profile_id, uid, or API resource name. Use numeric fields for measurements, counts, indexes, and externally-defined numeric values, not ShoMetrics-owned identity. Treat IDs as opaque unless the owning registry explicitly documents their structure.repeated fields. Use repeated messages instead of parallel arrays when items may later need labels, IDs, state, or validation.*_UNSPECIFIED = 0. Shared enums stay package-level near the bottom. Single-message enums may be nested near first use, but enum values must still be prefixed by the enum name to satisfy Buf's ENUM_VALUE_PREFIX rule in CI and VS Code. Example: message Source { enum State { STATE_UNSPECIFIED = 0; STATE_ACTIVE = 1; } }. Nested enums prefix by the enum name only, not the enclosing message name.bool only for values that are intrinsically binary and whose third state is already modeled by presence, such as unset/inherit plus enabled/disabled. If the value is a mode, state, policy, user-facing choice, or might plausibly need auto, inherit, mixed, unavailable, or another named state, use an enum. Do not replace every boolean with an enum; first model the domain states and choose the smallest stable shape.optional when absence means unset, inherit, or resolver-owned default. Do not add/remove optional on a used field without treating it as a compatibility-sensitive API change.oneof, or change unset/default semantics. If a breaking shape change is unavoidable, stop and document the replacement field or new versioned package plus migration/codec behavior before editing.oneof before maps, Struct, or Any. Do not encode structured data into strings for later decode; if a value has internal fields, model those fields in proto and validate them directly. Use open-ended maps, raw JSON strings, or Any only after the extension boundary has been designed and documented.json_name except for an explicit compatibility rename.setFoo(), getFoo(), or newBuilder() calls.These apply to persisted Stream Deck settings and other local client configuration protos.
optional when absence means "unset, inherit, or let the resolver decide". Do not use .default()-style schema behavior that erases unset semantics.These apply when defining service APIs, inter-process RPCs, remote agents, or future node/C# communication contracts.
string name for the canonical resource name and standard field names such as display_name, create_time, update_time, uid, and etag only for their standard meanings.google.api.http; local-only and client settings protos do not.page_size, page_token, and next_page_token in v1. Filtering uses one documented string filter when needed. Update RPCs use google.protobuf.FieldMask update_mask.State or end in State. If List can span multiple parents or locations, document wildcard parent support and use the standard repeated string unreachable pattern.Not every Google AIP belongs in this repo:
These files are reference material for unclear syntax, JSON mapping, enum behavior, or generated-code questions. Do not read them by default:
Language_Guide_proto_3.md, Protocol_Buffers_Language_Specification_Proto3.md, Protocol_Buffers_Well-Known_Types.mdProtoJSON_Format.md, Enum_Behavior.md, Application_Note_Field_Presence.mdProto_Best_Practices.md, 1-1-1_Best_Practice.md, Style_Guide.md