视觉画布设计
canvas-design
基于设计原则创作静态视觉作品,用于海报与品牌图形。
sap-cap-nodejs-dev【文档与办公】SAP Cloud Application Programming Model (CAP) development skill for the **Node.js runtime only**. Domain-first: prefers CDS schema, annotations, projections, and CAP's generic providers over hand-written handler code ("less code → less mistakes"). Use when the user asks to: build CAP applications, define CDS models, design entities / associations / …
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: sap-cap-nodejs-dev description: | SAP Cloud Application Programming Model (CAP) development skill for the Node.js runtime only. Domain-first: prefers CDS schema, annotations, projections, and CAP's generic providers over hand-written handler code ("less code → less mistakes").
Use when the user asks to: build CAP applications, define CDS models, design entities / associations / views / projections, add annotations (validation, authorization, UI, search, drafts), configure databases (SQLite / HANA / PostgreSQL through CAP), deploy to SAP BTP (Cloud Foundry or Kyma), wire multitenancy / messaging, or add CAP plugins.
Strict scope — this skill ONLY develops SAP CAP Node.js. It MUST refuse, and tell the user why, whenever a request is:
@UI.* annotations in .cds are in scope; writing
the UI itself is not.@sap/cds).@cap-js/graphql).Public-API hygiene — this skill only uses public, supported, non-deprecated CAP interfaces:
@sap/cds major.@sap/cds/lib/..., _private, __internal),
@protected / @internal / @experimental APIs, anything marked deprecated or removed in
the changelog. Always prefer the documented public interface; if no public API exists, say so
and stop — do not reach into internals.
license: GPL-3.0
metadata:
version: "3.2.0"
last_verified: "2026-05-13"
runtime: "Node.js only"
cap_version: "@sap/cds 9.7.x"
mcp_version: "@cap-js/mcp-server 0.0.3+"
lsp_version: "@sap/cds-lsp 9.7.x"Before doing anything, classify the request:
.cds are in scope; the UI app itself is not."@sap/cds + cds.ApplicationService, or documented
@cap-js/* plugins).When in doubt, ask the user to confirm the request fits the CAP Node.js scope before writing code.
@sap/cds, @sap/cds/common,
@cap-js/sqlite, @cap-js/hana, @cap-js/postgres, @cap-js/attachments,
@cap-js/audit-logging, @cap-js/change-tracking, @cap-js/telemetry, @cap-js/graphql,
@cap-js/mcp-server, @sap/cds-mtxs.@sap/cds/lib/*, node_modules/@sap/cds/lib/*, or any path the docs do not
describe."Every line of code not written is free of errors." — SAP Capire https://cap.cloud.sap/docs/get-started/features#less-code-%E2%86%92-less-mistakes
CAP captures domain knowledge and intent declaratively ("What, not How"). This skill follows that principle: prefer the CDS model, annotations, projections, and CAP's generic providers over hand-written handlers and SQL.
CAP's generic providers already handle: CRUD, nested documents, drafts, media, search, pagination, sorting, authentication / authorization, localization, input validation, auto-generated keys, concurrency control. Do not re-implement these in code.
Decision order when adding a new behavior — only drop to the next step if the previous one cannot express it:
@sap/cds/common.@mandatory, @assert.*, @readonly, @insertonly, @requires,
@restrict, @cds.persistence.*, @cds.search, @odata.draft.enabled, @odata.etag,
@UI.*.@flow.status + @from + @to. CAP validates the entry state and writes the target
state. See references/status-flow.md. ⚠ Currently Gamma in
capire — only adopt with explicit team acceptance.@cap-js/attachments, @cap-js/audit-logging, @cap-js/change-tracking,
@cap-js/telemetry, @cap-js/graphql, etc.@odata.etag (via managed.modifiedAt) for optimistic locking;
cds.tx(req) with .forUpdate() on the base entity when invariants span multiple rows.
See references/concurrency-control.md and
references/race-conditions.md.@from/@to,
@odata.etag, @assert.*, @requires, or a projection already does for free.Full explanation, examples, and the "is this PR domain-first?" checklist: references/domain-first.md.
| Concern | Where it lives |
|---|---|
| Keys, types, relationships | db/schema.cds |
| Required / range / format / unique | CDS @mandatory, @assert.* |
| Computed fields | CDS calculated elements (= expr, stored) |
| Exposed subset / filtered rows | srv/*.cds projection |
| Joins across entities | CDS view (as select from … join …) |
| Authorization (who can do what) | @requires, @restrict |
| Fiori UI shape | @UI.*, @Common.* annotations in CDS |
| i18n texts | _i18n/ .properties files |
| Seed / reference data | CSV in db/data/ |
| Cross-cutting concerns | @cap-js/* plugin (configured, not coded) |
| Genuine business logic | Node.js event handler in srv/*.js |
The app/ folder (UI applications) is out of scope for this skill.
project/
├── app/ # UI content ← out of scope
├── srv/ # Service definitions (.cds, .js/.ts) ← in scope
├── db/ # Data models, views, seed data ← in scope
│ ├── schema.cds
│ └── data/
├── package.json # Dependencies + CDS config ← in scope
└── .cdsrc.json # CDS configuration (optional)
npm i -g @sap/cds-dk @sap/cds-lsp
cds init <project-name>
cds watch
Add capabilities as needed (cds add hana | sqlite | xsuaa | mta | multitenancy | typescript).
Full CLI reference: references/cli-complete.md and
references/tools-complete.md.
Domain-first starter — model first, expose with a projection, no handler needed:
// db/schema.cds
using { cuid, managed } from '@sap/cds/common';
namespace my.bookshop;
entity Books : cuid, managed {
title : String(111) @mandatory;
stock : Integer @assert.range: [0, 99999];
price : Decimal(9,2);
}
// srv/catalog-service.cds
using { my.bookshop as my } from '../db/schema';
@requires: 'authenticated-user'
service CatalogService {
@readonly entity Books as projection on my.Books where stock > 0;
}
That's a working, validated, authorized, searchable OData service — zero JS.
For more entity / projection / view / annotation patterns, see the templates folder and the references below.
The skill integrates with the official CAP MCP server, giving the agent live access to the project's compiled CSN model and CAP docs:
search_model — fuzzy search entities, services, actions, and relationships in the CSN.search_docs — semantic search through CAP documentation.Setup: references/mcp-integration.md. Use cases: references/mcp-use-cases.md.
@flow.status + @from + @to for
state-machine use cases (capire Gamma).@odata.etag optimistic
locking, .forUpdate() pessimistic locking, draft serialization.i18n.properties and error-message bundle messages.properties for req.error / req.reject, built-in keys ASSERT_MANDATORY, ASSERT_RANGE, ASSERT_FORMAT, ASSERT_TARGET, MULTIPLE_ERRORS), temporal data.@cap-js/* plugins.cds CLI reference.