[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C4WZWYEMNDBAVG1WVM3K2C":3,"skill-same:01M6C4WZWYEMNDBAVG1WVM3K2C":175},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":30,"linkOnly":31,"markdownContent":32,"markdownBody":33,"frontMatter":34,"refName":35,"commitSha":36,"skillDirectory":37,"forksCount":38,"repositoryHtmlUrl":39,"repositoryHomepageUrl":6,"ownerHtmlUrl":40,"ownerBlogUrl":41,"ownerDescription":6,"updatedAt":42,"install":43,"resources":56},"01M6C4WZWYEMNDBAVG1WVM3K2C","rails",null,"Provides Rails reference distilled from 37signals' Fizzy: models, concerns, migrations, controllers, Hotwire, Solid Queue\u002FCache\u002FCable, Kamal, minitest. Use when working in a Rails codebase.","rubakas\u002Fagent-notes","rubakas","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F35782457?v=4","01M6C4THGGA9DDE6AAEF5SZF6V","01M6C4THN6FV04VNKF1NG01W68",4,"MIT","https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002FSKILL.md",[],[5,18,19,20,21,22,23,24,25,26,27,28,29],"use","hotwire","domain","migrations","models","codebase","solid","queue","reference","fizzy","cache","kamal","2026-11-10 10:12:30",false,"---\nname: rails\ngroup: domain\ndescription: \"Provides Rails reference distilled from 37signals' Fizzy: models, concerns, migrations, controllers, Hotwire, Solid Queue\u002FCache\u002FCable, Kamal, minitest. Use when working in a Rails codebase.\"\n---\n\n# Rails Reference\n\n## Rules\n\n- **Project RuboCop config wins.** Fizzy uses `rubocop-rails-omakase`, which enables neither `Style\u002FGuardClause` nor `Layout\u002FIndentationConsistency`, so lint enforces neither conditional style nor private indentation. Fizzy's STYLE.md is the 37signals default only when the project has no explicit rule; Fizzy's AGENTS.md calls its own instructions \"defaults with reasons, not law\". Use the project's `.rubocop.yml` to resolve ambiguities.\n- **Teach the project's Rails version.** Fizzy runs Rails main (`rails 8.2.0.alpha`) and a `turbo-rails` branch (Gemfile.lock). Mark Fizzy-specific APIs that need Rails main (e.g., `Turbo.offline`) where they appear, and do not use them in production.\n- **Concerns for shared model behaviour.** Put one capability of a model in a concern named for what it does (`Card::Closeable`), and behaviour shared by several models in `app\u002Fmodels\u002Fconcerns\u002F`. (Fizzy: `app\u002Fmodels\u002Fcard.rb` includes 23 concerns; `app\u002Fmodels\u002Fconcerns\u002F`)\n- **Vanilla CRUD: prefer a new resource over a custom action.** When an action doesn't fit a CRUD verb, introduce a resource (`resource :closure`) instead of a custom route (`post :close`). (Fizzy STYLE.md \"CRUD controllers\")\n- **Rich models, thin controllers, no service layer.** Call model methods directly from controllers; avoid services unless strictly necessary. (Fizzy STYLE.md \"Controller and model interactions\")\n- **No `default_scope`.** Scope explicitly through relationships (`Current.user.accessible_cards`). Fizzy defines no `default_scope`: a search of the repository at the pinned commit finds none. (Fizzy: `app\u002Fmodels\u002Fuser\u002Faccessor.rb`)\n- **`Current` for request-scoped context.** Keep the session, user and account in `Current` (`ActiveSupport::CurrentAttributes`) and default model arguments from it (`close(user: Current.user)`). (Fizzy: `app\u002Fmodels\u002Fcurrent.rb`, `app\u002Fmodels\u002Fcard\u002Fcloseable.rb`)\n- **Solid stack, not Redis, for new apps.** Use Solid Queue, Solid Cache and Solid Cable. Fizzy runs them on SQLite (`config\u002Fdatabase.sqlite.yml`) or MySQL (`config\u002Fdatabase.mysql.yml`) and its Gemfile has no Redis gem. Redis is optional only if the app already depends on it (Sidekiq, caching).\n- **Async work through `_later` plus shallow jobs.** A model method that enqueues a job ends in `_later`, and the job's `perform` calls a plain model method (`card.remove_inaccessible_notifications`). STYLE.md names a synchronous twin `*_now`; Fizzy's models do not define one. (Fizzy STYLE.md \"Run async operations in jobs\"; `app\u002Fjobs\u002Fcard\u002Fremove_inaccessible_notifications_job.rb`)\n- **Minitest and fixtures.** Fizzy uses Minitest (Rails default) and fixtures, with no factories: `test\u002Ffixtures\u002F` exists and the Gemfile has no RSpec or FactoryBot.\n- **ViewComponent only if the project already uses it.** Added by the owner, not from Fizzy\u002F37signals. Don't introduce it to projects that use partials: Fizzy renders with partials and helpers and has no `view_component` gem or `app\u002Fcomponents`.\n\nProvenance: distilled from Fizzy (github.com\u002Fbasecamp\u002Ffizzy) at commit 6aebc0cea63d0e5fcdd2eeea138072ddcb26be74, reviewed 2026-10-05.\nAlso drawn from Fizzy's STYLE.md, AGENTS.md and dev.37signals.com articles; ViewComponent (view-components.md) is not from Fizzy.\n\n### Models\n\n| File | Read when … |\n|---|---|\n| [models-structure.md](models-structure.md) | Setting up models, associations (including delegated types), file structure, and model templates |\n| [models-callbacks-jobs.md](models-callbacks-jobs.md) | Writing callbacks and enqueueing jobs from models via `_later` suffix |\n| [models-attributes.md](models-attributes.md) | Validating attributes, enums, serialization, secure tokens, Action Text, UUID primary keys |\n| [models-concerns.md](models-concerns.md) | Organizing model capabilities as concerns (feature and shared) |\n| [models-current-tenancy.md](models-current-tenancy.md) | Using `Current` attributes in models and controllers, account-scoped associations, global identity records |\n| [models-migrations.md](models-migrations.md) | Writing and structuring database migrations, indexes, foreign keys |\n\n### Controllers, Routes and Helpers\n\n| File | Read when … |\n|---|---|\n| [controllers-rest.md](controllers-rest.md) | Building REST controllers (CRUD, resource-action, nested), parameter handling, response patterns |\n| [controllers-errors-auth.md](controllers-errors-auth.md) | Error handling, performance, API patterns, security, authentication in controllers |\n| [routes.md](routes.md) | Routing: resources, custom routes, nested routes, namespaces, resource vs. custom action |\n| [helpers.md](helpers.md) | View helpers: application, domain-specific, form, time helpers and best practices |\n\n### Views and Frontend\n\n| File | Read when … |\n|---|---|\n| [views.md](views.md) | Writing ERB templates, partials, layouts, forms, helpers, and Jbuilder |\n| [view-caching.md](view-caching.md) | Fragment caching, HTTP caching with ETags, touch chains, Jbuilder caching |\n| [view-components.md](view-components.md) | Using ViewComponent (added by the owner, not from Fizzy\u002F37signals). Skip unless the project already uses it. |\n| [stimulus.md](stimulus.md) | Stimulus controllers: structure, patterns (auto-submit, keyboard, dialog, toggle), file organization |\n| [turbo.md](turbo.md) | Turbo Frames and Streams: lazy-load, morphing, refresh broadcasts, prefetch, view transitions |\n| [broadcasting.md](broadcasting.md) | Broadcasting model changes: `broadcasts_refreshes`, `*_later_to` methods, Solid Cable config, multi-tenant |\n| [importmap-assets.md](importmap-assets.md) | Importmap (JS pinning, audits), Propshaft (plain CSS, no build), Thruster (reverse proxy) |\n| [active-storage.md](active-storage.md) | File attachments: variants, validations, storage services (S3, local, GCS) |\n\n### Jobs, Mail and Storage\n\n| File | Read when … |\n|---|---|\n| [jobs.md](jobs.md) | Active Job and Solid Queue: job structure, `_later` jobs, recurring jobs, error handling, testing |\n| [mailers.md](mailers.md) | Action Mailer: structure, templates, previews, sending async, testing |\n\n### Infrastructure and Deploy\n\n| File | Read when … |\n|---|---|\n| [solid-stack.md](solid-stack.md) | Solid Queue, Solid Cache, Solid Cable: configuration, databases, migrations |\n| [deploy-kamal.md](deploy-kamal.md) | Kamal 2 deployment: config\u002Fdeploy.yml, Dockerfile, Thruster, entrypoint, secrets, hooks |\n| [config-and-lib.md](config-and-lib.md) | Initializers, lib\u002F structure, Rails extensions, custom libraries |\n| [multi-tenancy.md](multi-tenancy.md) | URL-based tenancy (the one home for tenancy code): routing, middleware, `Current`, tenant-aware mailers, cable, jobs, test setup |\n\n### Testing\n\n| File | Read when … |\n|---|---|\n| [testing-models-fixtures.md](testing-models-fixtures.md) | Model tests, fixtures, test structure, test helpers, running tests |\n| [testing-controllers.md](testing-controllers.md) | Controller and integration tests, permissions, response formats |\n| [testing-system-jobs-mailers.md](testing-system-jobs-mailers.md) | System tests (Capybara), job tests, mailer tests, helper tests |\n\n### Style and CI\n\n| File | Read when … |\n|---|---|\n| [code-style.md](code-style.md) | Code formatting: RuboCop config, conditionals, method order, bang methods, visibility |\n| [ci-and-linting.md](ci-and-linting.md) | CI setup, GitHub Actions, RuboCop configuration, pre-commit hooks |\n\n## Overlapping Files\n\n- **multi-tenancy.md** holds the tenancy code once (middleware, `Current`, `AccountTenanted`, test setup); **models-current-tenancy.md** covers `Current` use in models and controllers and account-scoped associations.\n- **models-callbacks-jobs.md** covers enqueueing jobs from models via `_later`; **jobs.md** covers job classes, queue configuration, and Solid Queue.\n","# Rails Reference\n\n## Rules\n\n- **Project RuboCop config wins.** Fizzy uses `rubocop-rails-omakase`, which enables neither `Style\u002FGuardClause` nor `Layout\u002FIndentationConsistency`, so lint enforces neither conditional style nor private indentation. Fizzy's STYLE.md is the 37signals default only when the project has no explicit rule; Fizzy's AGENTS.md calls its own instructions \"defaults with reasons, not law\". Use the project's `.rubocop.yml` to resolve ambiguities.\n- **Teach the project's Rails version.** Fizzy runs Rails main (`rails 8.2.0.alpha`) and a `turbo-rails` branch (Gemfile.lock). Mark Fizzy-specific APIs that need Rails main (e.g., `Turbo.offline`) where they appear, and do not use them in production.\n- **Concerns for shared model behaviour.** Put one capability of a model in a concern named for what it does (`Card::Closeable`), and behaviour shared by several models in `app\u002Fmodels\u002Fconcerns\u002F`. (Fizzy: `app\u002Fmodels\u002Fcard.rb` includes 23 concerns; `app\u002Fmodels\u002Fconcerns\u002F`)\n- **Vanilla CRUD: prefer a new resource over a custom action.** When an action doesn't fit a CRUD verb, introduce a resource (`resource :closure`) instead of a custom route (`post :close`). (Fizzy STYLE.md \"CRUD controllers\")\n- **Rich models, thin controllers, no service layer.** Call model methods directly from controllers; avoid services unless strictly necessary. (Fizzy STYLE.md \"Controller and model interactions\")\n- **No `default_scope`.** Scope explicitly through relationships (`Current.user.accessible_cards`). Fizzy defines no `default_scope`: a search of the repository at the pinned commit finds none. (Fizzy: `app\u002Fmodels\u002Fuser\u002Faccessor.rb`)\n- **`Current` for request-scoped context.** Keep the session, user and account in `Current` (`ActiveSupport::CurrentAttributes`) and default model arguments from it (`close(user: Current.user)`). (Fizzy: `app\u002Fmodels\u002Fcurrent.rb`, `app\u002Fmodels\u002Fcard\u002Fcloseable.rb`)\n- **Solid stack, not Redis, for new apps.** Use Solid Queue, Solid Cache and Solid Cable. Fizzy runs them on SQLite (`config\u002Fdatabase.sqlite.yml`) or MySQL (`config\u002Fdatabase.mysql.yml`) and its Gemfile has no Redis gem. Redis is optional only if the app already depends on it (Sidekiq, caching).\n- **Async work through `_later` plus shallow jobs.** A model method that enqueues a job ends in `_later`, and the job's `perform` calls a plain model method (`card.remove_inaccessible_notifications`). STYLE.md names a synchronous twin `*_now`; Fizzy's models do not define one. (Fizzy STYLE.md \"Run async operations in jobs\"; `app\u002Fjobs\u002Fcard\u002Fremove_inaccessible_notifications_job.rb`)\n- **Minitest and fixtures.** Fizzy uses Minitest (Rails default) and fixtures, with no factories: `test\u002Ffixtures\u002F` exists and the Gemfile has no RSpec or FactoryBot.\n- **ViewComponent only if the project already uses it.** Added by the owner, not from Fizzy\u002F37signals. Don't introduce it to projects that use partials: Fizzy renders with partials and helpers and has no `view_component` gem or `app\u002Fcomponents`.\n\nProvenance: distilled from Fizzy (github.com\u002Fbasecamp\u002Ffizzy) at commit 6aebc0cea63d0e5fcdd2eeea138072ddcb26be74, reviewed 2026-10-05.\nAlso drawn from Fizzy's STYLE.md, AGENTS.md and dev.37signals.com articles; ViewComponent (view-components.md) is not from Fizzy.\n\n### Models\n\n| File | Read when … |\n|---|---|\n| [models-structure.md](models-structure.md) | Setting up models, associations (including delegated types), file structure, and model templates |\n| [models-callbacks-jobs.md](models-callbacks-jobs.md) | Writing callbacks and enqueueing jobs from models via `_later` suffix |\n| [models-attributes.md](models-attributes.md) | Validating attributes, enums, serialization, secure tokens, Action Text, UUID primary keys |\n| [models-concerns.md](models-concerns.md) | Organizing model capabilities as concerns (feature and shared) |\n| [models-current-tenancy.md](models-current-tenancy.md) | Using `Current` attributes in models and controllers, account-scoped associations, global identity records |\n| [models-migrations.md](models-migrations.md) | Writing and structuring database migrations, indexes, foreign keys |\n\n### Controllers, Routes and Helpers\n\n| File | Read when … |\n|---|---|\n| [controllers-rest.md](controllers-rest.md) | Building REST controllers (CRUD, resource-action, nested), parameter handling, response patterns |\n| [controllers-errors-auth.md](controllers-errors-auth.md) | Error handling, performance, API patterns, security, authentication in controllers |\n| [routes.md](routes.md) | Routing: resources, custom routes, nested routes, namespaces, resource vs. custom action |\n| [helpers.md](helpers.md) | View helpers: application, domain-specific, form, time helpers and best practices |\n\n### Views and Frontend\n\n| File | Read when … |\n|---|---|\n| [views.md](views.md) | Writing ERB templates, partials, layouts, forms, helpers, and Jbuilder |\n| [view-caching.md](view-caching.md) | Fragment caching, HTTP caching with ETags, touch chains, Jbuilder caching |\n| [view-components.md](view-components.md) | Using ViewComponent (added by the owner, not from Fizzy\u002F37signals). Skip unless the project already uses it. |\n| [stimulus.md](stimulus.md) | Stimulus controllers: structure, patterns (auto-submit, keyboard, dialog, toggle), file organization |\n| [turbo.md](turbo.md) | Turbo Frames and Streams: lazy-load, morphing, refresh broadcasts, prefetch, view transitions |\n| [broadcasting.md](broadcasting.md) | Broadcasting model changes: `broadcasts_refreshes`, `*_later_to` methods, Solid Cable config, multi-tenant |\n| [importmap-assets.md](importmap-assets.md) | Importmap (JS pinning, audits), Propshaft (plain CSS, no build), Thruster (reverse proxy) |\n| [active-storage.md](active-storage.md) | File attachments: variants, validations, storage services (S3, local, GCS) |\n\n### Jobs, Mail and Storage\n\n| File | Read when … |\n|---|---|\n| [jobs.md](jobs.md) | Active Job and Solid Queue: job structure, `_later` jobs, recurring jobs, error handling, testing |\n| [mailers.md](mailers.md) | Action Mailer: structure, templates, previews, sending async, testing |\n\n### Infrastructure and Deploy\n\n| File | Read when … |\n|---|---|\n| [solid-stack.md](solid-stack.md) | Solid Queue, Solid Cache, Solid Cable: configuration, databases, migrations |\n| [deploy-kamal.md](deploy-kamal.md) | Kamal 2 deployment: config\u002Fdeploy.yml, Dockerfile, Thruster, entrypoint, secrets, hooks |\n| [config-and-lib.md](config-and-lib.md) | Initializers, lib\u002F structure, Rails extensions, custom libraries |\n| [multi-tenancy.md](multi-tenancy.md) | URL-based tenancy (the one home for tenancy code): routing, middleware, `Current`, tenant-aware mailers, cable, jobs, test setup |\n\n### Testing\n\n| File | Read when … |\n|---|---|\n| [testing-models-fixtures.md](testing-models-fixtures.md) | Model tests, fixtures, test structure, test helpers, running tests |\n| [testing-controllers.md](testing-controllers.md) | Controller and integration tests, permissions, response formats |\n| [testing-system-jobs-mailers.md](testing-system-jobs-mailers.md) | System tests (Capybara), job tests, mailer tests, helper tests |\n\n### Style and CI\n\n| File | Read when … |\n|---|---|\n| [code-style.md](code-style.md) | Code formatting: RuboCop config, conditionals, method order, bang methods, visibility |\n| [ci-and-linting.md](ci-and-linting.md) | CI setup, GitHub Actions, RuboCop configuration, pre-commit hooks |\n\n## Overlapping Files\n\n- **multi-tenancy.md** holds the tenancy code once (middleware, `Current`, `AccountTenanted`, test setup); **models-current-tenancy.md** covers `Current` use in models and controllers and account-scoped associations.\n- **models-callbacks-jobs.md** covers enqueueing jobs from models via `_later`; **jobs.md** covers job classes, queue configuration, and Solid Queue.\n",{"name":5,"group":20,"description":7},"main","2b53465943af2bdffb61667ba9c3377a2ea8e649","agent_notes\u002Fdata\u002Fskills\u002Frails",2,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes","https:\u002F\u002Fgithub.com\u002Frubakas","https:\u002F\u002Frubakas.com","2026-11-04 06:46:55",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add rubakas\u002Fagent-notes --skill rails",{"tool":49,"command":50},"bunx","bunx skills add rubakas\u002Fagent-notes --skill rails",{"tool":52,"command":53},"pnpm","pnpm dlx skills add rubakas\u002Fagent-notes --skill rails","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002FSKILL.md",true,[57,63,67,71,75,79,83,87,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171],{"path":58,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":62},"active-storage.md","REFERENCE","参考文档",10476,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Factive-storage.md",{"path":64,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":65,"sourceHtmlUrl":66},"broadcasting.md",6347,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fbroadcasting.md",{"path":68,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":69,"sourceHtmlUrl":70},"ci-and-linting.md",6061,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fci-and-linting.md",{"path":72,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":73,"sourceHtmlUrl":74},"code-style.md",4787,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fcode-style.md",{"path":76,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":77,"sourceHtmlUrl":78},"config-and-lib.md",4824,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fconfig-and-lib.md",{"path":80,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":81,"sourceHtmlUrl":82},"controllers-errors-auth.md",13712,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fcontrollers-errors-auth.md",{"path":84,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":85,"sourceHtmlUrl":86},"controllers-rest.md",12372,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fcontrollers-rest.md",{"path":88,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":89,"sourceHtmlUrl":90},"deploy-kamal.md",11908,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fdeploy-kamal.md",{"path":92,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":93,"sourceHtmlUrl":94},"helpers.md",6547,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fhelpers.md",{"path":96,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":97,"sourceHtmlUrl":98},"importmap-assets.md",4156,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fimportmap-assets.md",{"path":100,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":101,"sourceHtmlUrl":102},"jobs.md",11675,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fjobs.md",{"path":104,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":105,"sourceHtmlUrl":106},"mailers.md",8950,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fmailers.md",{"path":108,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":109,"sourceHtmlUrl":110},"models-attributes.md",9980,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fmodels-attributes.md",{"path":112,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":113,"sourceHtmlUrl":114},"models-callbacks-jobs.md",7293,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fmodels-callbacks-jobs.md",{"path":116,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":117,"sourceHtmlUrl":118},"models-concerns.md",8104,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fmodels-concerns.md",{"path":120,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":121,"sourceHtmlUrl":122},"models-current-tenancy.md",3863,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fmodels-current-tenancy.md",{"path":124,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":125,"sourceHtmlUrl":126},"models-migrations.md",10182,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fmodels-migrations.md",{"path":128,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":129,"sourceHtmlUrl":130},"models-structure.md",9599,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fmodels-structure.md",{"path":132,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":133,"sourceHtmlUrl":134},"multi-tenancy.md",8392,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fmulti-tenancy.md",{"path":136,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":137,"sourceHtmlUrl":138},"routes.md",8074,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Froutes.md",{"path":140,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":141,"sourceHtmlUrl":142},"solid-stack.md",6537,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fsolid-stack.md",{"path":144,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":145,"sourceHtmlUrl":146},"stimulus.md",6744,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fstimulus.md",{"path":148,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":149,"sourceHtmlUrl":150},"testing-controllers.md",8702,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Ftesting-controllers.md",{"path":152,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":153,"sourceHtmlUrl":154},"testing-models-fixtures.md",10498,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Ftesting-models-fixtures.md",{"path":156,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":157,"sourceHtmlUrl":158},"testing-system-jobs-mailers.md",11256,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Ftesting-system-jobs-mailers.md",{"path":160,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":161,"sourceHtmlUrl":162},"turbo.md",6284,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fturbo.md",{"path":164,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":165,"sourceHtmlUrl":166},"view-caching.md",3700,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fview-caching.md",{"path":168,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":169,"sourceHtmlUrl":170},"view-components.md",6549,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fview-components.md",{"path":172,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":173,"sourceHtmlUrl":174},"views.md",8856,"https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Frails\u002Fviews.md",[176,200,222,237,248,264],{"skillNo":177,"name":178,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":182,"publishedAt":30},"01M6M445BZF5CP0C4VCF538T36","security-audit","Audits a codebase for security vulnerabilities, independently verifies each one, and writes a report. Use when asked for a full, multi-phase codebase security audit or pen test, or for focused security guidance on code.","https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Fsecurity-audit\u002FSKILL.md",[],[183,184,185,186,187,188,189,18,190,191,192,193,194,23,195,196,197,198,199],"security audit","audit","security","codebase security audit","for","security guidance","true","code","multi","test","process","report","guidance","vulnerabilities","full","guide","path",{"skillNo":201,"name":202,"nameZh":6,"description":203,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":204,"categories":205,"keywords":206,"publishedAt":30},"01M6C4XHM2B03ZDXCSGE2MARZQ","wayfinder","Charts a map of investigation tickets on the issue tracker for work too big for one agent session, then resolves them one per session. Use when the user wants to wayfind a large loose idea or continue an existing wayfinder map.","https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Fwayfinder\u002FSKILL.md",[],[202,207,208,193,209,210,187,211,189,212,18,213,214,215,216,217,218,219,220,221],"investigation","work","session","Charts","continue","map","Existing","number","URL","tracker","tickets","issue","issue tracker","user","idea",{"skillNo":223,"name":224,"nameZh":6,"description":225,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":226,"categories":227,"keywords":228,"publishedAt":30},"01M6C4XFG6NNBQVTV6MHAC6BZW","triage","Triages issues and external PRs: categorises, verifies, grills if needed, and writes agent-ready briefs. Use when the user wants to triage the backlog or a specific issue or PR.","https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Ftriage\u002FSKILL.md",[],[224,229,193,230,231,232,233,234,189,218,235,18,236,220],"ready","issues","pr","backlog","at","prs","look","briefs",{"skillNo":238,"name":239,"nameZh":6,"description":240,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":241,"categories":242,"keywords":243,"publishedAt":30},"01M6C4XDMWQ5PM188GBGTAZ0A1","to-tickets","Breaks a plan, spec or conversation into tracer-bullet tickets, each declaring its blocking edges, and publishes them to the configured tracker. Use when the user wants a spec or plan turned into tickets or issues.","https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Fto-tickets\u002FSKILL.md",[],[244,217,245,193,246,220,247,230,189,18,214,215,216,218,199],"to tickets","plan","spec","conversation",{"skillNo":249,"name":250,"nameZh":6,"description":251,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":252,"categories":253,"keywords":254,"publishedAt":30},"01M6C4XBXCF4ZN71K05B76YT1F","to-spec","Turns the current conversation into a spec and publishes it to the project issue tracker, with no interview, only synthesis of what was discussed. Use when the user wants the discussion written up as a spec.","https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Fto-spec\u002FSKILL.md",[],[255,246,256,193,220,247,257,258,259,189,260,18,261,216,218,219,262,263,199],"to spec","interview","as","project","up","only","with","it","Synthesis",{"skillNo":265,"name":266,"nameZh":6,"description":267,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":268,"categories":269,"keywords":275,"publishedAt":30},"01M6C4X99BG4ENH8GE9AK67902","setup-agent-tracker","Configures a repo's issue tracker, triage label vocabulary and domain doc layout for the agent-notes workflow skills. Use when starting in a new repo, once, before triage, to-spec, to-tickets or wayfinder.","https:\u002F\u002Fgithub.com\u002Frubakas\u002Fagent-notes\u002Fblob\u002Fmain\u002Fagent_notes\u002Fdata\u002Fskills\u002Fsetup-agent-tracker\u002FSKILL.md",[270],{"categoryNo":271,"categoryName":272,"taxonomyType":273,"taxonomyTypeDesc":274},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[276,277,216,193,278,279,224,18,20,187,189,280,281,282,217,246,218,202,219,283],"setup agent tracker","setup","repo","doc","workflow","notes","layout","new repo"]