| js | No | view.js contents (enqueued in the footer). Omit to keep; delete with remove. | |
| css | No | style.css contents (enqueued when present). Omit to keep; delete with remove. | |
| php | No | The complete render.php contents. Required when creating; omit to keep. | |
| name | Yes | Bundle slug (lowercase, hyphens; the folder name). | |
| edits | No | Fragment replacements per file of the EXISTING bundle, instead of re-sending it. A file is sent whole OR edited, not both. | |
| hooks | No | hooks.php — PHP run on `init` before render, on every FRONT-END request (never admin, REST, cron or WP-CLI): the only place to touch the MAIN query (pre_get_posts); every callback guards is_admin(), is_main_query() and the exact view. Omit to keep; delete with remove. | |
| logic | No | How it WORKS: the query it runs, the URL params it reads, the meta keys, what an empty result renders. This is what the next session reads instead of your PHP. | |
| title | No | Human name shown in the pickers (default: the slug). | |
| remove | No | Files to delete: css, js, hooks. An EMPTY value ("") never deletes — it counts as not sent. render.php cannot be removed (delete the bundle instead). | |
| summary | Yes | REQUIRED on every save: what you did THIS save. Kept as the bundle history (last 10) — the next session reads it for context. | |
| contexts | No | Views this body was written for: "singular:post", "archive:project", "blog-home". A note for the next session and for list-*; nothing enforces it — the platform only checks singular-vs-archive when a rule is wired. | |
| requires | No | What it needs to work: {postTypes:[…], meta:[…]}. A note for whoever copies the bundle to another site; nothing checks it at runtime. | |
| description | No | What the page SHOWS — how the next session recognises it in a listing. | |
| expectedHash | No | `hash` from the get tool. If any file changed since, nothing is saved. | |