diff --git a/blog-cloudflare/.agents/skills/creating-plugins/references/hooks.md b/blog-cloudflare/.agents/skills/creating-plugins/references/hooks.md index c8ba16e..2a1532d 100644 --- a/blog-cloudflare/.agents/skills/creating-plugins/references/hooks.md +++ b/blog-cloudflare/.agents/skills/creating-plugins/references/hooks.md @@ -189,6 +189,45 @@ Runs after content is unpublished (reverted to draft). Side effects only. Event: `{ content: Record, collection: string }` Returns: `void` +### `content:afterRestore` + +Runs after trashed content is restored. Side effects only. + +```typescript +"content:afterRestore": async (event, ctx) => { + ctx.log.info(`Restored ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterSchedule` + +Runs after content is scheduled for future publishing. Side effects only. + +```typescript +"content:afterSchedule": async (event, ctx) => { + ctx.log.info(`Scheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterUnschedule` + +Runs after scheduled content is unscheduled. Side effects only. + +```typescript +"content:afterUnschedule": async (event, ctx) => { + ctx.log.info(`Unscheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + ## Media Hooks ### `media:beforeUpload` @@ -418,23 +457,26 @@ Use `"continue"` for non-critical operations (analytics, notifications, external ## Quick Reference -| Hook | Trigger | Capability Required | Return | -| ------------------------ | -------------------- | -------------------------------- | ---------------------------- | -| `plugin:install` | First install | — | `void` | -| `plugin:activate` | Plugin enabled | — | `void` | -| `plugin:deactivate` | Plugin disabled | — | `void` | -| `plugin:uninstall` | Plugin removed | — | `void` | -| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | -| `content:afterSave` | After save | `content:read` | `void` | -| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | -| `content:afterDelete` | After delete | `content:read` | `void` | -| `content:afterPublish` | After publish | `content:read` | `void` | -| `content:afterUnpublish` | After unpublish | `content:read` | `void` | -| `media:beforeUpload` | Before upload | — | Modified file info or `void` | -| `media:afterUpload` | After upload | — | `void` | -| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | -| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | -| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | -| `cron` | Scheduled task fires | — | `void` | -| `page:metadata` | Page render | — | Metadata contributions | -| `page:fragments` | Page render | — (trusted only) | Fragment contributions | +| Hook | Trigger | Capability Required | Return | +| ------------------------- | -------------------- | -------------------------------- | ---------------------------- | +| `plugin:install` | First install | — | `void` | +| `plugin:activate` | Plugin enabled | — | `void` | +| `plugin:deactivate` | Plugin disabled | — | `void` | +| `plugin:uninstall` | Plugin removed | — | `void` | +| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | +| `content:afterSave` | After save | `content:read` | `void` | +| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | +| `content:afterDelete` | After delete | `content:read` | `void` | +| `content:afterPublish` | After publish | `content:read` | `void` | +| `content:afterUnpublish` | After unpublish | `content:read` | `void` | +| `content:afterRestore` | After restore | `content:read` | `void` | +| `content:afterSchedule` | After schedule | `content:read` | `void` | +| `content:afterUnschedule` | After unschedule | `content:read` | `void` | +| `media:beforeUpload` | Before upload | — | Modified file info or `void` | +| `media:afterUpload` | After upload | — | `void` | +| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | +| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | +| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | +| `cron` | Scheduled task fires | — | `void` | +| `page:metadata` | Page render | — | Metadata contributions | +| `page:fragments` | Page render | — (trusted only) | Fragment contributions | diff --git a/blog-cloudflare/package.json b/blog-cloudflare/package.json index c3f8196..f249194 100644 --- a/blog-cloudflare/package.json +++ b/blog-cloudflare/package.json @@ -16,11 +16,11 @@ "dependencies": { "@astrojs/cloudflare": "^14.0.0", "@astrojs/react": "^6.0.0", - "@emdash-cms/cloudflare": "^0.24.1", + "@emdash-cms/cloudflare": "^0.26.0", "@emdash-cms/plugin-forms": "^0.2.4", "@emdash-cms/plugin-webhook-notifier": "^0.2.0", "astro": "^7.0.0", - "emdash": "^0.24.1", + "emdash": "^0.26.0", "react": "19.2.4", "react-dom": "19.2.4" }, @@ -29,5 +29,5 @@ "@cloudflare/workers-types": "^4.20260305.1", "wrangler": "^4.99.0" }, - "packageManager": "pnpm@11.1.3+sha512.c85357fe17ca12dd23dd7071822666dfd7e3cb76fe214e3370b5ea2fb34f2a231185509b63e717f3cd0acb38dd3f8d82bcd5e8172400ae678b70ea4fbed0896d" + "packageManager": "pnpm@11.9.0+sha512.bd682d5d03fe525ef7c9fd6780c6884d1e756ac4c9c9fe00c538782824310dcf90e3ddc4f53835f06dfaebd5085e41855e0bcbb3b60de2ac5bbab89e5036f03b" } diff --git a/blog/.agents/skills/creating-plugins/references/hooks.md b/blog/.agents/skills/creating-plugins/references/hooks.md index c8ba16e..2a1532d 100644 --- a/blog/.agents/skills/creating-plugins/references/hooks.md +++ b/blog/.agents/skills/creating-plugins/references/hooks.md @@ -189,6 +189,45 @@ Runs after content is unpublished (reverted to draft). Side effects only. Event: `{ content: Record, collection: string }` Returns: `void` +### `content:afterRestore` + +Runs after trashed content is restored. Side effects only. + +```typescript +"content:afterRestore": async (event, ctx) => { + ctx.log.info(`Restored ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterSchedule` + +Runs after content is scheduled for future publishing. Side effects only. + +```typescript +"content:afterSchedule": async (event, ctx) => { + ctx.log.info(`Scheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterUnschedule` + +Runs after scheduled content is unscheduled. Side effects only. + +```typescript +"content:afterUnschedule": async (event, ctx) => { + ctx.log.info(`Unscheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + ## Media Hooks ### `media:beforeUpload` @@ -418,23 +457,26 @@ Use `"continue"` for non-critical operations (analytics, notifications, external ## Quick Reference -| Hook | Trigger | Capability Required | Return | -| ------------------------ | -------------------- | -------------------------------- | ---------------------------- | -| `plugin:install` | First install | — | `void` | -| `plugin:activate` | Plugin enabled | — | `void` | -| `plugin:deactivate` | Plugin disabled | — | `void` | -| `plugin:uninstall` | Plugin removed | — | `void` | -| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | -| `content:afterSave` | After save | `content:read` | `void` | -| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | -| `content:afterDelete` | After delete | `content:read` | `void` | -| `content:afterPublish` | After publish | `content:read` | `void` | -| `content:afterUnpublish` | After unpublish | `content:read` | `void` | -| `media:beforeUpload` | Before upload | — | Modified file info or `void` | -| `media:afterUpload` | After upload | — | `void` | -| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | -| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | -| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | -| `cron` | Scheduled task fires | — | `void` | -| `page:metadata` | Page render | — | Metadata contributions | -| `page:fragments` | Page render | — (trusted only) | Fragment contributions | +| Hook | Trigger | Capability Required | Return | +| ------------------------- | -------------------- | -------------------------------- | ---------------------------- | +| `plugin:install` | First install | — | `void` | +| `plugin:activate` | Plugin enabled | — | `void` | +| `plugin:deactivate` | Plugin disabled | — | `void` | +| `plugin:uninstall` | Plugin removed | — | `void` | +| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | +| `content:afterSave` | After save | `content:read` | `void` | +| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | +| `content:afterDelete` | After delete | `content:read` | `void` | +| `content:afterPublish` | After publish | `content:read` | `void` | +| `content:afterUnpublish` | After unpublish | `content:read` | `void` | +| `content:afterRestore` | After restore | `content:read` | `void` | +| `content:afterSchedule` | After schedule | `content:read` | `void` | +| `content:afterUnschedule` | After unschedule | `content:read` | `void` | +| `media:beforeUpload` | Before upload | — | Modified file info or `void` | +| `media:afterUpload` | After upload | — | `void` | +| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | +| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | +| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | +| `cron` | Scheduled task fires | — | `void` | +| `page:metadata` | Page render | — | Metadata contributions | +| `page:fragments` | Page render | — (trusted only) | Fragment contributions | diff --git a/blog/package.json b/blog/package.json index 4121bf2..9808b88 100644 --- a/blog/package.json +++ b/blog/package.json @@ -19,12 +19,12 @@ "@emdash-cms/plugin-audit-log": "^0.2.0", "astro": "^7.0.0", "better-sqlite3": "^12.8.0", - "emdash": "^0.24.1", + "emdash": "^0.26.0", "react": "19.2.4", "react-dom": "19.2.4" }, "devDependencies": { "@astrojs/check": "^0.9.7" }, - "packageManager": "pnpm@11.1.3+sha512.c85357fe17ca12dd23dd7071822666dfd7e3cb76fe214e3370b5ea2fb34f2a231185509b63e717f3cd0acb38dd3f8d82bcd5e8172400ae678b70ea4fbed0896d" + "packageManager": "pnpm@11.9.0+sha512.bd682d5d03fe525ef7c9fd6780c6884d1e756ac4c9c9fe00c538782824310dcf90e3ddc4f53835f06dfaebd5085e41855e0bcbb3b60de2ac5bbab89e5036f03b" } diff --git a/marketing-cloudflare/.agents/skills/creating-plugins/references/hooks.md b/marketing-cloudflare/.agents/skills/creating-plugins/references/hooks.md index c8ba16e..2a1532d 100644 --- a/marketing-cloudflare/.agents/skills/creating-plugins/references/hooks.md +++ b/marketing-cloudflare/.agents/skills/creating-plugins/references/hooks.md @@ -189,6 +189,45 @@ Runs after content is unpublished (reverted to draft). Side effects only. Event: `{ content: Record, collection: string }` Returns: `void` +### `content:afterRestore` + +Runs after trashed content is restored. Side effects only. + +```typescript +"content:afterRestore": async (event, ctx) => { + ctx.log.info(`Restored ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterSchedule` + +Runs after content is scheduled for future publishing. Side effects only. + +```typescript +"content:afterSchedule": async (event, ctx) => { + ctx.log.info(`Scheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterUnschedule` + +Runs after scheduled content is unscheduled. Side effects only. + +```typescript +"content:afterUnschedule": async (event, ctx) => { + ctx.log.info(`Unscheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + ## Media Hooks ### `media:beforeUpload` @@ -418,23 +457,26 @@ Use `"continue"` for non-critical operations (analytics, notifications, external ## Quick Reference -| Hook | Trigger | Capability Required | Return | -| ------------------------ | -------------------- | -------------------------------- | ---------------------------- | -| `plugin:install` | First install | — | `void` | -| `plugin:activate` | Plugin enabled | — | `void` | -| `plugin:deactivate` | Plugin disabled | — | `void` | -| `plugin:uninstall` | Plugin removed | — | `void` | -| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | -| `content:afterSave` | After save | `content:read` | `void` | -| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | -| `content:afterDelete` | After delete | `content:read` | `void` | -| `content:afterPublish` | After publish | `content:read` | `void` | -| `content:afterUnpublish` | After unpublish | `content:read` | `void` | -| `media:beforeUpload` | Before upload | — | Modified file info or `void` | -| `media:afterUpload` | After upload | — | `void` | -| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | -| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | -| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | -| `cron` | Scheduled task fires | — | `void` | -| `page:metadata` | Page render | — | Metadata contributions | -| `page:fragments` | Page render | — (trusted only) | Fragment contributions | +| Hook | Trigger | Capability Required | Return | +| ------------------------- | -------------------- | -------------------------------- | ---------------------------- | +| `plugin:install` | First install | — | `void` | +| `plugin:activate` | Plugin enabled | — | `void` | +| `plugin:deactivate` | Plugin disabled | — | `void` | +| `plugin:uninstall` | Plugin removed | — | `void` | +| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | +| `content:afterSave` | After save | `content:read` | `void` | +| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | +| `content:afterDelete` | After delete | `content:read` | `void` | +| `content:afterPublish` | After publish | `content:read` | `void` | +| `content:afterUnpublish` | After unpublish | `content:read` | `void` | +| `content:afterRestore` | After restore | `content:read` | `void` | +| `content:afterSchedule` | After schedule | `content:read` | `void` | +| `content:afterUnschedule` | After unschedule | `content:read` | `void` | +| `media:beforeUpload` | Before upload | — | Modified file info or `void` | +| `media:afterUpload` | After upload | — | `void` | +| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | +| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | +| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | +| `cron` | Scheduled task fires | — | `void` | +| `page:metadata` | Page render | — | Metadata contributions | +| `page:fragments` | Page render | — (trusted only) | Fragment contributions | diff --git a/marketing-cloudflare/package.json b/marketing-cloudflare/package.json index 957ce1c..cb972b9 100644 --- a/marketing-cloudflare/package.json +++ b/marketing-cloudflare/package.json @@ -16,11 +16,11 @@ "dependencies": { "@astrojs/cloudflare": "^14.0.0", "@astrojs/react": "^6.0.0", - "@emdash-cms/cloudflare": "^0.24.1", + "@emdash-cms/cloudflare": "^0.26.0", "@iconify-json/ph": "^1.2.2", "astro": "^7.0.0", "astro-iconset": "^0.0.4", - "emdash": "^0.24.1", + "emdash": "^0.26.0", "react": "19.2.4", "react-dom": "19.2.4" }, @@ -29,5 +29,5 @@ "@cloudflare/workers-types": "^4.20260305.1", "wrangler": "^4.99.0" }, - "packageManager": "pnpm@11.1.3+sha512.c85357fe17ca12dd23dd7071822666dfd7e3cb76fe214e3370b5ea2fb34f2a231185509b63e717f3cd0acb38dd3f8d82bcd5e8172400ae678b70ea4fbed0896d" + "packageManager": "pnpm@11.9.0+sha512.bd682d5d03fe525ef7c9fd6780c6884d1e756ac4c9c9fe00c538782824310dcf90e3ddc4f53835f06dfaebd5085e41855e0bcbb3b60de2ac5bbab89e5036f03b" } diff --git a/marketing/.agents/skills/creating-plugins/references/hooks.md b/marketing/.agents/skills/creating-plugins/references/hooks.md index c8ba16e..2a1532d 100644 --- a/marketing/.agents/skills/creating-plugins/references/hooks.md +++ b/marketing/.agents/skills/creating-plugins/references/hooks.md @@ -189,6 +189,45 @@ Runs after content is unpublished (reverted to draft). Side effects only. Event: `{ content: Record, collection: string }` Returns: `void` +### `content:afterRestore` + +Runs after trashed content is restored. Side effects only. + +```typescript +"content:afterRestore": async (event, ctx) => { + ctx.log.info(`Restored ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterSchedule` + +Runs after content is scheduled for future publishing. Side effects only. + +```typescript +"content:afterSchedule": async (event, ctx) => { + ctx.log.info(`Scheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterUnschedule` + +Runs after scheduled content is unscheduled. Side effects only. + +```typescript +"content:afterUnschedule": async (event, ctx) => { + ctx.log.info(`Unscheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + ## Media Hooks ### `media:beforeUpload` @@ -418,23 +457,26 @@ Use `"continue"` for non-critical operations (analytics, notifications, external ## Quick Reference -| Hook | Trigger | Capability Required | Return | -| ------------------------ | -------------------- | -------------------------------- | ---------------------------- | -| `plugin:install` | First install | — | `void` | -| `plugin:activate` | Plugin enabled | — | `void` | -| `plugin:deactivate` | Plugin disabled | — | `void` | -| `plugin:uninstall` | Plugin removed | — | `void` | -| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | -| `content:afterSave` | After save | `content:read` | `void` | -| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | -| `content:afterDelete` | After delete | `content:read` | `void` | -| `content:afterPublish` | After publish | `content:read` | `void` | -| `content:afterUnpublish` | After unpublish | `content:read` | `void` | -| `media:beforeUpload` | Before upload | — | Modified file info or `void` | -| `media:afterUpload` | After upload | — | `void` | -| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | -| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | -| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | -| `cron` | Scheduled task fires | — | `void` | -| `page:metadata` | Page render | — | Metadata contributions | -| `page:fragments` | Page render | — (trusted only) | Fragment contributions | +| Hook | Trigger | Capability Required | Return | +| ------------------------- | -------------------- | -------------------------------- | ---------------------------- | +| `plugin:install` | First install | — | `void` | +| `plugin:activate` | Plugin enabled | — | `void` | +| `plugin:deactivate` | Plugin disabled | — | `void` | +| `plugin:uninstall` | Plugin removed | — | `void` | +| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | +| `content:afterSave` | After save | `content:read` | `void` | +| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | +| `content:afterDelete` | After delete | `content:read` | `void` | +| `content:afterPublish` | After publish | `content:read` | `void` | +| `content:afterUnpublish` | After unpublish | `content:read` | `void` | +| `content:afterRestore` | After restore | `content:read` | `void` | +| `content:afterSchedule` | After schedule | `content:read` | `void` | +| `content:afterUnschedule` | After unschedule | `content:read` | `void` | +| `media:beforeUpload` | Before upload | — | Modified file info or `void` | +| `media:afterUpload` | After upload | — | `void` | +| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | +| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | +| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | +| `cron` | Scheduled task fires | — | `void` | +| `page:metadata` | Page render | — | Metadata contributions | +| `page:fragments` | Page render | — (trusted only) | Fragment contributions | diff --git a/marketing/package.json b/marketing/package.json index 4ceef89..69dcdf5 100644 --- a/marketing/package.json +++ b/marketing/package.json @@ -20,12 +20,12 @@ "astro": "^7.0.0", "astro-iconset": "^0.0.4", "better-sqlite3": "^12.8.0", - "emdash": "^0.24.1", + "emdash": "^0.26.0", "react": "19.2.4", "react-dom": "19.2.4" }, "devDependencies": { "@astrojs/check": "^0.9.7" }, - "packageManager": "pnpm@11.1.3+sha512.c85357fe17ca12dd23dd7071822666dfd7e3cb76fe214e3370b5ea2fb34f2a231185509b63e717f3cd0acb38dd3f8d82bcd5e8172400ae678b70ea4fbed0896d" + "packageManager": "pnpm@11.9.0+sha512.bd682d5d03fe525ef7c9fd6780c6884d1e756ac4c9c9fe00c538782824310dcf90e3ddc4f53835f06dfaebd5085e41855e0bcbb3b60de2ac5bbab89e5036f03b" } diff --git a/portfolio-cloudflare/.agents/skills/creating-plugins/references/hooks.md b/portfolio-cloudflare/.agents/skills/creating-plugins/references/hooks.md index c8ba16e..2a1532d 100644 --- a/portfolio-cloudflare/.agents/skills/creating-plugins/references/hooks.md +++ b/portfolio-cloudflare/.agents/skills/creating-plugins/references/hooks.md @@ -189,6 +189,45 @@ Runs after content is unpublished (reverted to draft). Side effects only. Event: `{ content: Record, collection: string }` Returns: `void` +### `content:afterRestore` + +Runs after trashed content is restored. Side effects only. + +```typescript +"content:afterRestore": async (event, ctx) => { + ctx.log.info(`Restored ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterSchedule` + +Runs after content is scheduled for future publishing. Side effects only. + +```typescript +"content:afterSchedule": async (event, ctx) => { + ctx.log.info(`Scheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterUnschedule` + +Runs after scheduled content is unscheduled. Side effects only. + +```typescript +"content:afterUnschedule": async (event, ctx) => { + ctx.log.info(`Unscheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + ## Media Hooks ### `media:beforeUpload` @@ -418,23 +457,26 @@ Use `"continue"` for non-critical operations (analytics, notifications, external ## Quick Reference -| Hook | Trigger | Capability Required | Return | -| ------------------------ | -------------------- | -------------------------------- | ---------------------------- | -| `plugin:install` | First install | — | `void` | -| `plugin:activate` | Plugin enabled | — | `void` | -| `plugin:deactivate` | Plugin disabled | — | `void` | -| `plugin:uninstall` | Plugin removed | — | `void` | -| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | -| `content:afterSave` | After save | `content:read` | `void` | -| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | -| `content:afterDelete` | After delete | `content:read` | `void` | -| `content:afterPublish` | After publish | `content:read` | `void` | -| `content:afterUnpublish` | After unpublish | `content:read` | `void` | -| `media:beforeUpload` | Before upload | — | Modified file info or `void` | -| `media:afterUpload` | After upload | — | `void` | -| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | -| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | -| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | -| `cron` | Scheduled task fires | — | `void` | -| `page:metadata` | Page render | — | Metadata contributions | -| `page:fragments` | Page render | — (trusted only) | Fragment contributions | +| Hook | Trigger | Capability Required | Return | +| ------------------------- | -------------------- | -------------------------------- | ---------------------------- | +| `plugin:install` | First install | — | `void` | +| `plugin:activate` | Plugin enabled | — | `void` | +| `plugin:deactivate` | Plugin disabled | — | `void` | +| `plugin:uninstall` | Plugin removed | — | `void` | +| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | +| `content:afterSave` | After save | `content:read` | `void` | +| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | +| `content:afterDelete` | After delete | `content:read` | `void` | +| `content:afterPublish` | After publish | `content:read` | `void` | +| `content:afterUnpublish` | After unpublish | `content:read` | `void` | +| `content:afterRestore` | After restore | `content:read` | `void` | +| `content:afterSchedule` | After schedule | `content:read` | `void` | +| `content:afterUnschedule` | After unschedule | `content:read` | `void` | +| `media:beforeUpload` | Before upload | — | Modified file info or `void` | +| `media:afterUpload` | After upload | — | `void` | +| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | +| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | +| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | +| `cron` | Scheduled task fires | — | `void` | +| `page:metadata` | Page render | — | Metadata contributions | +| `page:fragments` | Page render | — (trusted only) | Fragment contributions | diff --git a/portfolio-cloudflare/package.json b/portfolio-cloudflare/package.json index 513dcbb..fca6573 100644 --- a/portfolio-cloudflare/package.json +++ b/portfolio-cloudflare/package.json @@ -16,9 +16,9 @@ "dependencies": { "@astrojs/cloudflare": "^14.0.0", "@astrojs/react": "^6.0.0", - "@emdash-cms/cloudflare": "^0.24.1", + "@emdash-cms/cloudflare": "^0.26.0", "astro": "^7.0.0", - "emdash": "^0.24.1", + "emdash": "^0.26.0", "react": "19.2.4", "react-dom": "19.2.4" }, @@ -27,5 +27,5 @@ "@cloudflare/workers-types": "^4.20260305.1", "wrangler": "^4.99.0" }, - "packageManager": "pnpm@11.1.3+sha512.c85357fe17ca12dd23dd7071822666dfd7e3cb76fe214e3370b5ea2fb34f2a231185509b63e717f3cd0acb38dd3f8d82bcd5e8172400ae678b70ea4fbed0896d" + "packageManager": "pnpm@11.9.0+sha512.bd682d5d03fe525ef7c9fd6780c6884d1e756ac4c9c9fe00c538782824310dcf90e3ddc4f53835f06dfaebd5085e41855e0bcbb3b60de2ac5bbab89e5036f03b" } diff --git a/portfolio/.agents/skills/creating-plugins/references/hooks.md b/portfolio/.agents/skills/creating-plugins/references/hooks.md index c8ba16e..2a1532d 100644 --- a/portfolio/.agents/skills/creating-plugins/references/hooks.md +++ b/portfolio/.agents/skills/creating-plugins/references/hooks.md @@ -189,6 +189,45 @@ Runs after content is unpublished (reverted to draft). Side effects only. Event: `{ content: Record, collection: string }` Returns: `void` +### `content:afterRestore` + +Runs after trashed content is restored. Side effects only. + +```typescript +"content:afterRestore": async (event, ctx) => { + ctx.log.info(`Restored ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterSchedule` + +Runs after content is scheduled for future publishing. Side effects only. + +```typescript +"content:afterSchedule": async (event, ctx) => { + ctx.log.info(`Scheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterUnschedule` + +Runs after scheduled content is unscheduled. Side effects only. + +```typescript +"content:afterUnschedule": async (event, ctx) => { + ctx.log.info(`Unscheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + ## Media Hooks ### `media:beforeUpload` @@ -418,23 +457,26 @@ Use `"continue"` for non-critical operations (analytics, notifications, external ## Quick Reference -| Hook | Trigger | Capability Required | Return | -| ------------------------ | -------------------- | -------------------------------- | ---------------------------- | -| `plugin:install` | First install | — | `void` | -| `plugin:activate` | Plugin enabled | — | `void` | -| `plugin:deactivate` | Plugin disabled | — | `void` | -| `plugin:uninstall` | Plugin removed | — | `void` | -| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | -| `content:afterSave` | After save | `content:read` | `void` | -| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | -| `content:afterDelete` | After delete | `content:read` | `void` | -| `content:afterPublish` | After publish | `content:read` | `void` | -| `content:afterUnpublish` | After unpublish | `content:read` | `void` | -| `media:beforeUpload` | Before upload | — | Modified file info or `void` | -| `media:afterUpload` | After upload | — | `void` | -| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | -| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | -| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | -| `cron` | Scheduled task fires | — | `void` | -| `page:metadata` | Page render | — | Metadata contributions | -| `page:fragments` | Page render | — (trusted only) | Fragment contributions | +| Hook | Trigger | Capability Required | Return | +| ------------------------- | -------------------- | -------------------------------- | ---------------------------- | +| `plugin:install` | First install | — | `void` | +| `plugin:activate` | Plugin enabled | — | `void` | +| `plugin:deactivate` | Plugin disabled | — | `void` | +| `plugin:uninstall` | Plugin removed | — | `void` | +| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | +| `content:afterSave` | After save | `content:read` | `void` | +| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | +| `content:afterDelete` | After delete | `content:read` | `void` | +| `content:afterPublish` | After publish | `content:read` | `void` | +| `content:afterUnpublish` | After unpublish | `content:read` | `void` | +| `content:afterRestore` | After restore | `content:read` | `void` | +| `content:afterSchedule` | After schedule | `content:read` | `void` | +| `content:afterUnschedule` | After unschedule | `content:read` | `void` | +| `media:beforeUpload` | Before upload | — | Modified file info or `void` | +| `media:afterUpload` | After upload | — | `void` | +| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | +| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | +| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | +| `cron` | Scheduled task fires | — | `void` | +| `page:metadata` | Page render | — | Metadata contributions | +| `page:fragments` | Page render | — (trusted only) | Fragment contributions | diff --git a/portfolio/package.json b/portfolio/package.json index 8937edf..efaaace 100644 --- a/portfolio/package.json +++ b/portfolio/package.json @@ -18,12 +18,12 @@ "@astrojs/react": "^6.0.0", "astro": "^7.0.0", "better-sqlite3": "^12.8.0", - "emdash": "^0.24.1", + "emdash": "^0.26.0", "react": "19.2.4", "react-dom": "19.2.4" }, "devDependencies": { "@astrojs/check": "^0.9.7" }, - "packageManager": "pnpm@11.1.3+sha512.c85357fe17ca12dd23dd7071822666dfd7e3cb76fe214e3370b5ea2fb34f2a231185509b63e717f3cd0acb38dd3f8d82bcd5e8172400ae678b70ea4fbed0896d" + "packageManager": "pnpm@11.9.0+sha512.bd682d5d03fe525ef7c9fd6780c6884d1e756ac4c9c9fe00c538782824310dcf90e3ddc4f53835f06dfaebd5085e41855e0bcbb3b60de2ac5bbab89e5036f03b" } diff --git a/starter-cloudflare/.agents/skills/creating-plugins/references/hooks.md b/starter-cloudflare/.agents/skills/creating-plugins/references/hooks.md index c8ba16e..2a1532d 100644 --- a/starter-cloudflare/.agents/skills/creating-plugins/references/hooks.md +++ b/starter-cloudflare/.agents/skills/creating-plugins/references/hooks.md @@ -189,6 +189,45 @@ Runs after content is unpublished (reverted to draft). Side effects only. Event: `{ content: Record, collection: string }` Returns: `void` +### `content:afterRestore` + +Runs after trashed content is restored. Side effects only. + +```typescript +"content:afterRestore": async (event, ctx) => { + ctx.log.info(`Restored ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterSchedule` + +Runs after content is scheduled for future publishing. Side effects only. + +```typescript +"content:afterSchedule": async (event, ctx) => { + ctx.log.info(`Scheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterUnschedule` + +Runs after scheduled content is unscheduled. Side effects only. + +```typescript +"content:afterUnschedule": async (event, ctx) => { + ctx.log.info(`Unscheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + ## Media Hooks ### `media:beforeUpload` @@ -418,23 +457,26 @@ Use `"continue"` for non-critical operations (analytics, notifications, external ## Quick Reference -| Hook | Trigger | Capability Required | Return | -| ------------------------ | -------------------- | -------------------------------- | ---------------------------- | -| `plugin:install` | First install | — | `void` | -| `plugin:activate` | Plugin enabled | — | `void` | -| `plugin:deactivate` | Plugin disabled | — | `void` | -| `plugin:uninstall` | Plugin removed | — | `void` | -| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | -| `content:afterSave` | After save | `content:read` | `void` | -| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | -| `content:afterDelete` | After delete | `content:read` | `void` | -| `content:afterPublish` | After publish | `content:read` | `void` | -| `content:afterUnpublish` | After unpublish | `content:read` | `void` | -| `media:beforeUpload` | Before upload | — | Modified file info or `void` | -| `media:afterUpload` | After upload | — | `void` | -| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | -| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | -| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | -| `cron` | Scheduled task fires | — | `void` | -| `page:metadata` | Page render | — | Metadata contributions | -| `page:fragments` | Page render | — (trusted only) | Fragment contributions | +| Hook | Trigger | Capability Required | Return | +| ------------------------- | -------------------- | -------------------------------- | ---------------------------- | +| `plugin:install` | First install | — | `void` | +| `plugin:activate` | Plugin enabled | — | `void` | +| `plugin:deactivate` | Plugin disabled | — | `void` | +| `plugin:uninstall` | Plugin removed | — | `void` | +| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | +| `content:afterSave` | After save | `content:read` | `void` | +| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | +| `content:afterDelete` | After delete | `content:read` | `void` | +| `content:afterPublish` | After publish | `content:read` | `void` | +| `content:afterUnpublish` | After unpublish | `content:read` | `void` | +| `content:afterRestore` | After restore | `content:read` | `void` | +| `content:afterSchedule` | After schedule | `content:read` | `void` | +| `content:afterUnschedule` | After unschedule | `content:read` | `void` | +| `media:beforeUpload` | Before upload | — | Modified file info or `void` | +| `media:afterUpload` | After upload | — | `void` | +| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | +| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | +| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | +| `cron` | Scheduled task fires | — | `void` | +| `page:metadata` | Page render | — | Metadata contributions | +| `page:fragments` | Page render | — (trusted only) | Fragment contributions | diff --git a/starter-cloudflare/package.json b/starter-cloudflare/package.json index 0245c84..eae3518 100644 --- a/starter-cloudflare/package.json +++ b/starter-cloudflare/package.json @@ -16,9 +16,9 @@ "dependencies": { "@astrojs/cloudflare": "^14.0.0", "@astrojs/react": "^6.0.0", - "@emdash-cms/cloudflare": "^0.24.1", + "@emdash-cms/cloudflare": "^0.26.0", "astro": "^7.0.0", - "emdash": "^0.24.1", + "emdash": "^0.26.0", "react": "19.2.4", "react-dom": "19.2.4" }, @@ -27,5 +27,5 @@ "@cloudflare/workers-types": "^4.20260305.1", "wrangler": "^4.99.0" }, - "packageManager": "pnpm@11.1.3+sha512.c85357fe17ca12dd23dd7071822666dfd7e3cb76fe214e3370b5ea2fb34f2a231185509b63e717f3cd0acb38dd3f8d82bcd5e8172400ae678b70ea4fbed0896d" + "packageManager": "pnpm@11.9.0+sha512.bd682d5d03fe525ef7c9fd6780c6884d1e756ac4c9c9fe00c538782824310dcf90e3ddc4f53835f06dfaebd5085e41855e0bcbb3b60de2ac5bbab89e5036f03b" } diff --git a/starter/.agents/skills/creating-plugins/references/hooks.md b/starter/.agents/skills/creating-plugins/references/hooks.md index c8ba16e..2a1532d 100644 --- a/starter/.agents/skills/creating-plugins/references/hooks.md +++ b/starter/.agents/skills/creating-plugins/references/hooks.md @@ -189,6 +189,45 @@ Runs after content is unpublished (reverted to draft). Side effects only. Event: `{ content: Record, collection: string }` Returns: `void` +### `content:afterRestore` + +Runs after trashed content is restored. Side effects only. + +```typescript +"content:afterRestore": async (event, ctx) => { + ctx.log.info(`Restored ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterSchedule` + +Runs after content is scheduled for future publishing. Side effects only. + +```typescript +"content:afterSchedule": async (event, ctx) => { + ctx.log.info(`Scheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + +### `content:afterUnschedule` + +Runs after scheduled content is unscheduled. Side effects only. + +```typescript +"content:afterUnschedule": async (event, ctx) => { + ctx.log.info(`Unscheduled ${event.collection}/${event.content.id}`); +} +``` + +Event: `{ content: Record, collection: string }` +Returns: `void` + ## Media Hooks ### `media:beforeUpload` @@ -418,23 +457,26 @@ Use `"continue"` for non-critical operations (analytics, notifications, external ## Quick Reference -| Hook | Trigger | Capability Required | Return | -| ------------------------ | -------------------- | -------------------------------- | ---------------------------- | -| `plugin:install` | First install | — | `void` | -| `plugin:activate` | Plugin enabled | — | `void` | -| `plugin:deactivate` | Plugin disabled | — | `void` | -| `plugin:uninstall` | Plugin removed | — | `void` | -| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | -| `content:afterSave` | After save | `content:read` | `void` | -| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | -| `content:afterDelete` | After delete | `content:read` | `void` | -| `content:afterPublish` | After publish | `content:read` | `void` | -| `content:afterUnpublish` | After unpublish | `content:read` | `void` | -| `media:beforeUpload` | Before upload | — | Modified file info or `void` | -| `media:afterUpload` | After upload | — | `void` | -| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | -| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | -| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | -| `cron` | Scheduled task fires | — | `void` | -| `page:metadata` | Page render | — | Metadata contributions | -| `page:fragments` | Page render | — (trusted only) | Fragment contributions | +| Hook | Trigger | Capability Required | Return | +| ------------------------- | -------------------- | -------------------------------- | ---------------------------- | +| `plugin:install` | First install | — | `void` | +| `plugin:activate` | Plugin enabled | — | `void` | +| `plugin:deactivate` | Plugin disabled | — | `void` | +| `plugin:uninstall` | Plugin removed | — | `void` | +| `content:beforeSave` | Before save | `content:write` | Modified content or `void` | +| `content:afterSave` | After save | `content:read` | `void` | +| `content:beforeDelete` | Before delete | `content:read` | `false` to cancel | +| `content:afterDelete` | After delete | `content:read` | `void` | +| `content:afterPublish` | After publish | `content:read` | `void` | +| `content:afterUnpublish` | After unpublish | `content:read` | `void` | +| `content:afterRestore` | After restore | `content:read` | `void` | +| `content:afterSchedule` | After schedule | `content:read` | `void` | +| `content:afterUnschedule` | After unschedule | `content:read` | `void` | +| `media:beforeUpload` | Before upload | — | Modified file info or `void` | +| `media:afterUpload` | After upload | — | `void` | +| `email:beforeSend` | Before email send | `hooks.email-events:register` | Modified message or `false` | +| `email:deliver` | Email delivery | `hooks.email-transport:register` | `void` (exclusive) | +| `email:afterSend` | After email send | `hooks.email-events:register` | `void` | +| `cron` | Scheduled task fires | — | `void` | +| `page:metadata` | Page render | — | Metadata contributions | +| `page:fragments` | Page render | — (trusted only) | Fragment contributions | diff --git a/starter/package.json b/starter/package.json index cf84f2c..15b2cf4 100644 --- a/starter/package.json +++ b/starter/package.json @@ -18,12 +18,12 @@ "@astrojs/react": "^6.0.0", "astro": "^7.0.0", "better-sqlite3": "^12.8.0", - "emdash": "^0.24.1", + "emdash": "^0.26.0", "react": "19.2.4", "react-dom": "19.2.4" }, "devDependencies": { "@astrojs/check": "^0.9.7" }, - "packageManager": "pnpm@11.1.3+sha512.c85357fe17ca12dd23dd7071822666dfd7e3cb76fe214e3370b5ea2fb34f2a231185509b63e717f3cd0acb38dd3f8d82bcd5e8172400ae678b70ea4fbed0896d" + "packageManager": "pnpm@11.9.0+sha512.bd682d5d03fe525ef7c9fd6780c6884d1e756ac4c9c9fe00c538782824310dcf90e3ddc4f53835f06dfaebd5085e41855e0bcbb3b60de2ac5bbab89e5036f03b" }