[LFXV2-1284] feat(claude): add Claude Code skills for setup and development workflows#62
[LFXV2-1284] feat(claude): add Claude Code skills for setup and development workflows#62
Conversation
Adds three Claude Code skills to help contributors get started with and develop on the committee service, created using the skill-creator plugin. 🤖 Generated with [Claude Code](https://claude.ai/code) Signed-off-by: Andres Tobon <andrest2455@gmail.com>
WalkthroughThis pull request adds multiple developer-facing documents and restructures the Goa DSL: new comprehensive guides for setup, development workflow, and preflight checks; pattern references for Goa and NATS; a new Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes 🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
📝 Coding Plan
Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.claude/skills/develop/references/nats-patterns.md:
- Around line 77-80: The docs currently show example error handling for kvStore
Update/Delete that treat any error as an unexpected error; update the examples
around the s.client.kvStore[constants.KVBucketNameCommittees].Update(...) and
the corresponding Delete(...) snippets so that when the underlying NATS error is
nats.ErrKeyWrongLastSequence (revision mismatch from optimistic concurrency) you
map it to a conflict outcome via errs.NewConflict(...) instead of
errs.NewUnexpected(...), otherwise preserve the existing unexpected-error
handling for other errors; specifically check the returned err against
nats.ErrKeyWrongLastSequence (or wrap-aware comparison) and return
errs.NewConflict("revision mismatch", err) for that case in the examples.
In @.claude/skills/preflight/SKILL.md:
- Around line 18-22: The doc runs comparisons against origin/main without
refreshing remote refs, which can produce stale results; add a fetch step before
the diff/log commands—insert a line executing git fetch origin main (or git
fetch --prune origin main) immediately before the git status/git diff --stat
origin/main...HEAD/git log --format... lines so the subsequent git diff and git
log operate on up-to-date remote history.
In @.claude/skills/setup/SKILL.md:
- Around line 106-110: The fenced code blocks containing the environment snippet
starting with "NATS_URL: nats://lfx-platform-nats.lfx.svc.cluster.local:4222"
and the list starting with "committee-members" are missing language identifiers
and trigger markdownlint MD040; update each triple-backtick fence to include a
language tag (use "text") so they read ```text ... ```; apply the same change to
the other occurrence around the "committee-members / committee-settings /
committees" block (lines noted in the review) to satisfy MD040.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: f9017227-c31c-41dd-afc5-f28e4cb99dbb
📒 Files selected for processing (5)
.claude/skills/develop/SKILL.md.claude/skills/develop/references/goa-patterns.md.claude/skills/develop/references/nats-patterns.md.claude/skills/preflight/SKILL.md.claude/skills/setup/SKILL.md
| rev, err := s.client.kvStore[constants.KVBucketNameCommittees].Update(ctx, uid, dataBytes, revision) | ||
| if err != nil { | ||
| return errs.NewUnexpected("failed to update committee", err) | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Verify current repository handling for optimistic concurrency errors in NATS storage.
rg -n -C3 'ErrKeyWrongLastSequence|Update\(|Delete\('Repository: linuxfoundation/lfx-v2-committee-service
Length of output: 18214
🏁 Script executed:
find . -name "nats-patterns.md" -type fRepository: linuxfoundation/lfx-v2-committee-service
Length of output: 136
🏁 Script executed:
cat -n ./.claude/skills/develop/references/nats-patterns.md | sed -n '70,100p'Repository: linuxfoundation/lfx-v2-committee-service
Length of output: 1514
🏁 Script executed:
rg -n 'ErrKeyWrongLastSequence' --type goRepository: linuxfoundation/lfx-v2-committee-service
Length of output: 66
🏁 Script executed:
rg -n 'jetstream\.' --type go | grep -i 'err' | head -20Repository: linuxfoundation/lfx-v2-committee-service
Length of output: 2215
🏁 Script executed:
rg -n 'import' internal/infrastructure/nats/storage.go | head -20Repository: linuxfoundation/lfx-v2-committee-service
Length of output: 94
🏁 Script executed:
cat -n internal/infrastructure/nats/storage.go | sed -n '1,30p'Repository: linuxfoundation/lfx-v2-committee-service
Length of output: 1027
🏁 Script executed:
cat -n internal/infrastructure/nats/storage.go | sed -n '160,175p'Repository: linuxfoundation/lfx-v2-committee-service
Length of output: 940
🏁 Script executed:
web_search
NATS jetstream revision mismatch error ErrKeyWrongLastSequenceRepository: linuxfoundation/lfx-v2-committee-service
Length of output: 177
🌐 Web query:
NATS jetstream ErrKeyWrongLastSequence revision mismatch error
💡 Result:
In JetStream Key-Value (KV), a key’s revision is implemented as the per-subject stream sequence for the underlying stream subject (e.g. $KV.<bucket>.<key>). When you do an optimistic concurrency write (KV “update”), the client sends the expected revision using the Nats-Expected-Last-Subject-Sequence header; if the server’s current last sequence for that subject doesn’t match, you get ErrKeyWrongLastSequence / “wrong last sequence” (JetStream API err_code=10071). [1] [2] [3]
Common causes
- Stale revision: another writer updated the key between your
Get()andUpdate(). [3] - Wrong “expected” value: you used the stream’s last sequence (global) instead of the subject’s last sequence (per key), which can also surface as “wrong last sequence”. [2]
What to do
- If you want CAS semantics:
entry = kv.Get(k)→kv.Update(k, value, entry.Revision()); onErrKeyWrongLastSequence, re-Get()and retry (or decide to abort/merge). [1] [3] - If you don’t need CAS: use
kv.Put(k, value)(last write wins) instead of update. - If you’re publishing directly (not via KV helpers): ensure you set ExpectedLastSequencePerSubject /
Nats-Expected-Last-Subject-Sequenceto the subject’s last sequence for that key, not the stream’slast_seq. [1] [2]
Sources:
[1] NATS server 2.9.22 release notes (KV update uses Nats-Expected-Last-Subject-Sequence)
[2] nats-server issue #7361 (discussion of validating expected-last-subject-seq vs stream last_seq)
[3] Rust JetStream ErrorCode docs (“Wrong last sequence”)
🏁 Script executed:
rg -n 'go.mod|go.sum' | grep natsRepository: linuxfoundation/lfx-v2-committee-service
Length of output: 377
🏁 Script executed:
rg -n 'ErrKey' --type go | grep -v test | head -20Repository: linuxfoundation/lfx-v2-committee-service
Length of output: 1245
🏁 Script executed:
rg -n 'Conflict|errs.New' internal/infrastructure/nats/storage.go | head -20Repository: linuxfoundation/lfx-v2-committee-service
Length of output: 1856
Update documentation examples to handle revision-mismatch errors during optimistic concurrency control.
The current examples in the nats-patterns.md documentation for Update() and Delete() omit error handling for revision-mismatch scenarios. When optimistic concurrency control is in use, NATS jetstream raises ErrKeyWrongLastSequence when another process modifies the entry between a Get() and an Update()/Delete(). These should map to conflict outcomes (errs.NewConflict()), not unexpected errors.
Suggested doc update
rev, err := s.client.kvStore[constants.KVBucketNameCommittees].Update(ctx, uid, dataBytes, revision)
if err != nil {
+ if errors.Is(err, jetstream.ErrKeyWrongLastSequence) {
+ return errs.NewConflict("committee was modified by another process")
+ }
return errs.NewUnexpected("failed to update committee", err)
}
@@
err := s.client.kvStore[constants.KVBucketNameCommittees].Delete(ctx, uid, jetstream.LastRevision(revision))
if err != nil {
+ if errors.Is(err, jetstream.ErrKeyWrongLastSequence) {
+ return errs.NewConflict("committee was modified by another process")
+ }
return errs.NewUnexpected("failed to delete committee", err)
}Also applies to: lines 85-88, 93-96
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.claude/skills/develop/references/nats-patterns.md around lines 77 - 80, The
docs currently show example error handling for kvStore Update/Delete that treat
any error as an unexpected error; update the examples around the
s.client.kvStore[constants.KVBucketNameCommittees].Update(...) and the
corresponding Delete(...) snippets so that when the underlying NATS error is
nats.ErrKeyWrongLastSequence (revision mismatch from optimistic concurrency) you
map it to a conflict outcome via errs.NewConflict(...) instead of
errs.NewUnexpected(...), otherwise preserve the existing unexpected-error
handling for other errors; specifically check the returned err against
nats.ErrKeyWrongLastSequence (or wrap-aware comparison) and return
errs.NewConflict("revision mismatch", err) for that case in the examples.
| ```bash | ||
| git status | ||
| git diff --stat origin/main...HEAD | ||
| git log --format="%h %s%n%b" origin/main...HEAD | ||
| ``` |
There was a problem hiding this comment.
Refresh remote refs before running origin/main...HEAD comparisons.
Line 20–22 rely on origin/main; without fetching first, preflight can validate against stale history and report incorrect results.
Suggested doc update
## Check 0: Working Tree Status
Before running any validation, understand what has changed:
```bash
+git fetch origin main
git status
git diff --stat origin/main...HEAD
git log --format="%h %s%n%b" origin/main...HEAD</details>
<!-- suggestion_start -->
<details>
<summary>📝 Committable suggestion</summary>
> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
```suggestion
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.claude/skills/preflight/SKILL.md around lines 18 - 22, The doc runs
comparisons against origin/main without refreshing remote refs, which can
produce stale results; add a fetch step before the diff/log commands—insert a
line executing git fetch origin main (or git fetch --prune origin main)
immediately before the git status/git diff --stat origin/main...HEAD/git log
--format... lines so the subsequent git diff and git log operate on up-to-date
remote history.
.claude/skills/setup/SKILL.md
Outdated
| ``` | ||
| NATS_URL: nats://lfx-platform-nats.lfx.svc.cluster.local:4222 | ||
| AUTH_SOURCE: mock | ||
| JWT_AUTH_DISABLED_MOCK_LOCAL_PRINCIPAL: project_super_admin | ||
| ``` |
There was a problem hiding this comment.
Add language identifiers to fenced code blocks.
These fences are missing a language tag, which triggers markdownlint (MD040).
Suggested doc update
-```
+```text
NATS_URL: nats://lfx-platform-nats.lfx.svc.cluster.local:4222
AUTH_SOURCE: mock
JWT_AUTH_DISABLED_MOCK_LOCAL_PRINCIPAL: project_super_admin@@
- +text
committee-members
committee-settings
committees
Also applies to: 153-157
🧰 Tools
🪛 markdownlint-cli2 (0.21.0)
[warning] 106-106: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.claude/skills/setup/SKILL.md around lines 106 - 110, The fenced code blocks
containing the environment snippet starting with "NATS_URL:
nats://lfx-platform-nats.lfx.svc.cluster.local:4222" and the list starting with
"committee-members" are missing language identifiers and trigger markdownlint
MD040; update each triple-backtick fence to include a language tag (use "text")
so they read ```text ... ```; apply the same change to the other occurrence
around the "committee-members / committee-settings / committees" block (lines
noted in the review) to satisfy MD040.
There was a problem hiding this comment.
Pull request overview
Adds a pilot set of Claude Code “skills” (markdown-based slash commands) under .claude/skills/ to guide contributors through local setup, day-to-day development, and pre-PR validation for the committee service.
Changes:
- Add
/setupskill documenting local environment bootstrapping (Go/NATS, codegen, run, health checks). - Add
/developskill documenting the service architecture and recommended workflow (with Goa/NATS reference notes). - Add
/preflightskill providing a step-by-step checklist before opening a PR.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
.claude/skills/setup/SKILL.md |
New guided local setup workflow for prerequisites, NATS KV buckets, codegen, run, and verification. |
.claude/skills/develop/SKILL.md |
New development workflow guide aligned to the service’s layered architecture. |
.claude/skills/develop/references/goa-patterns.md |
Goa design/codegen reference patterns for adding endpoints and types. |
.claude/skills/develop/references/nats-patterns.md |
NATS KV storage patterns and conventions reference. |
.claude/skills/preflight/SKILL.md |
Pre-PR checklist covering formatting, lint, license headers, tests, build, and commit conventions. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
.claude/skills/setup/SKILL.md
Outdated
| The service reads its configuration from environment variables. A ready-to-use `.env` file already exists in the repo root — it's pre-configured for local development with auth disabled (so you don't need external credentials to get started). | ||
|
|
||
| Load the environment: | ||
| ```bash | ||
| source .env | ||
| ``` | ||
|
|
||
| > **What the .env file does:** It sets the service to connect to a local NATS server and disables authentication, so you can test without needing real credentials. Never commit changes to `.env` with real secrets. |
.claude/skills/setup/SKILL.md
Outdated
| Expected output: | ||
| ``` | ||
| NATS_URL: nats://lfx-platform-nats.lfx.svc.cluster.local:4222 | ||
| AUTH_SOURCE: mock | ||
| JWT_AUTH_DISABLED_MOCK_LOCAL_PRINCIPAL: project_super_admin | ||
| ``` | ||
|
|
||
| > **Note:** The NATS_URL in .env points to the shared cluster — for local development, you'll override this in Step 6. | ||
|
|
| | Layer | File Location | When to Change | | ||
| |-------|--------------|----------------| | ||
| | **API Design** | `cmd/committee-api/design/committee.go` | New endpoint or new request/response fields | | ||
| | **Data Types** | `cmd/committee-api/design/type.go` | New Goa types for request/response | | ||
| | **Domain Model** | `internal/domain/model/` | New or changed data shape stored in NATS | | ||
| | **Port Interface** | `internal/domain/port/` | New storage operation needed | | ||
| | **NATS Storage** | `internal/infrastructure/nats/` | Implementing a new port operation | | ||
| | **Internal Service** | `internal/service/` | New business logic | | ||
| | **HTTP Handler** | `cmd/committee-api/service/` | Wiring up a new endpoint | | ||
|
|
| | Bucket | Constant | Stores | | ||
| |--------|----------|--------| | ||
| | `committees` | `constants.KVBucketNameCommittees` | Committee base data | | ||
| | `committee-settings` | `constants.KVBucketNameCommitteeSettings` | Committee settings | | ||
| | `committee-members` | `constants.KVBucketNameCommitteeMembers` | Committee member data | |
| ## Design Constraints | ||
|
|
||
| - Method names use kebab-case: `"get-committee-stats"` not `"getCommitteeStats"` | ||
| - HTTP paths use underscores for path params: `{committee_uid}` | ||
| - Always include `BearerTokenAttribute()` and `VersionAttribute()` in payloads | ||
| - Always declare all error types that might be returned |
- Add .env.example with commented explanations for all environment variables - Rename design/committee.go to design/committee_svc.go for clarity - Split design/type.go into entity-specific files (committee_type.go, committee_member_type.go) keeping shared attributes and errors in type.go - Update setup skill to cover both local and E2E (OrbStack) dev modes - Expand develop skill with: Heimdall ruleset guidance (OpenFGA relations), V1 sync compatibility step, and updated file references - Update goa-patterns.md with type file convention (<entity>_type.go) - Expand nats-patterns.md with instructions for adding new KV buckets (local CLI and Helm chart) - Add v1-sync-patterns.md reference covering lfx-v1-sync-helper update locations for cross-system field changes - Update cmd/committee-api/README.md file structure section Generated with [Claude Code](https://claude.ai/claude-code) Signed-off-by: Andres Tobon <andrest2455@gmail.com>
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (1)
cmd/committee-api/design/committee_member_type.go (1)
32-60: Consider consolidating redundant type definitions.
CommitteeMemberFullis currently identical toCommitteeMemberBase, and bothCommitteeMemberCreateAttributes()andCommitteeMemberUpdateAttributes()are identical wrappers aroundCommitteeMemberBaseAttributes(). If these are placeholders for future differentiation, consider adding a brief comment explaining the intent; otherwise, they could be consolidated.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@cmd/committee-api/design/committee_member_type.go` around lines 32 - 60, CommitteeMemberFull, CommitteeMemberCreateAttributes, and CommitteeMemberUpdateAttributes are redundant wrappers around CommitteeMemberBaseAttributes; either consolidate by having CommitteeMemberFull directly use CommitteeMemberBaseAttributes (or remove the redundant wrappers and reference CommitteeMemberBaseAttributes where used) or keep them but add a brief comment above CommitteeMemberFull and the two functions explaining they are intentional placeholders for future divergence; update references to use the consolidated symbol or leave the wrappers with explanatory comments for CommitteeMemberFull, CommitteeMemberCreateAttributes, CommitteeMemberUpdateAttributes and CommitteeMemberBaseAttributes.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.claude/skills/develop/references/v1-sync-patterns.md:
- Around line 57-59: The fenced code block containing
"github.com/linuxfoundation/lfx-v2-committee-service vX.Y.Z" is missing a
language identifier which triggers markdownlint MD040; update that fenced block
in .claude/skills/develop/references/v1-sync-patterns.md by changing the opening
triple backticks to include a language token (e.g., use "text") so the block
starts with ```text, leaving the block contents unchanged.
In @.claude/skills/setup/SKILL.md:
- Around line 185-189: The fenced code block containing the lines
"committee-members", "committee-settings", "committees" is missing a language
identifier; update the opening fence from ``` to ```text so the block becomes a
plain-text fenced block and satisfies markdownlint MD040 (i.e., change the
fenced block that wraps those three lines to use "text" as the language
identifier).
In `@cmd/committee-api/design/committee_type.go`:
- Around line 329-335: In MemberVisibilityAttribute(), fix the typo in the
attribute description string by changing "Dertermines the visibility level of
members profiles to other members of the same committee" to "Determines the
visibility level of members' profiles to other members of the same committee"
(also add the possessive apostrophe on "members' profiles" for clarity) so the
dsl.Attribute call uses the corrected, grammatically accurate description.
---
Nitpick comments:
In `@cmd/committee-api/design/committee_member_type.go`:
- Around line 32-60: CommitteeMemberFull, CommitteeMemberCreateAttributes, and
CommitteeMemberUpdateAttributes are redundant wrappers around
CommitteeMemberBaseAttributes; either consolidate by having CommitteeMemberFull
directly use CommitteeMemberBaseAttributes (or remove the redundant wrappers and
reference CommitteeMemberBaseAttributes where used) or keep them but add a brief
comment above CommitteeMemberFull and the two functions explaining they are
intentional placeholders for future divergence; update references to use the
consolidated symbol or leave the wrappers with explanatory comments for
CommitteeMemberFull, CommitteeMemberCreateAttributes,
CommitteeMemberUpdateAttributes and CommitteeMemberBaseAttributes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 09024396-5730-41a5-b0d2-8ceb732cacc2
📒 Files selected for processing (11)
.claude/skills/develop/SKILL.md.claude/skills/develop/references/goa-patterns.md.claude/skills/develop/references/nats-patterns.md.claude/skills/develop/references/v1-sync-patterns.md.claude/skills/setup/SKILL.md.env.examplecmd/committee-api/README.mdcmd/committee-api/design/committee_member_type.gocmd/committee-api/design/committee_svc.gocmd/committee-api/design/committee_type.gocmd/committee-api/design/type.go
✅ Files skipped from review due to trivial changes (2)
- .env.example
- .claude/skills/develop/references/goa-patterns.md
🚧 Files skipped from review as they are similar to previous changes (1)
- .claude/skills/develop/references/nats-patterns.md
| ``` | ||
| github.com/linuxfoundation/lfx-v2-committee-service vX.Y.Z | ||
| ``` |
There was a problem hiding this comment.
Add language identifier to fenced code block.
The code block showing the Go module import path is missing a language identifier, triggering markdownlint MD040.
Suggested fix
-```
+```text
github.com/linuxfoundation/lfx-v2-committee-service vX.Y.Z
-```
+```📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ``` | |
| github.com/linuxfoundation/lfx-v2-committee-service vX.Y.Z | |
| ``` |
🧰 Tools
🪛 markdownlint-cli2 (0.21.0)
[warning] 57-57: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.claude/skills/develop/references/v1-sync-patterns.md around lines 57 - 59,
The fenced code block containing
"github.com/linuxfoundation/lfx-v2-committee-service vX.Y.Z" is missing a
language identifier which triggers markdownlint MD040; update that fenced block
in .claude/skills/develop/references/v1-sync-patterns.md by changing the opening
triple backticks to include a language token (e.g., use "text") so the block
starts with ```text, leaving the block contents unchanged.
| ``` | ||
| committee-members | ||
| committee-settings | ||
| committees | ||
| ``` |
There was a problem hiding this comment.
Add language identifier to fenced code block.
The expected output block is missing a language identifier, triggering markdownlint MD040.
Suggested fix
Expected output:
-```
+```text
committee-members
committee-settings
committees</details>
<!-- suggestion_start -->
<details>
<summary>📝 Committable suggestion</summary>
> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
```suggestion
Expected output:
🧰 Tools
🪛 markdownlint-cli2 (0.21.0)
[warning] 185-185: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.claude/skills/setup/SKILL.md around lines 185 - 189, The fenced code block
containing the lines "committee-members", "committee-settings", "committees" is
missing a language identifier; update the opening fence from ``` to ```text so
the block becomes a plain-text fenced block and satisfies markdownlint MD040
(i.e., change the fenced block that wraps those three lines to use "text" as the
language identifier).
| func MemberVisibilityAttribute() { | ||
| dsl.Attribute("member_visibility", dsl.String, "Dertermines the visibility level of members profiles to other members of the same committee", func() { | ||
| dsl.Enum("hidden", "basic_profile") | ||
| dsl.Default("hidden") | ||
| dsl.Example("hidden") | ||
| }) | ||
| } |
There was a problem hiding this comment.
Fix typo in description.
"Dertermines" should be "Determines".
Suggested fix
// MemberVisibilityAttribute is the DSL attribute for the member visibility setting
func MemberVisibilityAttribute() {
- dsl.Attribute("member_visibility", dsl.String, "Dertermines the visibility level of members profiles to other members of the same committee", func() {
+ dsl.Attribute("member_visibility", dsl.String, "Determines the visibility level of members profiles to other members of the same committee", func() {
dsl.Enum("hidden", "basic_profile")
dsl.Default("hidden")
dsl.Example("hidden")
})
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| func MemberVisibilityAttribute() { | |
| dsl.Attribute("member_visibility", dsl.String, "Dertermines the visibility level of members profiles to other members of the same committee", func() { | |
| dsl.Enum("hidden", "basic_profile") | |
| dsl.Default("hidden") | |
| dsl.Example("hidden") | |
| }) | |
| } | |
| func MemberVisibilityAttribute() { | |
| dsl.Attribute("member_visibility", dsl.String, "Determines the visibility level of members profiles to other members of the same committee", func() { | |
| dsl.Enum("hidden", "basic_profile") | |
| dsl.Default("hidden") | |
| dsl.Example("hidden") | |
| }) | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@cmd/committee-api/design/committee_type.go` around lines 329 - 335, In
MemberVisibilityAttribute(), fix the typo in the attribute description string by
changing "Dertermines the visibility level of members profiles to other members
of the same committee" to "Determines the visibility level of members' profiles
to other members of the same committee" (also add the possessive apostrophe on
"members' profiles" for clarity) so the dsl.Attribute call uses the corrected,
grammatically accurate description.
Summary
Adds three Claude Code skills to the committee service as a pilot for the broader LFX V2 platform. Skills are markdown files stored in
.claude/skills/that are automatically available as slash commands when working in the repo with Claude Code./setupGuides a contributor through first-time environment setup from scratch. Covers installing prerequisites (Go, NATS server, NATS CLI, GitHub CLI), cloning the repo, installing Go dependencies and dev tools, configuring environment variables, starting NATS locally with JetStream enabled, creating the three required KV buckets (
committees,committee-settings,committee-members), generating API code, and running the service. Each step verifies success before moving on, and a troubleshooting section covers the most common failure modes./developA day-to-day development reference built around the service's layered architecture. Explains the request flow from HTTP handler through internal service, port interfaces, and NATS storage. Walks through the correct build order (domain model → port interface → NATS implementation → internal service → API design → code gen → HTTP handler), how to work with the Goa design files and when to run
make apigen, data model and port interface conventions, writing business logic in the internal service layer, keeping handlers thin, running tests with mocks, and the full validation suite (make fmt,make check,make test,make build). Includes two reference files with Goa and NATS patterns pulled from existing code in the repo./preflightA pre-PR checklist that runs eight checks in order: working tree status and commit conventions, code formatting, license headers, linting, tests, build verification, protected file audit, and commit sign-off. Produces a clear pass/fail summary and offers to create the PR if everything passes.
Ticket
LFXV2-1284
🤖 Generated with Claude Code