Skip to main content Inicio Creadores openaev-platform openaev create-feature-module
create-feature-module Scaffolds a complete feature end-to-end: JPA entity, repository, service, DTOs, mapper, controller, migration, tests (fixture + composer + integration test), and frontend actions/page. Use when asked to create a new feature or module.
Ir a la instalación Skills Marketplace Descubre y explora habilidades de IA creadas por la comunidad.
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Copiar promptMostrar detalles del prompt Un comando directo omite el prompt de revisión. Revisa el origen antes de ejecutarlo.
npx skills add https://github.com/OpenAEV-Platform/openaev --skill create-feature-moduleEl comando permanece en una sola línea. Desplázate horizontalmente para revisarlo antes de copiarlo.
¿Prefieres una copia local? Descarga los archivos que SkillsMP tiene disponibles ahora.
Descargar Zip Descargando... Activates one table on multi-tenancy v2 (statement inspector + can_access_tenant), test-first, following the import_mappers pilot (PR #6255). Use when asked to switch a table from v1 @Filter isolation to v2. Covers HTTP paths and, since the background transaction primitive (#6398), background writers (scheduler jobs, consumers) once they are converted to the primitive. Covers eligibility gates, code-path inventory, TDD isolation tests, write attribution, the background conversion, the one-commit go-live, and the full regression pass.
Ocupaciones relacionadas SOC
Basado en la clasificación ocupacional SOC
name create-feature-module description Scaffolds a complete feature end-to-end: JPA entity, repository, service, DTOs, mapper, controller, migration, tests (fixture + composer + integration test), and frontend actions/page. Use when asked to create a new feature or module.
Create Feature Module
Prerequisites
Entity name (singular, e.g. PlatformGroup)
Table name (plural snake_case, e.g. platform_groups)
Tenancy scope: tenant-scoped , platform-level , or dual-scope
Fields with types and constraints
Checkpoint: Scope Confirmation
Before writing any code, present the following to the user and wait for confirmation:
Entity name and table name
Tenancy scope : tenant-scoped, platform-level, or dual-scope
Fields : name, type, constraints, nullable
Files to create : list every file (entity, repository, service, DTOs, mapper, controller, migration, test fixtures, integration test, frontend actions/page)
Instruction files read : confirm you have read the relevant .github/instructions/ files for all layers involved
Do not proceed until the user confirms the scope is correct.
Procedure
Step 1 — Create the JPA Entity
Location: openaev-model/src/main/java/io/openaev/database/model/
Follow Group.java (tenant-scoped) or Tenant.java (platform-level):
@ControlledUuidGeneration for ID
@Queryable on filterable fields
@Transient @JsonIgnore ResourceType field
Collections initialized as mutable (new ArrayList<>())
Follow conventions from database.instructions.md If dual-scope (Settings, User, Role, Group pattern):
Implement DualScopeBase interface
Use ModelBaseListener only (no TenantBaseListener)
Do NOT add @Filter("tenantFilter")
tenant_id must be nullable : @JoinColumn(name = "tenant_id", nullable = true)
@JsonIgnore on the tenant relation
Step 2 — Create the Repository Location: openaev-model/src/main/java/io/openaev/database/repository/
public interface {Entity}Repository extends JpaRepository <{Entity}, String>,
JpaSpecificationExecutor<{Entity}> {}
Step 3 — Add ResourceType + Capabilities
Add value in ResourceType.java
Add ACCESS_, MANAGE_, DELETE_ in Capability.java with parent hierarchy
Checkpoint: Entity Layer Review After completing Steps 1–3, present the following to the user and wait for confirmation:
Entity class : field names, column names, annotations, tenant scope
ResourceType and Capability additions: exact enum values and hierarchy
Repository : confirm interface signature
Do not proceed to the service/API/frontend layers until the user confirms the entity layer is correct.
Step 4 — Create the Service Location: openaev-api/src/main/java/io/openaev/service/
@Service @RequiredArgsConstructor @Transactional(rollbackFor = Exception.class)
CRUD + search with pagination
JavaDoc on all public methods
If dual-scope — create TWO services:
Platform{Entity}Service — all queries use findByTenantIsNull() variants, never receives tenantId
Tenant{Entity}Service — all queries use findByTenantId(tenantId) variants, receives tenantId as argument
See multi-tenancy.instructions.md → Dual-Scope Entities for full pattern
Step 5 — Create DTOs + Mapper Location: openaev-api/src/main/java/io/openaev/api/{feature}/
{Entity}Input and {Entity}Output as Java record
{Entity}Mapper with static fromInput() + toOutput()
Step 6 — Create the Controller Location: openaev-api/src/main/java/io/openaev/api/{feature}/
@AccessControl + @LogExecutionTime + @Operation on every endpoint
CRUD + search endpoints
All new tenant-scoped APIs use TENANT_PREFIX : @RequestMapping(TENANT_PREFIX + "/{entities}") → resolves to /api/tenants/{tenantId}/{entities}
If dual-scope — create TWO controllers:
Platform{Entity}Api at /api/platform-{entities} — uses Platform{Entity}Service, platform-admin @AccessControl
Tenant{Entity}Api at TENANT_PREFIX + "/{entities}" — tenant ID extracted from URL path, passed to Tenant{Entity}Service
Step 7 — Create the Migration Location: openaev-api/src/main/java/io/openaev/migration/
Find next version number in existing migrations
CREATE TABLE, FK constraints, indexes
Step 8 — Create Test Fixtures + Composer Location: openaev-api/src/test/java/io/openaev/utils/fixtures/
Fixture: createDefault{Entity}() with random names
Composer: extends ComposerBase, inner Composer class
Fixture must support both: createDefaultPlatform{Entity}() (tenant = null) and createDefaultTenant{Entity}(String tenantId)
Step 9 — Create Integration Test Location: openaev-api/src/test/java/io/openaev/api/{feature}/
@Nested @DisplayName groups, @WithMockUser, assertThatJson
If dual-scope — add isolation tests:
given_platformEntity_should_notAppearInTenantList
given_tenantEntity_should_notAppearInPlatformList
given_tenantA_should_notSeeTenantBEntities
Test both Platform{Entity}Api and Tenant{Entity}Api independently
Step 10 — Create Frontend Actions + Page Location: openaev-front/src/actions/{feature}/ and src/admin/components/
{feature}-action.ts — API calls (CRUD + search)
{feature}-helper.d.ts — TypeScript types (or use auto-generated api-types.d.ts)
{feature}-schema.ts — Zod validation schema
List page with Queryable + DataTable
Create/Edit form with React Hook Form + Zod
Permission guards with CASL (ability.can(ACTIONS.MANAGE, SUBJECTS.X))
Step 11 — Verify mvn spotless:apply
mvn test
cd openaev-front && yarn lint && yarn check-ts && yarn test