Aliyun Arms Query
cinience/alicloud-skills
A skill your agent uses when querying distributed traces or application metrics in Alibaba Cloud ARMS (Application Real-Time Monitoring Service).
SAP Analytics Cloud (SAC) Custom Widget development. An agent skill from secondsky/sap-skills.
$ npx skills add secondsky/sap-skills --skill sap-sac-custom-widget -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install secondsky/sap-skills sap-sac-custom-widget --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/secondsky/sap-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget .claude/skills/sap-sac-custom-widget && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "sap-sac-custom-widget" agent skill from https://github.com/secondsky/sap-skills/tree/main/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget into .claude/skills/sap-sac-custom-widget/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sap-sac-custom-widget", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/secondsky/sap-skills/tree/main/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widgetType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add secondsky/sap-skills --skill sap-sac-custom-widget -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install secondsky/sap-skills sap-sac-custom-widget --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/secondsky/sap-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget .agents/skills/sap-sac-custom-widget && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "sap-sac-custom-widget" agent skill from https://github.com/secondsky/sap-skills/tree/main/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget into .agents/skills/sap-sac-custom-widget/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sap-sac-custom-widget", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add secondsky/sap-skills --skill sap-sac-custom-widget -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install secondsky/sap-skills sap-sac-custom-widget --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/secondsky/sap-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget .cursor/skills/sap-sac-custom-widget && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "sap-sac-custom-widget" agent skill from https://github.com/secondsky/sap-skills/tree/main/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget into .cursor/skills/sap-sac-custom-widget/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sap-sac-custom-widget", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/secondsky/sap-skills.git --path plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add secondsky/sap-skills --skill sap-sac-custom-widget -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install secondsky/sap-skills sap-sac-custom-widget --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/secondsky/sap-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget .gemini/skills/sap-sac-custom-widget && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "sap-sac-custom-widget" agent skill from https://github.com/secondsky/sap-skills/tree/main/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget into .gemini/skills/sap-sac-custom-widget/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sap-sac-custom-widget", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install secondsky/sap-skills sap-sac-custom-widgetInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add secondsky/sap-skills --skill sap-sac-custom-widget -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/secondsky/sap-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget .github/skills/sap-sac-custom-widget && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "sap-sac-custom-widget" agent skill from https://github.com/secondsky/sap-skills/tree/main/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget into .github/skills/sap-sac-custom-widget/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sap-sac-custom-widget", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add secondsky/sap-skills --skill sap-sac-custom-widget -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install secondsky/sap-skills sap-sac-custom-widget --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/secondsky/sap-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget .opencode/skills/sap-sac-custom-widget && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "sap-sac-custom-widget" agent skill from https://github.com/secondsky/sap-skills/tree/main/plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget into .opencode/skills/sap-sac-custom-widget/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "sap-sac-custom-widget", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
sap-sac-custom-widgetSAP Analytics Cloud (SAC) Custom Widget development. An agent skill from secondsky/sap-skills.
Sap Sac Custom Widget is an agent skill from secondsky/sap-skills. SAP Analytics Cloud (SAC) Custom Widget development. Use when building custom visualizations, extending SAC with Web Components, or creating Widget Add-Ons. Covers JSON metadata, JavaScript Web Components, lifecycle functions, data binding with feeds, styling/builder panels, property/event/method definitions, third-party library integration, hosting, security, performance, and debugging. Includes Widget Add-On feature (QRC Q4 2023+) and templates for widgets, charts, and KPI cards.
Its SKILL.md is about 8.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 40 other files, including reference files (for example `README.md`, `agents/openai.yaml` and `references/advanced-topics.md`).
It sits in Business, Finance & HR, covering OKRs and executive reporting. It works with JavaScript. The repository describes itself as: Production-ready plugins for SAP development with AI coding assistants — BTP, CAP, Fiori, ABAP, HANA, Analytics Cloud, Datasphere, and more. The licence is GPL-3.0.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 652a861. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadBashWebFetchFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
nodeopensslFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
username.github.ioAlso links to:
github.comhelp.sap.comcustom-widgets.deFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Sap Sac Custom Widget loads about 8.3k tokens when it runs, and up to ~69k if it reads all its reference files. Until then it costs about 127 tokens; SKILL.md has 3,069 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Read, Bash, WebFetchAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from secondsky/sap-skills at commit 652a861, republished under its GPL-3.0 licence (© secondsky). 3,069 words, ~8,279 tokens.
.claude/skills/sap-sac-custom-widget/SKILL.md (or your agent's skills folder). This skill also uses 38 other files; get the full folder from GitHub.This skill enables development of custom widgets for SAP Analytics Cloud (SAC). Custom widgets are Web Components that extend SAC stories and applications with custom visualizations, interactive elements, and specialized functionality.
Use this skill when:
Requirements:
For prompt-driven widget creation, first classify the widget role and data-source mode, then suggest 2-3 role-aware options before generating the selected complete package. Keep AI-generated code SAC-compatible, preserve data-binding order when used, and validate/repair before import. See references/ai-assisted-composite-generation.md for output contracts, RAG context patterns, brand styling, and composite caveats.
Before generating a table, chart, KPI, menu, sidebar, filter, or hybrid control, select both its widget role and data-source mode. Request dimensions, measures/key figures, dates, versions, filters, and feed order only for SAC-bound widgets. For pure UI controls, collect interaction, navigation, state, method/event, accessibility, and responsive-layout requirements instead. Accept user-provided screenshots, PDFs, images, brand guides, and sanitized data as evidence, but confirm technical IDs, feed mappings, asset rights, and licenses before code generation. See references/widget-discovery-intake.md for the Widget Brief, evidence boundaries, and hosted-tool safeguards.
For enterprise or locked-down local environments, offer templates/local-builder/ as the standard no-install scaffold builder. It runs as static HTML/CSS/vanilla JavaScript, avoids public CDNs and external packages, and exports SAC upload artifacts as two separate downloads: widget.json and a Resource-ZIP containing only root-level component JavaScript files. Use Node's server.mjs fallback when direct file:// use is blocked. When a user explicitly permits public-web use for a non-sensitive desktop prototype, optionally suggest the Custom Widget Builder or live demo; never send tenant material or trust its exports without local validation. See references/local-builder-workflow.md for builder boundaries, export rules, hosted-tool safeguards, and validation checks.
Before generating a chart, KPI, hierarchy, input utility, Widget Add-On, or build-based widget, consult references/sap-sample-widget-lessons.md. It audits every SAP sample folder and distills reusable lessons for Data Binding-first scaffolds, root-relative Resource-ZIP URLs, styling/builder panel separation, support flags, custom types, script methods/events, add-on extensions[], and build-based app caveats. Use the lessons for structure and risk checks only; do not copy SAP sample code or assets into generated packages.
Generated widget packages should include templates/design-runtime/ as a no-build, file-first browser preview scaffold. Use it after generation to mock custom-widget essentials outside SAP, adjust properties/design tokens/sample data/viewports, compare multiple widgets, and export an agent iteration payload. See references/browser-design-runtime.md for runtime boundaries and configuration/export contracts. Use templates/local-builder/ for scaffold generation/export; use templates/design-runtime/ for preview and iteration.
Style custom widgets inside their Web Component/Shadow DOM boundary. Do not rely on SAC optimized story theme CSS, SAP shell selectors, or global story CSS to style widget internals. For generated packages, confirm the hosting mode before splitting CSS/HTML into separate files, because SAC ZIP upload packages support component JavaScript and PNG/JPG icons only. See references/css-and-styling-compliance.md for SAP Help-backed allowed/restricted styling rules.
Decide the delivery mode before generating widget.json: SAC Resource-ZIP upload and external HTTPS hosting use different URL rules. For SAC Resource-ZIP upload, deliver widget.json separately, upload it first, and only then upload a Resource-ZIP containing root-level component JavaScript files such as widget.js, builder.js, and styling.js. Do not include widget.json, subfolders, tests, README files, CSS, or HTML in that Resource-ZIP.
For Resource-ZIP manifests, use root-relative component URLs such as "/widget.js"; for external hosting, use complete HTTPS URLs. Keep local-preview paths like "widget.js" in preview-only configs unless the target SAC flow explicitly documents that resolution mode. Model simple configurable colors as string properties with hex defaults such as "#f4f7fa"; use the Color type only after the exact SAC tenant and target panel flow accepts it. Browser preview and Node tests are useful, but they are not proof of SAC importability. For widgets with builder/styling panels, preserve focus and collapse state during text edits, keep component JS self-contained, and validate final outputs/ artifacts rather than source-only previews. When the widget is done, the final chat response must offer both completed upload artifacts for download: the widget.json manifest and the Resource-ZIP. See references/sac-import-packaging-lessons.md for upload sequence, ZIP content checks, final-artifact tests, builder/tree rules, final download handoff, and SAC error triage.
When a widget is rejected by SAC despite passing local tests, consult references/production-widget-lessons.md. It covers raw control characters in bundles, Analytics Designer method-body limits, required integrity states, client-side-only manifest validation, icon and font isolation, user and language boundaries, bookmark risk, opaque-error bisection, behavioral preflight guards, and browser-preview limits. Treat its evidence labels as part of the guidance: tenant observations, SAP-documented behavior, and unconfirmed hypotheses must not be presented as equivalent.
Treat SAC properties as an external state stream. SAC may deliver properties one at a time, echo values written by the widget, and change their representation. Merge updates, normalize through one read path, and render from the merged state. Do not assume property order or consume builder initialization flags on an empty first render. Manifest method bodies are Analytics Designer script: they may read or write declared properties, but they cannot call private component methods.
Builder and styling panels are stateful editors. Keep text edits targeted so focus, caret, selection,
search, and collapse state survive. Preserve unknown configuration keys when two editors share a
document, and keep one user action to one property dispatch and one undo step. For structured import
or export, preserve stable ids, deep-copy nested templates, use null-prototype maps for
user-authored names, and test every language slot. See references/property-lifecycle.md.
Validate the built component files and final Resource-ZIP, not only source helpers or a browser
preview. Generate all outputs first, validate them, then write them. Test the final bundles
standalone, verify exact SRI bytes, scan for raw control characters, and use a real browser for
layout, focus, font, pointer, and lifecycle behavior that DOM emulation cannot represent. See
references/verification-and-artifacts.md.
This plugin provides specialized agents, commands, and validation hooks for comprehensive widget development support.
| Agent | Color | Purpose | Trigger Examples |
|---|---|---|---|
| widget-architect | Blue | Design widget structure, metadata, and integration patterns | "design custom widget", "plan widget architecture" |
| widget-debugger | Yellow | Troubleshoot loading, data binding, CORS, and runtime issues | "widget won't load", "CORS error", "data not binding" |
| widget-api-assistant | Green | Write JavaScript widget code, lifecycle functions, API integrations | "write widget code", "implement lifecycle functions" |
| Command | Usage | Description |
|---|---|---|
/widget-validate | /widget-validate [file] | Validate widget.json schema and widget.js structure |
/widget-generate | /widget-generate | Interactively generate widget scaffold with JSON, JS, local builder, and browser design runtime |
/widget-lint | /widget-lint [file] | Performance, security, and best practices analysis |
Automatic quality checks triggered on Write/Edit operations:
Ready-to-use scaffolds in templates/ directory:
basic-widget.js - Minimal Web Component with all lifecycle functionsdata-bound-chart.js - ECharts widget with data bindingstyling-panel.js - Runtime customization panelbuilder-panel.js - Design-time configuration panellocal-builder/ - Static local scaffold builder and SAC artifact exporterdesign-runtime/ - Browser preview and design iteration runtimewidget.json-minimal - Bare-minimum metadatawidget.json-complete - Full-featured metadata with all optionsA custom widget requires two files:
1. widget.json (Metadata)
{
"id": "com.company.mywidget",
"version": "1.0.0",
"name": "My Custom Widget",
"description": "A simple custom widget",
"vendor": "Company Name",
"license": "MIT",
"icon": "",
"webcomponents": [
{
"kind": "main",
"tag": "my-custom-widget",
"url": "https://your-host.com/widget.js",
"integrity": "",
"ignoreIntegrity": true
}
],
"properties": {
"title": {
"type": "string",
"default": "My Widget"
}
},
"methods": {},
"events": {}
}2. widget.js (Web Component)
(function() {
const template = document.createElement("template");
template.innerHTML = `
<style>
:host {
display: block;
width: 100%;
height: 100%;
}
.container {
padding: 16px;
font-family: Arial, sans-serif;
}
</style>
<div class="container">
<h3 id="title">My Widget</h3>
<div id="content"></div>
</div>
`;
class MyCustomWidget extends HTMLElement {
constructor() {
super();
this._shadowRoot = this.attachShadow({ mode: "open" });
this._shadowRoot.appendChild(template.content.cloneNode(true));
this._props = {};
}
connectedCallback() {
// Called when element is added to DOM
}
onCustomWidgetBeforeUpdate(changedProperties) {
// Called BEFORE properties are updated
this._props = { ...this._props, ...changedProperties };
}
onCustomWidgetAfterUpdate(changedProperties) {
// Called AFTER properties are updated - render here
if (changedProperties.title !== undefined) {
this._shadowRoot.getElementById("title").textContent = changedProperties.title;
}
}
onCustomWidgetResize() {
// Called when widget is resized
}
onCustomWidgetDestroy() {
// Cleanup when widget is removed
}
// Property getter/setter (required for SAC framework)
get title() {
return this._props.title;
}
set title(value) {
this._props.title = value;
this.dispatchEvent(new CustomEvent("propertiesChanged", {
detail: { properties: { title: value } }
}));
}
}
customElements.define("my-custom-widget", MyCustomWidget);
})();⚠️ Production Note: The ignoreIntegrity: true setting above is development only. For production deployments, generate a SHA256 integrity hash and set ignoreIntegrity: false.
SAP provides a community sample repository with 17 custom widget sample folders:
Repository: SAP-samples/SAC_Custom_Widgets
| Category | Widgets |
|---|---|
| Charts | Funnel, Pareto, Sankey, Sunburst, Tree, Line, UI5 Gantt |
| KPI/Gauge | KPI Ring, Gauge Grade, Half Donut, Nested Pie, Custom Pie |
| Utilities | File Upload, Word Cloud, Bar Gradient, Widget Add-on Sample |
Requirements: Most samples assume Data Binding and Optimized View Mode (OVM) or Optimized and Unified Story Experience.
Note: Check third-party library licenses before production use, adjust hosted component paths when moving samples, and treat live SAC import/runtime validation as tenant-specific. See references/sap-sample-widget-lessons.md for the per-sample audit and creation lessons.
Essential functions called by SAC framework:
onCustomWidgetBeforeUpdate(changedProperties) - Pre-update hookonCustomWidgetAfterUpdate(changedProperties) - Post-update (render here)onCustomWidgetResize() - Handle resize eventsonCustomWidgetDestroy() - Cleanup resourcesConfigure in widget.json to receive SAC model data:
{
"dataBindings": {
"myDataBinding": {
"feeds": [
{
"id": "dimensions",
"description": "Dimensions",
"type": "dimension"
},
{
"id": "measures",
"description": "Measures",
"type": "mainStructureMember"
}
]
}
}
}Access data in JavaScript:
// Get data binding
const dataBinding = this.dataBindings.getDataBinding("myDataBinding");
// Access result set
const data = this.myDataBinding.data;
const metadata = this.myDataBinding.metadata;
// Iterate over rows
for (let i = 0; i < this.myDataBinding.data.length; i++) {
const row = this.myDataBinding.data[i];
const dimensionValue = row.dimensions_0 ? row.dimensions_0.label : "";
const measureValue = row.measures_0 ? row.measures_0.raw : 0;
}1. SAC-Hosted (Recommended, QRC Q2 2023+)
widget.json first, then upload a separate Resource-ZIP when SAC enables the Resource File button"/widget.js"; do not use local Windows backslashes or bare local preview paths in the production manifest"integrity": "" and "ignoreIntegrity": true2. GitHub Pages
https://username.github.io/repo/widget.js3. External Web Server
Access-Control-Allow-Origin: *For production, generate a SHA256 integrity value with Node.js for Windows/macOS/Linux:
# Generate integrity hash for widget.js
node -e "const fs=require('node:fs');const crypto=require('node:crypto');const file=process.argv[1]||'widget.js';console.log('sha256-'+crypto.createHash('sha256').update(fs.readFileSync(file)).digest('base64'));" widget.js
# Update JSON
"integrity": "sha256-abc123...",
"ignoreIntegrity": falseOn macOS/Linux or Git Bash, OpenSSL is also acceptable; prefix the output with sha256- before adding it to the manifest:
openssl dgst -sha256 -binary widget.js | openssl base64 -A| Error | Cause | Solution |
|---|---|---|
| "The system couldn't load the custom widget" | Incorrect URL or hosting issue | Verify URL is accessible, check CORS |
| "Integrity check failed" | Hash mismatch | Regenerate hash after JS changes |
| Widget not appearing | Missing connectedCallback render | Call render in onCustomWidgetAfterUpdate |
| Properties not updating | Missing propertiesChanged dispatch | Use dispatchEvent with propertiesChanged |
| Data not displaying | Data binding misconfigured | Verify feeds in JSON match usage |
CUSTOM_WIDGET_SERVICE_EXCEPTION or opaque HTTP 500 | Raw control or ambiguous code point, malformed method body, manifest/ZIP pair, or another upload constraint | Scan source and bundles for control code points, BOM, zero-width characters, and line separators, then use one-variable JSON and ZIP probes |
| Method body rejected with unknown function or type errors | Body calls component internals instead of using declared properties | Declare the state as a property and have the body read or write that property |
Manifest rejected for missing integrity | webcomponents[] omitted the required field | Add integrity and use either development "" plus ignoreIntegrity: true or a real sha256-... digest plus false |
| Icons render blank | Icon name is not bundled or was guessed | Generate and search a committed icon map; do not depend on IconPool inside the widget |
| Widget has the wrong font | Form controls use their UA font or panel CSS overrides SAC | Inherit the font on controls and avoid custom font stacks in design-time panels |
| Personal or language value is empty or wrong | Widget tried to discover user or SAC locale context | Pass it through a declared property from story script |
"Color" is not a valid type or default expected as Color | Tenant/import flow rejected simple color properties | Use string plus hex defaults for simple configurable colors |
| Main component could not be loaded | Resource URL, ZIP content, or JS syntax problem | Check root-relative webcomponents[].url, Resource-ZIP root contents, then node --check |
| Resource File upload is disabled | widget.json has not validated yet | Upload and validate widget.json first, then upload the Resource-ZIP |
| Resource-ZIP imports/later load fails | ZIP contains manifest, folders, CSS/HTML, or unrelated files | Keep only root-level JS component files and optional PNG/JPG icons |
| Builder input loses focus or collapse state | Text edits trigger full render | Update field/row/JSON text directly; reserve full render for structural changes |
| Preview works but SAC component fails standalone | Preview depends on a shared source helper not present in bundled JS | Test final widget.js, builder.js, and styling.js without preview-only helper scripts |
| Duplicate menu items collide | Subtree duplicate rewrote only root ID | Rewrite descendant IDs and test uniqueness across the whole tree |
| Panel shows a value that runtime ignores | Property is stored or exported but never read by the runtime | Add a runtime-use check and a behavior test for every manifest property |
| Valid zero becomes a default | Numeric coercion uses `Number(value) | |
| Builder loses typed text or search state | Every update rebuilds the panel | Patch fields in place and restore focus, selection, and caret when structural rendering is required |
| Rename or duplicate leaves stale state | Identity is positional or a shallow copy aliases nested data | Preserve stable ids, deep-copy templates, and enumerate every reference holder |
| Layout passes DOM tests but fails in SAC | Test environment has no layout or font metrics | Verify geometry and font-dependent behavior in a real browser |
| A user-authored name behaves inconsistently by case | Membership checks use exact comparisons in multiple sites | Centralize the matching rule and test a case-only rename |
onCustomWidgetAfterUpdate(changedProperties) {
console.log("Widget updated:", changedProperties);
console.log("Current props:", this._props);
console.log("Data binding:", this.myDataBinding && this.myDataBinding.data);
this._render();
}Widget Add-Ons extend built-in SAC widgets without building from scratch.
Use Cases:
Supported Charts: Bar/Column, Stacked Bar/Column, Line, Stacked Area, Numeric Point
Key Differences:
main and builder components (no styling)tooltip, plotArea, numericPoint)See references/widget-addon-guide.md for complete implementation.
templates/basic-widget.js - Minimal Web Component scaffold (~60 lines)templates/data-bound-chart.js - ECharts widget with SAC data binding (~120 lines)templates/styling-panel.js - Styling panel for runtime customization (~150 lines)templates/builder-panel.js - Builder panel for design-time configurationtemplates/local-builder/ - No-install local builder for metadata, feeds, properties, methods, events, and SAC two-file exporttemplates/design-runtime/ - No-build browser preview, design-token controls, scenario switching, and agent iteration exporttemplates/widget.json-minimal - Bare-minimum metadata (~25 lines)templates/widget.json-complete - Full-featured metadata (~100 lines)references/json-schema-reference.md - Complete JSON schema documentationreferences/widget-templates.md - Additional widget template patterns (6 templates)references/echarts-integration.md - ECharts library integration guidereferences/widget-addon-guide.md - Widget Add-On development (QRC Q4 2023+)references/best-practices-guide.md - Performance, security, and development guidelinesreferences/advanced-topics.md - Custom types, script API types, installationreferences/integration-and-migration.md - Script integration, content transportreferences/script-api-reference.md - DataSource, Selection, MemberInfo APIsreferences/ai-assisted-composite-generation.md - Prompt-driven generation, RAG, brand styling, validation, and composite-ready output guidancereferences/local-builder-workflow.md - Enterprise-safe local builder workflow, export contract, and validation checklistreferences/sap-sample-widget-lessons.md - SAP sample widget audit matrix, reusable generation lessons, and add-on/build-based routing caveatsreferences/browser-design-runtime.md - Non-SAP browser preview runtime, sidecar config, and agent iteration exportreferences/css-and-styling-compliance.md - SAP Help-backed CSS, theme, Shadow DOM, and packaging guidance for generated widgetsreferences/sac-import-packaging-lessons.md - SAC-hosted Resource-ZIP upload sequence, URL rules, ZIP hygiene, builder/tree state rules, self-contained component checks, final-artifact tests, and SAC error triagereferences/widget-discovery-intake.md - Widget role/data-source selection, attachment intake, Widget Brief, and hosted-tool safeguardsreferences/production-widget-lessons.md - Tenant-observed upload failures, script method limits, integrity, isolation, bisection, and preflight guardsreferences/property-lifecycle.md - SAC property normalization, script method boundaries, stateful editors, persistence, and structured data rulesreferences/verification-and-artifacts.md - Built-bundle verification, test blind spots, mutation evidence, upload triage, and deterministic artifact checksPrimary References (for skill updates):
Sample Widgets:
Unreleased
templates/local-builder/ scaffold for local widget metadata, property/feed configuration, and SAC two-file artifact exporttemplates/builder-panel.js so builder panel generation has a bundled self-contained templatelast_verified; live SAC upload/runtime validation remains pendingv2.3.2 (2026-07-06)
widget.json and Resource-ZIP upload flow, root-relative SAC-hosted URLs, Resource-ZIP content hygiene, and simple color property portabilityColor property usagewidget.json manifest and Resource-ZIP as separate downloadable artifactsv2.1.0 (2026-06-12)
eula, imports, supportsMobile, supportsExport, supportsLinkedAnalysisFilterOnSelection, supportsViewportLoading, supportsBookmark, typestype property for ES module loadingincludeInBookmarks per-property flag, boolean[]/integer[] typesserializeCustomWidgetToImage() and customWidgetRenderComplete to advanced topicsv2.0.0 (2025-12-27)
v1.2.0 (2025-11-26)
v1.1.0 (2025-11-22)
v1.0.0 (2025-11-22)
SAC Version: 2026.8
© secondsky, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 38 other files (references) in plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget of secondsky/sap-skills.
Open the folder on GitHubat commit 652a861
Sap Sac Custom Widget next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Sap Sac Custom Widget this skillsecondsky/sap-skills | 462 | — | ~8.3k | Automated safety check: Notes | GPL-3.0 | |
| Aliyun Arms Querycinience/alicloud-skills | 397 | — | ~1.6k | Automated safety check: Pass | MIT | |
| Doca Flow TuneNVIDIA/skills | 3.5k | — | ~4.8k | Automated safety check: Pass | Apache-2.0 | |
| Matlab Simulate Bluetooth Networkmatlab/matlab-agentic-toolkit | 1.1k | — | ~1.2k | Automated safety check: Pass | Custom licence | |
| Kpi Dashboard Patternsrevfactory/harness-100 | 1.3k | — | ~1k | Automated safety check: Pass | Apache-2.0 | |
| Pine BacktesterTradersPost/pinescript-agents | 170 | 1 repos | ~3.9k | Automated safety check: Pass | None |
cinience/alicloud-skills
A skill your agent uses when querying distributed traces or application metrics in Alibaba Cloud ARMS (Application Real-Time Monitoring Service).
NVIDIA/skills
A skill your agent uses when the user is tuning a live or captured doca-flow pipeline with docaflowtune — snapshotting pipe / counter / KPI state, picking a tuning axis (rule placement, resource…
matlab/matlab-agentic-toolkit
Simulate Bluetooth system-level networks using the Bluetooth Toolbox.
revfactory/harness-100
KPI dashboard design pattern. An agent skill from revfactory/harness-100.
TradersPost/pinescript-agents
Implements comprehensive backtesting and performance metrics.
marketcalls/openalgo
Write an OpenScript study or strategy for OpenAlgo, and install it into strategies/openscript/ only after it compiles.
secondsky/sap-skills
SAP-RPT-1-OSS local tabular prediction workflows for FI/CO prototype datasets.
secondsky/sap-skills
Secure dependency upgrades with supply chain protection, cooldowns, and staged rollout.
secondsky/sap-skills
Comprehensive ABAP development skill for SAP systems. An agent skill from secondsky/sap-skills.
secondsky/sap-skills
SAP dependency security and MCP executable trust policy with secure upgrades, cooldowns, staged rollout, and supply-chain protection.
secondsky/sap-skills
Comprehensive SAP ABAP CDS (Core Data Services) reference for data modeling, view development, and semantic enrichment.
secondsky/sap-skills
Guides development with SAP AI Core and SAP AI Launchpad for enterprise AI/ML workloads on SAP BTP.
Works with
Categories
SAP Analytics Cloud (SAC) Custom Widget development. An agent skill from secondsky/sap-skills. Sap Sac Custom Widget is an agent skill from secondsky/sap-skills. SAP Analytics Cloud (SAC) Custom Widget development.
Sap Sac Custom Widget fits situations like: building custom visualizations; extending SAC with Web Components; creating Widget Add-Ons.
Run `npx skills add secondsky/sap-skills --skill sap-sac-custom-widget -a claude-code`. Or copy the skill folder (plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget in secondsky/sap-skills) into .claude/skills/sap-sac-custom-widget in your project. Claude Code loads it when a task matches its description.
Run `npx skills add secondsky/sap-skills --skill sap-sac-custom-widget -a codex`. Or copy the skill folder (plugins/sap-sac-custom-widget/skills/sap-sac-custom-widget in secondsky/sap-skills) into .agents/skills/sap-sac-custom-widget in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add secondsky/sap-skills --skill sap-sac-custom-widget -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/sap-sac-custom-widget, .gemini/skills/sap-sac-custom-widget, .github/skills/sap-sac-custom-widget and .opencode/skills/sap-sac-custom-widget in your project.
Going by SKILL.md and its folder, Sap Sac Custom Widget needs the command-line tools its instructions call (node and openssl). Its frontmatter pre-approves these tools: Read, Bash, WebFetch.
SKILL.md names 4 domains. In commands or code: username.github.io; the agent is likely to contact it when it follows the instructions. As links in the text: github.com, help.sap.com and custom-widgets.de. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Sap Sac Custom Widget is published under the GPL-3.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 8.3k tokens (SKILL.md is roughly 33k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 61k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Sap Sac Custom Widget: Aliyun Arms Query (cinience/alicloud-skills, 397 stars), Doca Flow Tune (NVIDIA/skills, 3.5k stars), Matlab Simulate Bluetooth Network (matlab/matlab-agentic-toolkit, 1.1k stars) and Kpi Dashboard Patterns (revfactory/harness-100, 1.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
secondsky (a GitHub user) maintains it in secondsky/sap-skills, which has 462 GitHub stars. The repository holds 41 skills in this directory. The repository was last updated on October 5, 2026.
Source: secondsky/sap-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.