AW

awcms-news-portal

Provides architectural specifications for porting the AWCMS news portal module, including R2 storage and media registry.

Install

mkdir -p .claude/skills/awcms-news-portal && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/19084" && unzip -o skill.zip -d .claude/skills/awcms-news-portal && rm skill.zip

Installs to .claude/skills/awcms-news-portal

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

BACAAN SAJA — modul news_portal BELUM di-port ke repo ini (ada di awcms-mini; `ls src/modules` tidak memuatnya, tidak ada migration-nya di `sql/`; bergantung pada blog_content/tenant_domain yang juga belum di-port). Rujukan modul/tabel/`sql/NNN` di dalamnya adalah artefak awcms-mini, penomoran mini. Pakai sebagai spesifikasi target saat MEM-PORT (via `awcms-port-from-mini`), bukan panduan implementasi kode yang bisa dipanggil — verifikasi `ls src/modules` dulu. Konteks port (Issue #631-#642, #649). Gunakan saat menambah/mengubah preset full-online R2-only, media object registry, presigned upload flow, R2 readiness checks, homepage composer, ad/video/quality-checklist berbasis media R2, tag linking, atau SEO/social preview `/news`. Merangkum keputusan arsitektur yang sudah dibuat (docs/awcms/news-portal/) supaya issue lanjutan tidak mengulang/kontradiksi.
866 charsno explicit “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Advanced

Key capabilities

  • Port news portal modules from awcms-mini
  • Configure full-online R2-only media presets
  • Implement presigned R2 upload flows
  • Validate R2 readiness and security checks
  • Compose editorial homepage sections
  • Link internal tags for news content

How it works

This skill acts as a specification reference for porting news portal features from the awcms-mini repository to the current architecture. It provides architectural constraints and status tracking for R2-only media integration.

Inputs & outputs

You give it
Issue number from #631-#642 or #649
You get back
Ported module configuration or architectural specification

When to use awcms-news-portal

  • Porting news portal modules
  • Implementing R2 media features
  • Reviewing architectural decisions for media registry

About this skill

🇬🇧 English (source) · 🇮🇩 Bahasa Indonesia

AWCMS — News Portal (full-online R2-only media)

<!-- sql-refs: awcms-mini — the `sql/NNN` numbers in this skill body use awcms-mini numbering; the module HAS BEEN ported to awcms as `sql/041`–`sql/045` (see the module README + the real `sql/` for the actual numbers) -->

STATUS — THIS MODULE NO LONGER EXISTS (ADR-0044, PR #300). news_portal was MERGED into blog_content. What changed, and what must be read before a single line of code is written from this skill:

  • src/modules/news-portal/ deleted; src/modules/index.ts does not load it (registry = 21 modules). There is no basePath /api/v1/news-portal.
  • Its features are not gone: the homepage-section composer and ad placement with a verified media_object_id are now owned by blog_content, with widened targeting (#301), a legacy ad ingest job (#302), the free-URL ad write path closed off (#303), and a gated content-block vocabulary (#304).
  • The awcms_news_portal_* table names are KEPT (ADR-0036 precedent: hard composite FK from ad placements). A table name is therefore NOT a hint about which module owns it here.
  • Its OpenAPI contract moved too (PR #308). openapi/modules/news-portal.openapi.yaml was deleted; the four /api/v1/news-portal/* paths and their schemas now live in openapi/modules/blog-content.openapi.yaml. The path names and tag names (News Portal Homepage Sections/News Portal Ad Placements) were deliberately NOT changed — ADR-0044 §3/§6 moves ownership, not the public surface; the only thing corrected was the module attribution in the tag descriptions. The fragment ownership gate now rejects a fragment with no owning module, so this oversight cannot silently recur.
  • To change those features: the awcms-blog-content skill. For media: awcms-media-library. This skill no longer has any code to change.
  • The body below is kept as the pre-merge specification because §640 is still referenced by src/modules/blog-content/README.md for the content-quality checklist rules. Every file path inside it is history.
<details> <summary>Old port status (pre-ADR-0044, kept for context)</summary>

news_portal used to be real here: src/modules/news-portal, migrations sql/041_awcms_news_media_object_registry_schema.sqlsql/045_awcms_news_portal_ad_placements_schema.sql, 4 awcms_news_* tables (all FORCE ROW LEVEL SECURITY). This skill is now a guide to changing/adding real code. Read src/modules/news-portal/README.md

  • sql/ for accurate numbers/tables.

⚠ ADR-0036 INVERSION (MUST READ — it changes media ownership): media is NO LONGER owned by news_portal. Migrations 052/053/054 extract the ENTIRE media registry (awcms_news_media_objects), presigned upload/finalize/cancel, MIME sniffer, R2 config/client/verification, categorization, and the news-media:reconcile job OUT of news-portal/ into the new module src/modules/media-library/ (files news-media-*media-*, internal symbols fetchNewsMediaObjectById/NewsMediaObjectView KEPT). The port _shared/ports/news-media-port.ts was DELETED → media-library-port.ts (MediaLibraryPort, isManagedMediaEnforcementActiveForTenant). Permission news_portal.media.*media_library.media.* (destructive repoint sql/052). For anything about media (upload, registry, reconcile, R2 config, enforcement) use the awcms-media-library skill, NOT this one. news_portal here is only homepage sections + ad placements; it CONSUMES media_library. Most of the skill body below still specifies the PRE-inversion (mini) shape — treat its media sections as history, not as where the code lives now.

AWCMS PORT DELTA (MUST READ — most of the skill body below specifies the mini shape; this is what DIFFERS here):

  • DROPPED: the host-resolved /news/** family of public routes (index, detail, category, tag, search, feed, sitemap) along with their render helpers (homepage-section-composer, homepage-section-rendering, news-share-config). They need lib/tenant/public-host-tenant-resolver.ts + env PUBLIC_TENANT_RESOLUTION_MODE from the tenant_domain module. UPDATE 2026-07-25: tenant_domain HAS BEEN ported (#219, sql/046048), so the foundation blocker is gone — but the /news/** routes themselves are still not adopted. Do not build/reference /news/** as existing; adopting it now is work of its own, not an automatic consequence of tenant_domain. (The public route that DOES exist = /blog/{tenantCode} owned by blog_content, path-based ADR-0009.)
  • DROPPED: activation of the news_portal_full_online_r2 preset (apply-news-portal-preset.ts) — it needs the module_management preset subsystem, which has not been ported. The awcms_news_portal_tenant_state table + reader isFullOnlineR2ModeAppliedForTenant still exist (forward-compatible) but without a writer (inert). Post-ADR-0036, managed-media enforcement is driven by media_library via isManagedMediaEnforcementActiveForTenant (readiness + per-tenant flag sql/053), switched on via POST /api/v1/media/ enforcement — NO LONGER the old isFullOnlineR2ModeActiveForTenant port.
  • What was ACTUALLY ported & active IN news_portal: the homepage section composer + ad placements (sql/044/045). The media registry + presigned upload/finalize + MIME sniff/SHA-256 + the news-media:reconcile job have MOVED to media_library (ADR-0036) — see the awcms-media-library skill. The news_media capability is retired; news_portal now CONSUMES media_library.
  • NEWS_MEDIA_R2_* env pre-validation (validate-env + 3 security-readiness checks) was deferred during the port — the module is fail-safe without it at runtime.
  • The sql/NNN numbers in the skill body = awcms-mini numbering; the real ones in awcms are sql/041sql/045.

The news_portal epic (#631-#642, #649) adds an editorial + media layer on top of blog_content (base module, already active) and online public routing (tenant_domain, ADR-0009/ADR-0010), specifically for full-online deployments that turn on R2-only mode for news images. The follow-on epic social-publishing (#643-#647) depends on this epic's architectural foundation (particularly the #633 media registry for images shared to social platforms) but is not part of the status table below — see the separate skill/documentation once that epic starts.

</details>

When to use this skill vs the generic skills

This skill complements (does not replace) awcms-new-endpoint, awcms-new-migration, awcms-integration (outbox/circuit-breaker patterns for R2, ADR-0006), awcms-idempotency (the upload confirm mutation), awcms-sensitive-data (photos are potentially PII), awcms-abac-guard, and awcms-blog-content (the post/page/gallery/ads content model that consumes the media registry). This skill provides the epic-specific cross-cutting context — above all the "R2-only, bucket separate from sync-storage" decision that must be preserved in every issue.

Read first: docs/awcms/news-portal/full-online-r2-architecture.md before working on any issue in this epic — that document (not this skill) is the architectural source of truth; this skill summarises status + pointers, it does not duplicate its contents.

Status per issue (do not rebuild what already exists)

IssueScopeStatus
#631Full-online R2-only architecture documentation + SOP + security + IR + backup + user guideDone — see §Existing documents below
#632news_portal_full_online_r2 preset (module descriptor/config gate)Done — see §632 below
#633Tenant-scoped R2-only media object registry (schema + migration)Done — see §633 below
#634Direct-to-R2 presigned upload flow (upload/confirm endpoints)Done — see §634 below
#635Config validation + readiness checks (config:validate/security:readiness/production:preflight) for R2 image deliveryDone — see §635 below
#636blog_content must reference an R2 media object for news images when the mode is activeDone — see §636 below
#637Editorial homepage section composer /news with R2-only renderingDone — see §637 below
#638News portal ad placement preset with R2-only image validationDone — see §638 below
#639video_news content block with a mandatory R2 thumbnailDone — see §639 below
#640Publishing content quality checklist with an R2 image requirementDone — see §640 below
#641Automatic internal tag linking for post/news contentDone — see §641 below
#642Public social sha

Content truncated.

When not to use it

  • Offline or LAN-only deployments
  • Projects requiring local filesystem fallback
  • Deployment profiles without explicit R2 preset activation

Prerequisites

awcms-mini source referenceActive blog_content moduleActive tenant_domain module

Limitations

  • Modul news_portal is not yet ported to the current repository
  • SQL migration numbering follows awcms-mini, not the current repo
  • SVG files are prohibited by default

How it compares

Unlike a standard implementation guide, this skill serves as a target specification for porting existing modules while enforcing strict architectural boundaries like R2-only storage.

Compared to similar skills

awcms-news-portal side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
awcms-news-portal (this skill)01moCautionAdvanced
architecture-patterns553moNo flagsAdvanced
kotlin-multiplatform324moReviewAdvanced
nodejs-best-practices287moNo flagsAdvanced

Try saying

Example prompts that trigger this skill in your AI assistant.

You might also like

architecture-patterns

wshobson

Implement proven backend architecture patterns including Clean Architecture, Hexagonal Architecture, and Domain-Driven Design. Use when architecting complex backend systems or refactoring existing applications for better maintainability.

55214

kotlin-multiplatform

vitorpamplona

Platform abstraction decision-making for Amethyst KMP project. Guides when to abstract vs keep platform-specific, source set placement (commonMain, jvmAndroid, platform-specific), expect/actual patterns. Covers primary targets (Android, JVM/Desktop, iOS) with web/wasm future considerations. Integrates with gradle-expert for dependency issues. Triggers on: abstraction decisions ("should I share this?"), source set placement questions, expect/actual creation, build.gradle.kts work, incorrect placement detection, KMP dependency suggestions.

32156

nodejs-best-practices

davila7

Node.js development principles and decision-making. Framework selection, async patterns, security, and architecture. Teaches thinking, not copying.

28120

workflow-orchestration-patterns

wshobson

Design durable workflows with Temporal for distributed systems. Covers workflow vs activity separation, saga patterns, state management, and determinism constraints. Use when building long-running processes, distributed transactions, or microservice orchestration.

10117

java-pro

sickn33

Master Java 21+ with modern features like virtual threads, pattern matching, and Spring Boot 3.x. Expert in the latest Java ecosystem including GraalVM, Project Loom, and cloud-native patterns. Use PROACTIVELY for Java development, microservices architecture, or performance optimization.

3492

arm-cortex-expert

sickn33

Senior embedded software engineer specializing in firmware and driver development for ARM Cortex-M microcontrollers (Teensy, STM32, nRF52, SAMD). Decades of experience writing reliable, optimized, and maintainable embedded code with deep expertise in memory barriers, DMA/cache coherency, interrupt-driven I/O, and peripheral drivers.

2975

Search skills

Search the agent skills registry