

Also from Kynth Studios


Also from Kynth Studios


Also from Kynth Studios
1<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:_sections:start -->2# Sections34This file defines all sections, their ordering, impact levels, and descriptions.5The section ID (in parentheses) is the filename prefix used to group rules.67---89## 1. Component Architecture (architecture)1011**Impact:** HIGH12**Description:** Fundamental patterns for structuring components to avoid prop13proliferation and enable flexible composition.1415## 2. State Management (state)1617**Impact:** MEDIUM18**Description:** Patterns for lifting state and managing shared context across19composed components.2021## 3. Implementation Patterns (patterns)2223**Impact:** MEDIUM24**Description:** Specific techniques for implementing compound components and25context providers.2627## 4. React 19 APIs (react19)2829**Impact:** MEDIUM30**Description:** React 19+ only. Don't use `forwardRef`; use `use()` instead of `useContext()`.31<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:_sections:end -->3233<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:_template:start -->34## Rule Title Here3536Brief explanation of the rule and why it matters.3738**Incorrect:**3940```tsx41// Bad code example42```4344**Correct:**4546```tsx47// Good code example48```4950Reference: [Link](https://example.com)51<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:_template:end -->5253<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:architecture-avoid-boolean-props:start -->54## Avoid Boolean Prop Proliferation5556Don't add boolean props like `isThread`, `isEditing`, `isDMThread` to customize57component behavior. Each boolean doubles possible states and creates58unmaintainable conditional logic. Use composition instead.5960**Incorrect (boolean props create exponential complexity):**6162```tsx63function Composer({64 onSubmit,65 isThread,66 channelId,67 isDMThread,68 dmId,69 isEditing,70 isForwarding,71}: Props) {72 return (73 <form>74 <Header />75 <Input />76 {isDMThread ? (77 <AlsoSendToDMField id={dmId} />78 ) : isThread ? (79 <AlsoSendToChannelField id={channelId} />80 ) : null}81 {isEditing ? (82 <EditActions />83 ) : isForwarding ? (84 <ForwardActions />85 ) : (86 <DefaultActions />87 )}88 <Footer onSubmit={onSubmit} />89 </form>90 )91}92```9394**Correct (composition eliminates conditionals):**9596```tsx97// Channel composer98function ChannelComposer() {99 return (100 <Composer.Frame>101 <Composer.Header />102 <Composer.Input />103 <Composer.Footer>104 <Composer.Attachments />105 <Composer.Formatting />106 <Composer.Emojis />107 <Composer.Submit />108 </Composer.Footer>109 </Composer.Frame>110 )111}112113// Thread composer - adds "also send to channel" field114function ThreadComposer({ channelId }: { channelId: string }) {115 return (116 <Composer.Frame>117 <Composer.Header />118 <Composer.Input />119 <AlsoSendToChannelField id={channelId} />120 <Composer.Footer>121 <Composer.Formatting />122 <Composer.Emojis />123 <Composer.Submit />124 </Composer.Footer>125 </Composer.Frame>126 )127}128129// Edit composer - different footer actions130function EditComposer() {131 return (132 <Composer.Frame>133 <Composer.Input />134 <Composer.Footer>135 <Composer.Formatting />136 <Composer.Emojis />137 <Composer.CancelEdit />138 <Composer.SaveEdit />139 </Composer.Footer>140 </Composer.Frame>141 )142}143```144145Each variant is explicit about what it renders. We can share internals without146sharing a single monolithic parent.147<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:architecture-avoid-boolean-props:end -->148149<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:architecture-compound-components:start -->150## Use Compound Components151152Structure complex components as compound components with a shared context. Each153subcomponent accesses shared state via context, not props. Consumers compose the154pieces they need.155156**Incorrect (monolithic component with render props):**157158```tsx159function Composer({160 renderHeader,161 renderFooter,162 renderActions,163 showAttachments,164 showFormatting,165 showEmojis,166}: Props) {167 return (168 <form>169 {renderHeader?.()}170 <Input />171 {showAttachments && <Attachments />}172 {renderFooter ? (173 renderFooter()174 ) : (175 <Footer>176 {showFormatting && <Formatting />}177 {showEmojis && <Emojis />}178 {renderActions?.()}179 </Footer>180 )}181 </form>182 )183}184```185186**Correct (compound components with shared context):**187188```tsx189const ComposerContext = createContext<ComposerContextValue | null>(null)190191function ComposerProvider({ children, state, actions, meta }: ProviderProps) {192 return (193 <ComposerContext value={{ state, actions, meta }}>194 {children}195 </ComposerContext>196 )197}198199function ComposerFrame({ children }: { children: React.ReactNode }) {200 return <form>{children}</form>201}202203function ComposerInput() {204 const {205 state,206 actions: { update },207 meta: { inputRef },208 } = use(ComposerContext)209 return (210 <TextInput211 ref={inputRef}212 value={state.input}213 onChangeText={(text) => update((s) => ({ ...s, input: text }))}214 />215 )216}217218function ComposerSubmit() {219 const {220 actions: { submit },221 } = use(ComposerContext)222 return <Button onPress={submit}>Send</Button>223}224225// Export as compound component226const Composer = {227 Provider: ComposerProvider,228 Frame: ComposerFrame,229 Input: ComposerInput,230 Submit: ComposerSubmit,231 Header: ComposerHeader,232 Footer: ComposerFooter,233 Attachments: ComposerAttachments,234 Formatting: ComposerFormatting,235 Emojis: ComposerEmojis,236}237```238239**Usage:**240241```tsx242<Composer.Provider state={state} actions={actions} meta={meta}>243 <Composer.Frame>244 <Composer.Header />245 <Composer.Input />246 <Composer.Footer>247 <Composer.Formatting />248 <Composer.Submit />249 </Composer.Footer>250 </Composer.Frame>251</Composer.Provider>252```253254Consumers explicitly compose exactly what they need. No hidden conditionals. And the state, actions and meta are dependency-injected by a parent provider, allowing multiple usages of the same component structure.255<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:architecture-compound-components:end -->256257<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:patterns-children-over-render-props:start -->258## Prefer Children Over Render Props259260Use `children` for composition instead of `renderX` props. Children are more261readable, compose naturally, and don't require understanding callback262signatures.263264**Incorrect (render props):**265266```tsx267function Composer({268 renderHeader,269 renderFooter,270 renderActions,271}: {272 renderHeader?: () => React.ReactNode273 renderFooter?: () => React.ReactNode274 renderActions?: () => React.ReactNode275}) {276 return (277 <form>278 {renderHeader?.()}279 <Input />280 {renderFooter ? renderFooter() : <DefaultFooter />}281 {renderActions?.()}282 </form>283 )284}285286// Usage is awkward and inflexible287return (288 <Composer289 renderHeader={() => <CustomHeader />}290 renderFooter={() => (291 <>292 <Formatting />293 <Emojis />294 </>295 )}296 renderActions={() => <SubmitButton />}297 />298)299```300301**Correct (compound components with children):**302303```tsx304function ComposerFrame({ children }: { children: React.ReactNode }) {305 return <form>{children}</form>306}307308function ComposerFooter({ children }: { children: React.ReactNode }) {309 return <footer className='flex'>{children}</footer>310}311312// Usage is flexible313return (314 <Composer.Frame>315 <CustomHeader />316 <Composer.Input />317 <Composer.Footer>318 <Composer.Formatting />319 <Composer.Emojis />320 <SubmitButton />321 </Composer.Footer>322 </Composer.Frame>323)324```325326**When render props are appropriate:**327328```tsx329// Render props work well when you need to pass data back330<List331 data={items}332 renderItem={({ item, index }) => <Item item={item} index={index} />}333/>334```335336Use render props when the parent needs to provide data or state to the child.337Use children when composing static structure.338<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:patterns-children-over-render-props:end -->339340<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:patterns-explicit-variants:start -->341## Create Explicit Component Variants342343Instead of one component with many boolean props, create explicit variant344components. Each variant composes the pieces it needs. The code documents345itself.346347**Incorrect (one component, many modes):**348349```tsx350// What does this component actually render?351<Composer352 isThread353 isEditing={false}354 channelId='abc'355 showAttachments356 showFormatting={false}357/>358```359360**Correct (explicit variants):**361362```tsx363// Immediately clear what this renders364<ThreadComposer channelId="abc" />365366// Or367<EditMessageComposer messageId="xyz" />368369// Or370<ForwardMessageComposer messageId="123" />371```372373Each implementation is unique, explicit and self-contained. Yet they can each374use shared parts.375376**Implementation:**377378```tsx379function ThreadComposer({ channelId }: { channelId: string }) {380 return (381 <ThreadProvider channelId={channelId}>382 <Composer.Frame>383 <Composer.Input />384 <AlsoSendToChannelField channelId={channelId} />385 <Composer.Footer>386 <Composer.Formatting />387 <Composer.Emojis />388 <Composer.Submit />389 </Composer.Footer>390 </Composer.Frame>391 </ThreadProvider>392 )393}394395function EditMessageComposer({ messageId }: { messageId: string }) {396 return (397 <EditMessageProvider messageId={messageId}>398 <Composer.Frame>399 <Composer.Input />400 <Composer.Footer>401 <Composer.Formatting />402 <Composer.Emojis />403 <Composer.CancelEdit />404 <Composer.SaveEdit />405 </Composer.Footer>406 </Composer.Frame>407 </EditMessageProvider>408 )409}410411function ForwardMessageComposer({ messageId }: { messageId: string }) {412 return (413 <ForwardMessageProvider messageId={messageId}>414 <Composer.Frame>415 <Composer.Input placeholder="Add a message, if you'd like." />416 <Composer.Footer>417 <Composer.Formatting />418 <Composer.Emojis />419 <Composer.Mentions />420 </Composer.Footer>421 </Composer.Frame>422 </ForwardMessageProvider>423 )424}425```426427Each variant is explicit about:428429- What provider/state it uses430- What UI elements it includes431- What actions are available432433No boolean prop combinations to reason about. No impossible states.434<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:patterns-explicit-variants:end -->435436<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:react19-no-forwardref:start -->437## React 19 API Changes438439> **⚠️ React 19+ only.** Skip this if you're on React 18 or earlier.440441In React 19, `ref` is now a regular prop (no `forwardRef` wrapper needed), and `use()` replaces `useContext()`.442443**Incorrect (forwardRef in React 19):**444445```tsx446const ComposerInput = forwardRef<TextInput, Props>((props, ref) => {447 return <TextInput ref={ref} {...props} />448})449```450451**Correct (ref as a regular prop):**452453```tsx454function ComposerInput({ ref, ...props }: Props & { ref?: React.Ref<TextInput> }) {455 return <TextInput ref={ref} {...props} />456}457```458459**Incorrect (useContext in React 19):**460461```tsx462const value = useContext(MyContext)463```464465**Correct (use instead of useContext):**466467```tsx468const value = use(MyContext)469```470471`use()` can also be called conditionally, unlike `useContext()`.472<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:react19-no-forwardref:end -->473474<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:state-context-interface:start -->475## Define Generic Context Interfaces for Dependency Injection476477Define a **generic interface** for your component context with three parts:478`state`, `actions`, and `meta`. This interface is a contract that any provider479can implement—enabling the same UI components to work with completely different480state implementations.481482**Core principle:** Lift state, compose internals, make state483dependency-injectable.484485**Incorrect (UI coupled to specific state implementation):**486487```tsx488function ComposerInput() {489 // Tightly coupled to a specific hook490 const { input, setInput } = useChannelComposerState()491 return <TextInput value={input} onChangeText={setInput} />492}493```494495**Correct (generic interface enables dependency injection):**496497```tsx498// Define a GENERIC interface that any provider can implement499interface ComposerState {500 input: string501 attachments: Attachment[]502 isSubmitting: boolean503}504505interface ComposerActions {506 update: (updater: (state: ComposerState) => ComposerState) => void507 submit: () => void508}509510interface ComposerMeta {511 inputRef: React.RefObject<TextInput>512}513514interface ComposerContextValue {515 state: ComposerState516 actions: ComposerActions517 meta: ComposerMeta518}519520const ComposerContext = createContext<ComposerContextValue | null>(null)521```522523**UI components consume the interface, not the implementation:**524525```tsx526function ComposerInput() {527 const {528 state,529 actions: { update },530 meta,531 } = use(ComposerContext)532533 // This component works with ANY provider that implements the interface534 return (535 <TextInput536 ref={meta.inputRef}537 value={state.input}538 onChangeText={(text) => update((s) => ({ ...s, input: text }))}539 />540 )541}542```543544**Different providers implement the same interface:**545546```tsx547// Provider A: Local state for ephemeral forms548function ForwardMessageProvider({ children }: { children: React.ReactNode }) {549 const [state, setState] = useState(initialState)550 const inputRef = useRef(null)551 const submit = useForwardMessage()552553 return (554 <ComposerContext555 value={{556 state,557 actions: { update: setState, submit },558 meta: { inputRef },559 }}560 >561 {children}562 </ComposerContext>563 )564}565566// Provider B: Global synced state for channels567function ChannelProvider({ channelId, children }: Props) {568 const { state, update, submit } = useGlobalChannel(channelId)569 const inputRef = useRef(null)570571 return (572 <ComposerContext573 value={{574 state,575 actions: { update, submit },576 meta: { inputRef },577 }}578 >579 {children}580 </ComposerContext>581 )582}583```584585**The same composed UI works with both:**586587```tsx588// Works with ForwardMessageProvider (local state)589<ForwardMessageProvider>590 <Composer.Frame>591 <Composer.Input />592 <Composer.Submit />593 </Composer.Frame>594</ForwardMessageProvider>595596// Works with ChannelProvider (global synced state)597<ChannelProvider channelId="abc">598 <Composer.Frame>599 <Composer.Input />600 <Composer.Submit />601 </Composer.Frame>602</ChannelProvider>603```604605**Custom UI outside the component can access state and actions:**606607The provider boundary is what matters—not the visual nesting. Components that608need shared state don't have to be inside the `Composer.Frame`. They just need609to be within the provider.610611```tsx612function ForwardMessageDialog() {613 return (614 <ForwardMessageProvider>615 <Dialog>616 {/* The composer UI */}617 <Composer.Frame>618 <Composer.Input placeholder="Add a message, if you'd like." />619 <Composer.Footer>620 <Composer.Formatting />621 <Composer.Emojis />622 </Composer.Footer>623 </Composer.Frame>624625 {/* Custom UI OUTSIDE the composer, but INSIDE the provider */}626 <MessagePreview />627628 {/* Actions at the bottom of the dialog */}629 <DialogActions>630 <CancelButton />631 <ForwardButton />632 </DialogActions>633 </Dialog>634 </ForwardMessageProvider>635 )636}637638// This button lives OUTSIDE Composer.Frame but can still submit based on its context!639function ForwardButton() {640 const {641 actions: { submit },642 } = use(ComposerContext)643 return <Button onPress={submit}>Forward</Button>644}645646// This preview lives OUTSIDE Composer.Frame but can read composer's state!647function MessagePreview() {648 const { state } = use(ComposerContext)649 return <Preview message={state.input} attachments={state.attachments} />650}651```652653The `ForwardButton` and `MessagePreview` are not visually inside the composer654box, but they can still access its state and actions. This is the power of655lifting state into providers.656657The UI is reusable bits you compose together. The state is dependency-injected658by the provider. Swap the provider, keep the UI.659<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:state-context-interface:end -->660661<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:state-decouple-implementation:start -->662## Decouple State Management from UI663664The provider component should be the only place that knows how state is managed.665UI components consume the context interface—they don't know if state comes from666useState, Zustand, or a server sync.667668**Incorrect (UI coupled to state implementation):**669670```tsx671function ChannelComposer({ channelId }: { channelId: string }) {672 // UI component knows about global state implementation673 const state = useGlobalChannelState(channelId)674 const { submit, updateInput } = useChannelSync(channelId)675676 return (677 <Composer.Frame>678 <Composer.Input679 value={state.input}680 onChange={(text) => sync.updateInput(text)}681 />682 <Composer.Submit onPress={() => sync.submit()} />683 </Composer.Frame>684 )685}686```687688**Correct (state management isolated in provider):**689690```tsx691// Provider handles all state management details692function ChannelProvider({693 channelId,694 children,695}: {696 channelId: string697 children: React.ReactNode698}) {699 const { state, update, submit } = useGlobalChannel(channelId)700 const inputRef = useRef(null)701702 return (703 <Composer.Provider704 state={state}705 actions={{ update, submit }}706 meta={{ inputRef }}707 >708 {children}709 </Composer.Provider>710 )711}712713// UI component only knows about the context interface714function ChannelComposer() {715 return (716 <Composer.Frame>717 <Composer.Header />718 <Composer.Input />719 <Composer.Footer>720 <Composer.Submit />721 </Composer.Footer>722 </Composer.Frame>723 )724}725726// Usage727function Channel({ channelId }: { channelId: string }) {728 return (729 <ChannelProvider channelId={channelId}>730 <ChannelComposer />731 </ChannelProvider>732 )733}734```735736**Different providers, same UI:**737738```tsx739// Local state for ephemeral forms740function ForwardMessageProvider({ children }) {741 const [state, setState] = useState(initialState)742 const forwardMessage = useForwardMessage()743744 return (745 <Composer.Provider746 state={state}747 actions={{ update: setState, submit: forwardMessage }}748 >749 {children}750 </Composer.Provider>751 )752}753754// Global synced state for channels755function ChannelProvider({ channelId, children }) {756 const { state, update, submit } = useGlobalChannel(channelId)757758 return (759 <Composer.Provider state={state} actions={{ update, submit }}>760 {children}761 </Composer.Provider>762 )763}764```765766The same `Composer.Input` component works with both providers because it only767depends on the context interface, not the implementation.768<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:state-decouple-implementation:end -->769770<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:state-lift-state:start -->771## Lift State into Provider Components772773Move state management into dedicated provider components. This allows sibling774components outside the main UI to access and modify state without prop drilling775or awkward refs.776777**Incorrect (state trapped inside component):**778779```tsx780function ForwardMessageComposer() {781 const [state, setState] = useState(initialState)782 const forwardMessage = useForwardMessage()783784 return (785 <Composer.Frame>786 <Composer.Input />787 <Composer.Footer />788 </Composer.Frame>789 )790}791792// Problem: How does this button access composer state?793function ForwardMessageDialog() {794 return (795 <Dialog>796 <ForwardMessageComposer />797 <MessagePreview /> {/* Needs composer state */}798 <DialogActions>799 <CancelButton />800 <ForwardButton /> {/* Needs to call submit */}801 </DialogActions>802 </Dialog>803 )804}805```806807**Incorrect (useEffect to sync state up):**808809```tsx810function ForwardMessageDialog() {811 const [input, setInput] = useState('')812 return (813 <Dialog>814 <ForwardMessageComposer onInputChange={setInput} />815 <MessagePreview input={input} />816 </Dialog>817 )818}819820function ForwardMessageComposer({ onInputChange }) {821 const [state, setState] = useState(initialState)822 useEffect(() => {823 onInputChange(state.input) // Sync on every change 😬824 }, [state.input])825}826```827828**Incorrect (reading state from ref on submit):**829830```tsx831function ForwardMessageDialog() {832 const stateRef = useRef(null)833 return (834 <Dialog>835 <ForwardMessageComposer stateRef={stateRef} />836 <ForwardButton onPress={() => submit(stateRef.current)} />837 </Dialog>838 )839}840```841842**Correct (state lifted to provider):**843844```tsx845function ForwardMessageProvider({ children }: { children: React.ReactNode }) {846 const [state, setState] = useState(initialState)847 const forwardMessage = useForwardMessage()848 const inputRef = useRef(null)849850 return (851 <Composer.Provider852 state={state}853 actions={{ update: setState, submit: forwardMessage }}854 meta={{ inputRef }}855 >856 {children}857 </Composer.Provider>858 )859}860861function ForwardMessageDialog() {862 return (863 <ForwardMessageProvider>864 <Dialog>865 <ForwardMessageComposer />866 <MessagePreview /> {/* Custom components can access state and actions */}867 <DialogActions>868 <CancelButton />869 <ForwardButton /> {/* Custom components can access state and actions */}870 </DialogActions>871 </Dialog>872 </ForwardMessageProvider>873 )874}875876function ForwardButton() {877 const { actions } = use(Composer.Context)878 return <Button onPress={actions.submit}>Forward</Button>879}880```881882The ForwardButton lives outside the Composer.Frame but still has access to the883submit action because it's within the provider. Even though it's a one-off884component, it can still access the composer's state and actions from outside the885UI itself.886887**Key insight:** Components that need shared state don't have to be visually888nested inside each other—they just need to be within the same provider.889<!-- forgecat:@forgecat/vercel-labs_agent-skills_composition-patterns:state-lift-state:end -->890
One repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| nota-america/forgecat-agent-profilesprofiles/addyosmani/agent-skills/for-cursor/.cursor/rules/cmd-build.mdc · 51 | Cursor rules | no sections | 16/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/addyosmani/agent-skills/for-cursor/.cursor/rules/cmd-code-simplify.mdc · 51 | Cursor rules | testing-strategy | 30/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/addyosmani/agent-skills/for-cursor/.cursor/rules/cmd-plan.mdc · 51 | Cursor rules | no sections | 16/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/addyosmani/agent-skills/for-cursor/.cursor/rules/cmd-review.mdc · 51 | Cursor rules | no sections | 16/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/addyosmani/agent-skills/for-cursor/.cursor/rules/cmd-ship.mdc · 51 | Cursor rules | testing-strategygitdeploymentdo-not | 61/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/addyosmani/agent-skills/for-cursor/.cursor/rules/cmd-spec.mdc · 51 | Cursor rules | no sections | 16/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/addyosmani/agent-skills/for-cursor/.cursor/rules/cmd-test.mdc · 51 | Cursor rules | no sections | 16/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/addyosmani/agent-skills/for-forgecat/AGENTS.md · 51 | AGENTS.md | lint-formatstylearchdo-not | 73/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/addyosmani/agent-skills/for-forgecat/CLAUDE.md · 51 | CLAUDE.md | teststylearchagent-behaviour | 70/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/anthropics/claude-code/anthropics_claude-code_ralph-wiggum/for-cursor/.cursor/rules/cmd-cancel-ralph.mdc · 51 | Cursor rules | no sections | 16/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/anthropics/claude-code/anthropics_claude-code_ralph-wiggum/for-cursor/.cursor/rules/cmd-help.mdc · 51 | Cursor rules | no sections | 54/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/anthropics/claude-code/anthropics_claude-code_ralph-wiggum/for-cursor/.cursor/rules/cmd-ralph-loop.mdc · 51 | Cursor rules | no sections | 22/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/anthropics/claude-plugins-official/anthropics_claude-plugins-official_agent-sdk-dev/for-cursor/.cursor/rules/cmd-new-sdk-app.mdc · 51 | Cursor rules | setupstylearchdocs | 76/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/anthropics/claude-plugins-official/anthropics_claude-plugins-official_claude-md-management/for-cursor/.cursor/rules/cmd-revise-claude-md.mdc · 51 | Cursor rules | agent-behaviour | 50/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/anthropics/claude-plugins-official/anthropics_claude-plugins-official_code-review/for-cursor/.cursor/rules/cmd-code-review.mdc · 51 | Cursor rules | testing-strategygit | 35/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/anthropics/claude-plugins-official/anthropics_claude-plugins-official_commit-commands/for-cursor/.cursor/rules/cmd-clean_gone.mdc · 51 | Cursor rules | no sections | 60/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/anthropics/claude-plugins-official/anthropics_claude-plugins-official_commit-commands/for-cursor/.cursor/rules/cmd-commit-push-pr.mdc · 51 | Cursor rules | stylegit | 44/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/anthropics/claude-plugins-official/anthropics_claude-plugins-official_commit-commands/for-cursor/.cursor/rules/cmd-commit.mdc · 51 | Cursor rules | style | 44/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/anthropics/claude-plugins-official/anthropics_claude-plugins-official_example-plugin/for-cursor/.cursor/rules/cmd-example-command.mdc · 51 | Cursor rules | lint-formatstyleagent-behaviour | 58/100 | today | |
| nota-america/forgecat-agent-profilesprofiles/anthropics/claude-plugins-official/anthropics_claude-plugins-official_feature-dev/for-cursor/.cursor/rules/cmd-feature-dev.mdc · 51 | Cursor rules | stylearchgit | 56/100 | today |
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| n8n-io/n8npackages/@n8n/agents/AGENTS.md · 201k | AGENTS.md | buildteststylearch+3 | 100/100 | 14 days ago | |
| aaif-goose/gooseAGENTS.md · 53k | AGENTS.md | setupbuildtestlint-format+7 | 100/100 | 8 days ago | |
| duckduckgo/content-scope-scriptsspecial-pages/AGENTS.md · 70 | AGENTS.md | buildteststylearch+3 | 100/100 | 14 days ago | |
| deepseek-ai/deepseek-harnessnative/landlock-run/AGENTS.md · 104k | AGENTS.md | setupteststylearch+3 | 100/100 | today | |
| code-yeongyu/oh-my-openagentpackages/web/AGENTS.md · 68k | AGENTS.md | setupbuildtestlint-format+6 | 100/100 | 13 days ago | |
| TryGhost/Ghoste2e/AGENTS.md · 55k | AGENTS.md | setupteststylearch+2 | 100/100 | today | |
| vllm-project/vllmAGENTS.md · 89k | AGENTS.md | setuptestlint-formatstyle+5 | 100/100 | 14 days ago | |
| mui/material-uiAGENTS.md · 99k | AGENTS.md | setupbuildtestlint-format+9 | 100/100 | 14 days ago |
A badge carrying the measured quality of the strongest agent config file in this repository, out of 100. It reads from this index every time somebody loads your page, so it changes when the measurement changes and there is nothing to keep up to date. Free, no account, and the value is not something you or we can set by hand.
[](https://rulestack.kynth.studio/configs/nota-america-forgecat-agent-profiles-profiles-vercel-labs-agent-skills-vercel-labs-agent-skills-composition-patterns-for-codex-agents)Would rather not hotlink us? Every badge is also served in shields.io’s endpoint schema, so shields renders the image and your readers never talk to our domain:
Published by Toolproof, the masthead over this index and eight others. The method behind the number is at toolproof.kynth.studio/methodology, and the whole thing is readable as JSON with no key at /api.