[{"data":1,"prerenderedAt":740},["ShallowReactive",2],{"navigation":3,"/tooling/ai-skills":259,"/tooling/ai-skills-surround":735},[4,16,56,104,140,151,235,239,243,247,251,255],{"title":5,"path":6,"stem":7,"children":8},"Getting Started","/getting-started","1.getting-started",[9,12],{"title":10,"path":6,"stem":11},"Introduction","1.getting-started/index",{"title":13,"path":14,"stem":15},"Installation","/getting-started/installation","1.getting-started/1.installation",{"title":17,"path":18,"stem":19,"children":20},"Essentials","/essentials","2.essentials",[21,24,28,32,36,40,44,48,52],{"title":22,"path":18,"stem":23},"Core concepts","2.essentials/index",{"title":25,"path":26,"stem":27},"Routing","/essentials/routing","2.essentials/1.routing",{"title":29,"path":30,"stem":31},"Authentication","/essentials/authentication","2.essentials/2.authentication",{"title":33,"path":34,"stem":35},"Identity & User Store","/essentials/identity","2.essentials/3.identity",{"title":37,"path":38,"stem":39},"Requests & Responses","/essentials/requests-responses","2.essentials/4.requests-responses",{"title":41,"path":42,"stem":43},"Controllers","/essentials/controllers","2.essentials/5.controllers",{"title":45,"path":46,"stem":47},"Database","/essentials/database","2.essentials/6.database",{"title":49,"path":50,"stem":51},"Validation","/essentials/validation","2.essentials/7.validation",{"title":53,"path":54,"stem":55},"Migrations","/essentials/migrations","2.essentials/8.migrations",{"title":57,"path":58,"stem":59,"children":60},"Features","/features","3.features",[61,64,68,72,76,80,84,88,92,96,100],{"title":62,"path":58,"stem":63},"Built‑in Capabilities","3.features/index",{"title":65,"path":66,"stem":67},"Caching","/features/caching","3.features/caching",{"title":69,"path":70,"stem":71},"CORS & CSRF","/features/cors-csrf","3.features/cors-csrf",{"title":73,"path":74,"stem":75},"Distributed Locks","/features/distributed-locks","3.features/distributed-locks",{"title":77,"path":78,"stem":79},"Events & Listeners","/features/events","3.features/events",{"title":81,"path":82,"stem":83},"Field Selection","/features/field-selection","3.features/field-selection",{"title":85,"path":86,"stem":87},"File Uploads","/features/file-uploads","3.features/file-uploads",{"title":89,"path":90,"stem":91},"Notifications","/features/notifications","3.features/notifications",{"title":93,"path":94,"stem":95},"Queues & Jobs","/features/queues-jobs","3.features/queues-jobs",{"title":97,"path":98,"stem":99},"Rate Limiting","/features/rate-limiting","3.features/rate-limiting",{"title":101,"path":102,"stem":103},"Task Scheduling","/features/scheduling","3.features/scheduling",{"title":105,"path":106,"stem":107,"children":108},"Advanced","/advanced","4.advanced",[109,112,116,120,124,128,132,136],{"title":110,"path":106,"stem":111},"Techniques and Patterns","4.advanced/index",{"title":113,"path":114,"stem":115},"Configuration","/advanced/configuration","4.advanced/configuration",{"title":117,"path":118,"stem":119},"Dependency Injection","/advanced/dependency-injection","4.advanced/dependency-injection",{"title":121,"path":122,"stem":123},"Middleware","/advanced/middleware","4.advanced/middleware",{"title":125,"path":126,"stem":127},"Performance","/advanced/performance","4.advanced/performance",{"title":129,"path":130,"stem":131},"Repositories","/advanced/repositories","4.advanced/repositories",{"title":133,"path":134,"stem":135},"Service Providers","/advanced/service-providers","4.advanced/service-providers",{"title":137,"path":138,"stem":139},"Testing","/advanced/testing","4.advanced/testing",{"title":141,"path":142,"stem":143,"children":144},"Overview","/tooling","5.tooling",[145,147],{"title":141,"path":142,"stem":146},"5.tooling/index",{"title":148,"path":149,"stem":150},"AI Skills","/tooling/ai-skills","5.tooling/1.ai-skills",{"title":152,"path":153,"stem":154,"children":155},"Cookbook","/cookbook","6.cookbook",[156,159,163,167,171,175,179,183,187,191,195,199,203,207,211,215,219,223,227,231],{"title":157,"path":153,"stem":158},"Recipes & How‑Tos","6.cookbook/index",{"title":160,"path":161,"stem":162},"Routing Recipes","/cookbook/routing","6.cookbook/1.routing",{"title":164,"path":165,"stem":166},"Caching Recipes","/cookbook/caching","6.cookbook/10.caching",{"title":168,"path":169,"stem":170},"Queue Infrastructure","/cookbook/queues-and-jobs","6.cookbook/11.queues-and-jobs",{"title":172,"path":173,"stem":174},"Notification Channels & Templates","/cookbook/notifications","6.cookbook/13.notifications",{"title":176,"path":177,"stem":178},"Storage","/cookbook/storage","6.cookbook/15.storage",{"title":180,"path":181,"stem":182},"Image Processing Examples","/cookbook/image-processing","6.cookbook/16.image-processing",{"title":184,"path":185,"stem":186},"Permissions and Authorization","/cookbook/permissions-and-authorization","6.cookbook/18.permissions-and-authorization",{"title":188,"path":189,"stem":190},"Session Analytics","/cookbook/sessions-analytics","6.cookbook/19.sessions-analytics",{"title":192,"path":193,"stem":194},"Writing Middleware","/cookbook/middleware","6.cookbook/2.middleware",{"title":196,"path":197,"stem":198},"API Metrics","/cookbook/api-metrics","6.cookbook/20.api-metrics",{"title":200,"path":201,"stem":202},"Performance Deep Dive","/cookbook/performance","6.cookbook/21.performance",{"title":204,"path":205,"stem":206},"Memory Management","/cookbook/memory-management","6.cookbook/22.memory-management",{"title":208,"path":209,"stem":210},"Writing Console Commands","/cookbook/console-commands","6.cookbook/23.console-commands",{"title":212,"path":213,"stem":214},"Glueful Extensions","/cookbook/extensions","6.cookbook/25.extensions",{"title":216,"path":217,"stem":218},"Error Handling Guide","/cookbook/error-handling","6.cookbook/4.error-handling",{"title":220,"path":221,"stem":222},"Security Guide","/cookbook/security","6.cookbook/5.security",{"title":224,"path":225,"stem":226},"Service Options Resolver","/cookbook/configuration","6.cookbook/6.configuration",{"title":228,"path":229,"stem":230},"Logging","/cookbook/logging","6.cookbook/7.logging",{"title":232,"path":233,"stem":234},"Database Advanced Features","/cookbook/database","6.cookbook/8.database",{"title":236,"path":237,"stem":238},"API Reference","/api-reference","7.api-reference",{"title":240,"path":241,"stem":242},"CLI Reference","/cli-reference","8.cli-reference",{"title":244,"path":245,"stem":246},"Extensions","/extensions","9.extensions",{"title":248,"path":249,"stem":250},"Contributing","/contributing","contributing",{"title":252,"path":253,"stem":254},"Release Notes","/releases","releases",{"title":256,"path":257,"stem":258},"Release Archive","/releases-archive","releases-archive",{"id":260,"title":148,"body":261,"description":729,"extension":730,"links":731,"meta":732,"navigation":382,"path":149,"seo":733,"stem":150,"__hash__":734},"docs/5.tooling/1.ai-skills.md",{"type":262,"value":263,"toc":720},"minimark",[264,268,284,292,297,303,307,312,319,463,467,470,478,482,684,699,703,716],[265,266,148],"h1",{"id":267},"ai-skills",[269,270,271,278,279,283],"p",{},[272,273,277],"a",{"href":274,"rel":275},"https://github.com/glueful/skills",[276],"nofollow","Glueful Skills"," is a set of official coding-assistant skills that teach AI agents Glueful's actual conventions — ",[280,281,282],"code",{},"ApplicationContext",", the framework helpers, the ORM and query builder, routing, events, and extensions — so they write idiomatic Glueful instead of guessing.",[269,285,286,287,291],{},"Compatible with ",[288,289,290],"strong",{},"Claude Code, Codex, Cursor",", and any agent SDK that reads the skills convention.",[293,294,296],"h2",{"id":295},"why","Why",[269,298,299,300,302],{},"Glueful has its own conventions — most calls take an ",[280,301,282],{},", the ORM and router have their own APIs, and there are no static facades. Without guidance an AI assistant tends to guess: it invents methods that don't exist, or assumes a familiar-looking one shares a signature it doesn't. These skills encode the framework's real patterns so your assistant writes correct Glueful from the first try, instead of code you have to unwind.",[293,304,306],{"id":305},"install","Install",[308,309,311],"h3",{"id":310},"universal-claude-code-codex-cursor","Universal (Claude Code, Codex, Cursor, …)",[269,313,314,315,318],{},"Uses the ",[280,316,317],{},"skills"," CLI to install into your agent's skills directory:",[320,321,326],"pre",{"className":322,"code":323,"language":324,"meta":325,"style":325},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark monokai","# All skills, universal install (writes to .agents/skills)\nnpx skills add glueful/skills --skill '*' --agent universal --yes\n\n# Or target a specific agent\nnpx skills add glueful/skills --skill '*' --agent claude-code --yes\nnpx skills add glueful/skills --skill '*' --agent codex --yes\n\n# Update later\nnpx skills update\n","bash","",[280,327,328,337,377,384,390,416,442,447,453],{"__ignoreMap":325},[329,330,333],"span",{"class":331,"line":332},"line",1,[329,334,336],{"class":335},"ss7Ak","# All skills, universal install (writes to .agents/skills)\n",[329,338,340,344,348,351,354,358,362,365,368,371,374],{"class":331,"line":339},2,[329,341,343],{"class":342},"sR7ES","npx",[329,345,347],{"class":346},"sLACW"," skills",[329,349,350],{"class":346}," add",[329,352,353],{"class":346}," glueful/skills",[329,355,357],{"class":356},"sFhLe"," --skill",[329,359,361],{"class":360},"siCPE"," '",[329,363,364],{"class":346},"*",[329,366,367],{"class":360},"'",[329,369,370],{"class":356}," --agent",[329,372,373],{"class":346}," universal",[329,375,376],{"class":356}," --yes\n",[329,378,380],{"class":331,"line":379},3,[329,381,383],{"emptyLinePlaceholder":382},true,"\n",[329,385,387],{"class":331,"line":386},4,[329,388,389],{"class":335},"# Or target a specific agent\n",[329,391,393,395,397,399,401,403,405,407,409,411,414],{"class":331,"line":392},5,[329,394,343],{"class":342},[329,396,347],{"class":346},[329,398,350],{"class":346},[329,400,353],{"class":346},[329,402,357],{"class":356},[329,404,361],{"class":360},[329,406,364],{"class":346},[329,408,367],{"class":360},[329,410,370],{"class":356},[329,412,413],{"class":346}," claude-code",[329,415,376],{"class":356},[329,417,419,421,423,425,427,429,431,433,435,437,440],{"class":331,"line":418},6,[329,420,343],{"class":342},[329,422,347],{"class":346},[329,424,350],{"class":346},[329,426,353],{"class":346},[329,428,357],{"class":356},[329,430,361],{"class":360},[329,432,364],{"class":346},[329,434,367],{"class":360},[329,436,370],{"class":356},[329,438,439],{"class":346}," codex",[329,441,376],{"class":356},[329,443,445],{"class":331,"line":444},7,[329,446,383],{"emptyLinePlaceholder":382},[329,448,450],{"class":331,"line":449},8,[329,451,452],{"class":335},"# Update later\n",[329,454,456,458,460],{"class":331,"line":455},9,[329,457,343],{"class":342},[329,459,347],{"class":346},[329,461,462],{"class":346}," update\n",[308,464,466],{"id":465},"claude-code-plugin","Claude Code plugin",[269,468,469],{},"The repo is also a self-contained Claude Code plugin marketplace:",[320,471,476],{"className":472,"code":474,"language":475},[473],"language-text","/plugin marketplace add glueful/skills\n/plugin install glueful-skills@glueful-skills\n","text",[280,477,474],{"__ignoreMap":325},[293,479,481],{"id":480},"whats-included","What's included",[483,484,485,498],"table",{},[486,487,488],"thead",{},[489,490,491,495],"tr",{},[492,493,494],"th",{},"Skill",[492,496,497],{},"Use when",[499,500,501,512,522,540,550,560,586,608,622,640,654],"tbody",{},[489,502,503,509],{},[504,505,506],"td",{},[280,507,508],{},"using-glueful",[504,510,511],{},"Writing or modifying any PHP in a Glueful project — the baseline framework conventions every other skill builds on.",[489,513,514,519],{},[504,515,516],{},[280,517,518],{},"glueful-architect-app",[504,520,521],{},"Deciding where code belongs — the layered controllers → DTOs → services → repositories/contracts → models map.",[489,523,524,529],{},[504,525,526],{},[280,527,528],{},"glueful-add-controller",[504,530,531,532,535,536,539],{},"Building API endpoints — ",[280,533,534],{},"BaseController",", reading/validating input, the authenticated-user context, the ",[280,537,538],{},"Response"," envelope.",[489,541,542,547],{},[504,543,544],{},[280,545,546],{},"glueful-add-route",[504,548,549],{},"Registering & documenting routes — the fluent router, groups, attribute routing, middleware, and the OpenAPI docblocks that generate the spec/SDK.",[489,551,552,557],{},[504,553,554],{},[280,555,556],{},"glueful-build-orm-query",[504,558,559],{},"Querying/persisting with the ORM — context-first Model statics, the Builder, eager loading, relations, N+1 safety, and result caching.",[489,561,562,567],{},[504,563,564],{},[280,565,566],{},"glueful-build-validation-dto",[504,568,569,570,573,574,577,578,581,582,585],{},"Validating/normalizing request input — a ",[280,571,572],{},"final"," DTO + ",[280,575,576],{},"Validator"," rule map, ",[280,579,580],{},"ValidationException",", and custom ",[280,583,584],{},"Rule"," classes.",[489,587,588,593],{},[504,589,590],{},[280,591,592],{},"glueful-write-migration",[504,594,595,596,599,600,603,604,607],{},"Adding or changing schema — ",[280,597,598],{},"MigrationInterface"," + the schema builder, idempotency guards, a working ",[280,601,602],{},"down()",", and the version-safe ",[280,605,606],{},"alterTable"," form.",[489,609,610,615],{},[504,611,612],{},[280,613,614],{},"glueful-add-filter",[504,616,617,618,621],{},"List-endpoint filtering/sorting/search — a ",[280,619,620],{},"QueryFilter"," subclass with filterable/sortable/searchable allow-lists.",[489,623,624,629],{},[504,625,626],{},[280,627,628],{},"glueful-add-event-listener-job",[504,630,631,632,635,636,639],{},"Side effects — define a ",[280,633,634],{},"BaseEvent",", dispatch from a service, handle via a subscriber, and defer heavy work to a queued ",[280,637,638],{},"Job",".",[489,641,642,647],{},[504,643,644],{},[280,645,646],{},"glueful-write-test",[504,648,649,650,653],{},"Writing PHPUnit tests — the SQLite-backed ",[280,651,652],{},"Connection"," harness, mocking framework services, and the TDD loop.",[489,655,656,661],{},[504,657,658],{},[280,659,660],{},"glueful-create-extension",[504,662,663,664,667,668,671,672,675,676,679,680,683],{},"Packaging an extension — the ",[280,665,666],{},"glueful-extension"," manifest, ",[280,669,670],{},"ServiceProvider",", static ",[280,673,674],{},"services()"," DI, and the ",[280,677,678],{},"register()","/",[280,681,682],{},"boot()"," lifecycle.",[269,685,686,687,694,695,698],{},"The ",[272,688,690,693],{"href":274,"rel":689},[276],[280,691,692],{},"glueful/skills"," repository"," is the canonical, always-current list. Skills target framework ",[288,696,697],{},"conventions"," and are updated when those conventions change between releases, so install from the repo to stay current.",[293,700,702],{"id":701},"related","Related",[704,705,706,712],"ul",{},[707,708,709,711],"li",{},[272,710,244],{"href":245}," — runtime packages you install into your app (distinct from these editor-time skills)",[707,713,714],{},[272,715,5],{"href":6},[717,718,719],"style",{},"html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}html pre.shiki code .sR7ES, html code.shiki .sR7ES{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sFhLe, html code.shiki .sFhLe{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":325,"searchDepth":332,"depth":339,"links":721},[722,723,727,728],{"id":295,"depth":339,"text":296},{"id":305,"depth":339,"text":306,"children":724},[725,726],{"id":310,"depth":379,"text":311},{"id":465,"depth":379,"text":466},{"id":480,"depth":339,"text":481},{"id":701,"depth":339,"text":702},"Official Glueful coding-assistant skills — teach Claude, Codex, and Cursor the framework's real conventions so they stop inventing APIs that don't exist.","md",null,{},{"title":148,"description":729},"ErFC04O_erYjqDfVaUbI9EsnUJzWlAVaoOmfX5N0mDY",[736,738],{"title":141,"path":142,"stem":146,"description":737,"children":-1},"Developer tooling for building with Glueful — official AI coding-assistant skills.",{"title":157,"path":153,"stem":158,"description":739,"children":-1},"Practical recipes for common tasks",1780958513520]