mirror of
https://github.com/forcedotcom/afv-library.git
synced 2026-07-30 03:09:50 +08:00
Compare commits
5 Commits
9a0546eeb5
...
709230b3ff
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
709230b3ff | ||
|
|
91633d6529 | ||
|
|
587641d564 | ||
|
|
ae792239f2 | ||
|
|
abe0d620a4 |
@ -1,3 +1,12 @@
|
||||
# [1.30.0](https://github.com/forcedotcom/sf-skills/compare/1.29.0...1.30.0) (2026-07-10)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Release 2 new skills: platform-models-api-configure, platform-policy-rule-generate @W-23396600@ ([ae79223](https://github.com/forcedotcom/sf-skills/commit/ae792239f2e798654c77348e0ee4593d3d3110e8))
|
||||
|
||||
|
||||
|
||||
# [1.29.0](https://github.com/forcedotcom/sf-skills/compare/1.28.0...1.29.0) (2026-07-03)
|
||||
|
||||
|
||||
|
||||
@ -4,6 +4,8 @@ This repository provides a curated collection of Salesforce agent skills for bui
|
||||
|
||||
The skills are contributed by Salesforce and the broader community. It’s optimized for Agentforce Vibes and can be used with any AI tool that supports skills.
|
||||
|
||||
> ⚠️ **Expect frequent changes.** The Salesforce skills library is evolving rapidly as we refine patterns and incorporate feedback. Skills may be renamed, restructured, or removed between releases — they do not follow the same stability guarantees as GA platform APIs. If you’ve forked or synced the repository, be prepared for upstream changes that may conflict with local modifications. This repository is always the source of truth.
|
||||
|
||||
## 🗂️ Structure
|
||||
|
||||
```
|
||||
|
||||
250
package-lock.json
generated
250
package-lock.json
generated
@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@salesforce/afv-skills",
|
||||
"version": "1.13.0",
|
||||
"version": "1.30.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@salesforce/afv-skills",
|
||||
"version": "1.13.0",
|
||||
"version": "1.30.0",
|
||||
"license": "CC-BY-NC-4.0",
|
||||
"devDependencies": {
|
||||
"@salesforce/ui-bundle-template-app-react-sample-b2e": "^10.2.2",
|
||||
@ -405,9 +405,9 @@
|
||||
"license": "SEE LICENSE IN LICENSE.txt"
|
||||
},
|
||||
"node_modules/@esbuild/aix-ppc64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz",
|
||||
"integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz",
|
||||
"integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
@ -422,9 +422,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-arm": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz",
|
||||
"integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz",
|
||||
"integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@ -439,9 +439,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-arm64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz",
|
||||
"integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz",
|
||||
"integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -456,9 +456,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-x64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz",
|
||||
"integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz",
|
||||
"integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -473,9 +473,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/darwin-arm64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz",
|
||||
"integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz",
|
||||
"integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -490,9 +490,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/darwin-x64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz",
|
||||
"integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz",
|
||||
"integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -507,9 +507,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/freebsd-arm64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz",
|
||||
"integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz",
|
||||
"integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -524,9 +524,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/freebsd-x64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz",
|
||||
"integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz",
|
||||
"integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -541,9 +541,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-arm": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz",
|
||||
"integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz",
|
||||
"integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@ -558,9 +558,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-arm64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz",
|
||||
"integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz",
|
||||
"integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -575,9 +575,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-ia32": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz",
|
||||
"integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz",
|
||||
"integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
@ -592,9 +592,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-loong64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz",
|
||||
"integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz",
|
||||
"integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==",
|
||||
"cpu": [
|
||||
"loong64"
|
||||
],
|
||||
@ -609,9 +609,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-mips64el": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz",
|
||||
"integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz",
|
||||
"integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==",
|
||||
"cpu": [
|
||||
"mips64el"
|
||||
],
|
||||
@ -626,9 +626,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-ppc64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz",
|
||||
"integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz",
|
||||
"integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
@ -643,9 +643,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-riscv64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz",
|
||||
"integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz",
|
||||
"integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
@ -660,9 +660,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-s390x": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz",
|
||||
"integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz",
|
||||
"integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
@ -677,9 +677,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-x64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz",
|
||||
"integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz",
|
||||
"integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -694,9 +694,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/netbsd-arm64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz",
|
||||
"integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz",
|
||||
"integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -711,9 +711,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/netbsd-x64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz",
|
||||
"integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz",
|
||||
"integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -728,9 +728,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/openbsd-arm64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz",
|
||||
"integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz",
|
||||
"integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -745,9 +745,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/openbsd-x64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz",
|
||||
"integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz",
|
||||
"integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -762,9 +762,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/openharmony-arm64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz",
|
||||
"integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz",
|
||||
"integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -779,9 +779,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/sunos-x64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz",
|
||||
"integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz",
|
||||
"integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -796,9 +796,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-arm64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz",
|
||||
"integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz",
|
||||
"integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -813,9 +813,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-ia32": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz",
|
||||
"integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz",
|
||||
"integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
@ -830,9 +830,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-x64": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz",
|
||||
"integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz",
|
||||
"integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -1736,9 +1736,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/esbuild": {
|
||||
"version": "0.27.3",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz",
|
||||
"integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==",
|
||||
"version": "0.28.1",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz",
|
||||
"integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
@ -1749,32 +1749,32 @@
|
||||
"node": ">=18"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@esbuild/aix-ppc64": "0.27.3",
|
||||
"@esbuild/android-arm": "0.27.3",
|
||||
"@esbuild/android-arm64": "0.27.3",
|
||||
"@esbuild/android-x64": "0.27.3",
|
||||
"@esbuild/darwin-arm64": "0.27.3",
|
||||
"@esbuild/darwin-x64": "0.27.3",
|
||||
"@esbuild/freebsd-arm64": "0.27.3",
|
||||
"@esbuild/freebsd-x64": "0.27.3",
|
||||
"@esbuild/linux-arm": "0.27.3",
|
||||
"@esbuild/linux-arm64": "0.27.3",
|
||||
"@esbuild/linux-ia32": "0.27.3",
|
||||
"@esbuild/linux-loong64": "0.27.3",
|
||||
"@esbuild/linux-mips64el": "0.27.3",
|
||||
"@esbuild/linux-ppc64": "0.27.3",
|
||||
"@esbuild/linux-riscv64": "0.27.3",
|
||||
"@esbuild/linux-s390x": "0.27.3",
|
||||
"@esbuild/linux-x64": "0.27.3",
|
||||
"@esbuild/netbsd-arm64": "0.27.3",
|
||||
"@esbuild/netbsd-x64": "0.27.3",
|
||||
"@esbuild/openbsd-arm64": "0.27.3",
|
||||
"@esbuild/openbsd-x64": "0.27.3",
|
||||
"@esbuild/openharmony-arm64": "0.27.3",
|
||||
"@esbuild/sunos-x64": "0.27.3",
|
||||
"@esbuild/win32-arm64": "0.27.3",
|
||||
"@esbuild/win32-ia32": "0.27.3",
|
||||
"@esbuild/win32-x64": "0.27.3"
|
||||
"@esbuild/aix-ppc64": "0.28.1",
|
||||
"@esbuild/android-arm": "0.28.1",
|
||||
"@esbuild/android-arm64": "0.28.1",
|
||||
"@esbuild/android-x64": "0.28.1",
|
||||
"@esbuild/darwin-arm64": "0.28.1",
|
||||
"@esbuild/darwin-x64": "0.28.1",
|
||||
"@esbuild/freebsd-arm64": "0.28.1",
|
||||
"@esbuild/freebsd-x64": "0.28.1",
|
||||
"@esbuild/linux-arm": "0.28.1",
|
||||
"@esbuild/linux-arm64": "0.28.1",
|
||||
"@esbuild/linux-ia32": "0.28.1",
|
||||
"@esbuild/linux-loong64": "0.28.1",
|
||||
"@esbuild/linux-mips64el": "0.28.1",
|
||||
"@esbuild/linux-ppc64": "0.28.1",
|
||||
"@esbuild/linux-riscv64": "0.28.1",
|
||||
"@esbuild/linux-s390x": "0.28.1",
|
||||
"@esbuild/linux-x64": "0.28.1",
|
||||
"@esbuild/netbsd-arm64": "0.28.1",
|
||||
"@esbuild/netbsd-x64": "0.28.1",
|
||||
"@esbuild/openbsd-arm64": "0.28.1",
|
||||
"@esbuild/openbsd-x64": "0.28.1",
|
||||
"@esbuild/openharmony-arm64": "0.28.1",
|
||||
"@esbuild/sunos-x64": "0.28.1",
|
||||
"@esbuild/win32-arm64": "0.28.1",
|
||||
"@esbuild/win32-ia32": "0.28.1",
|
||||
"@esbuild/win32-x64": "0.28.1"
|
||||
}
|
||||
},
|
||||
"node_modules/event-target-shim": {
|
||||
@ -2001,19 +2001,6 @@
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/get-tsconfig": {
|
||||
"version": "4.13.6",
|
||||
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz",
|
||||
"integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"resolve-pkg-maps": "^1.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/glob-to-regex.js": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz",
|
||||
@ -2952,16 +2939,6 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/resolve-pkg-maps": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
|
||||
"integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/retry": {
|
||||
"version": "0.12.0",
|
||||
"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
|
||||
@ -3264,14 +3241,13 @@
|
||||
"license": "0BSD"
|
||||
},
|
||||
"node_modules/tsx": {
|
||||
"version": "4.21.0",
|
||||
"resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz",
|
||||
"integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==",
|
||||
"version": "4.23.0",
|
||||
"resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.0.tgz",
|
||||
"integrity": "sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"esbuild": "~0.27.0",
|
||||
"get-tsconfig": "^4.7.5"
|
||||
"esbuild": "~0.28.0"
|
||||
},
|
||||
"bin": {
|
||||
"tsx": "dist/cli.mjs"
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@salesforce/afv-skills",
|
||||
"version": "1.29.0",
|
||||
"version": "1.30.0",
|
||||
"description": "Salesforce skills for Agentforce Vibes",
|
||||
"license": "CC-BY-NC-4.0",
|
||||
"files": [
|
||||
|
||||
@ -44,7 +44,7 @@ See `SKILL.md` for the full flag table and sample prompts.
|
||||
|
||||
## Directory layout
|
||||
|
||||
```
|
||||
```text
|
||||
agentforce-architecture-analyze/
|
||||
├── SKILL.md Skill contract (inputs, outputs, pipeline, invariants)
|
||||
├── README.md This file
|
||||
@ -86,7 +86,7 @@ agentforce-architecture-analyze/
|
||||
|
||||
### Channel strategy — SOQL-first
|
||||
|
||||
```
|
||||
```text
|
||||
Seed query: planner_definition_by_agent_chain (chain-LIKE lookup → planner id)
|
||||
|
||||
6 parallel Tooling SOQL channels (keyed on the resolved planner id):
|
||||
@ -147,9 +147,3 @@ Per-branch ancestor-path cycle detection is the primary termination primitive: t
|
||||
| `INVALID_FIELD` from a SOQL asset | Salesforce renamed / removed the field in a quarterly release. Run with `--reprobe` to refresh the 7-day channel cache and pick up the new schema |
|
||||
| `STATUS=PROBE_FAILED` on first run | Channel probe saw a mandatory field missing. Check `channels.json` under the probe cache dir for which sObject / field — may require org-side feature enablement |
|
||||
| Tree for classic ReAct agent shows `_unresolved` entries for NGA plugins | Expected — the NGA external-plugin retrieve is skipped when the planner shape is classic. Those entries can be ignored |
|
||||
|
||||
---
|
||||
|
||||
## Author
|
||||
|
||||
Raghul Jayagopal (RJ), Salesforce ANZ FDE.
|
||||
|
||||
@ -157,14 +157,14 @@ exit "$_rc"
|
||||
|
||||
All artifacts under `~/.vibe/data/agentforce-architecture-analyze/<org_id15>/<agent_api_name>__<agent_version>/` (default; override with `--data-dir <path>`):
|
||||
|
||||
```
|
||||
```xml
|
||||
<agent>_<ver>_metadata_tree.json primary artifact — normalized planner/topic/action/flow/apex/prompt/plugin tree
|
||||
<agent>_<ver>_architecture.md human-readable section-by-section rendering (H1 + 7 numbered sections, plus a conditional Dependency graph appendix). Mermaid diagrams are embedded inside the relevant sections (Action tree, Data flow, and Dependency graph)
|
||||
```
|
||||
|
||||
## Pipeline — inline, no subagent
|
||||
|
||||
```
|
||||
```text
|
||||
resolve_bot.py → BotDefinition + BotVersion + planner name lookup
|
||||
retrieve_planner.py → Metadata API zip retrieve for GenAiPlannerBundle (+ NGA plugins if present)
|
||||
parallel_retrieve.py → 6 parallel Tooling SOQL channels fan out from the planner id
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
{
|
||||
"_doc": "retired-name references replaced with plugin-scoped layout. Machine-readable I/O contract for investigating-agentforce-architecture. Orchestrator code reads this file (not SKILL.md prose) to discover the input schema, output keys, STATUS enum, and error-contract rules. The architecture skill runs inline (no subagent).",
|
||||
"_doc": "retired-name references replaced with plugin-scoped layout. Machine-readable I/O contract for agentforce-architecture-analyze. Orchestrator code reads this file (not SKILL.md prose) to discover the input schema, output keys, STATUS enum, and error-contract rules. The architecture skill runs inline (no subagent).",
|
||||
"_schema_version": "3.1",
|
||||
"_schema_notes": "3.1 (2026-05-05) canonicalizes `invocation_type` on STANDARD_ACTION / UNKNOWN nodes in the metadata tree. Prior versions split this across `raw_invocation_type` (bundle-sourced nodes) and `raw_action_type` (flow-actionCall-sourced nodes). Both legacy keys are still tolerated by readers for one release.",
|
||||
"input": {
|
||||
@ -35,15 +35,15 @@
|
||||
},
|
||||
"work_dir": {
|
||||
"type": "absolute_path",
|
||||
"description": "Ephemeral scratch. Default: /tmp/investigating-agentforce-architecture-<epoch>-<rand>."
|
||||
"description": "Ephemeral scratch. Default: /tmp/agentforce-architecture-analyze-<epoch>-<rand>."
|
||||
},
|
||||
"cache_root": {
|
||||
"type": "absolute_path",
|
||||
"description": "Internal rebuildable cache root. Default: ~/.vibe/cache/investigating-agentforce-architecture. Override with --cache-dir <path>."
|
||||
"description": "Internal rebuildable cache root. Default: ~/.vibe/cache/agentforce-architecture-analyze. Override with --cache-dir <path>."
|
||||
},
|
||||
"data_root": {
|
||||
"type": "absolute_path",
|
||||
"description": "Durable user-facing output root. Default: ~/.vibe/data/investigating-agentforce-architecture. Override with --data-dir <path>."
|
||||
"description": "Durable user-facing output root. Default: ~/.vibe/data/agentforce-architecture-analyze. Override with --data-dir <path>."
|
||||
},
|
||||
"force_refresh": {
|
||||
"type": "boolean",
|
||||
|
||||
@ -64,7 +64,7 @@ Every edge is strictly **forward** from the entry query
|
||||
(`GenAiPlannerDefinition WHERE DeveloperName = :planner_name`). No
|
||||
backward lookups.
|
||||
|
||||
```
|
||||
```text
|
||||
BotDefinition (Data API, PK Id, matched by DeveloperName)
|
||||
└── BotVersion (Data API, FK BotDefinitionId)
|
||||
│ [resolved to planner name via Bot metadata retrieve]
|
||||
|
||||
@ -1,5 +0,0 @@
|
||||
# Credits & Acknowledgments
|
||||
|
||||
This skill is part of the `*-datacloud` family. Shared attribution, upstream source mapping, and maintenance notes live in:
|
||||
- [../data360-orchestrate/CREDITS.md](../data360-orchestrate/CREDITS.md)
|
||||
- [../data360-orchestrate/UPSTREAM.md](../data360-orchestrate/UPSTREAM.md)
|
||||
@ -36,4 +36,3 @@ sf data360 data-action-target list -o myorg 2>/dev/null
|
||||
- [../data360-orchestrate/assets/definitions/data-action-target.template.json](../data360-orchestrate/assets/definitions/data-action-target.template.json)
|
||||
- [../data360-orchestrate/assets/definitions/data-action.template.json](../data360-orchestrate/assets/definitions/data-action.template.json)
|
||||
- [../data360-orchestrate/references/plugin-setup.md](../data360-orchestrate/references/plugin-setup.md)
|
||||
- [CREDITS.md](CREDITS.md)
|
||||
|
||||
@ -107,11 +107,9 @@ Next step: <destination validation or downstream testing>
|
||||
|
||||
## References
|
||||
|
||||
- [README.md](README.md)
|
||||
- [../data360-orchestrate/assets/definitions/activation-target.template.json](../data360-orchestrate/assets/definitions/activation-target.template.json)
|
||||
- [../data360-orchestrate/assets/definitions/activation.template.json](../data360-orchestrate/assets/definitions/activation.template.json)
|
||||
- [../data360-orchestrate/assets/definitions/data-action-target.template.json](../data360-orchestrate/assets/definitions/data-action-target.template.json)
|
||||
- [../data360-orchestrate/assets/definitions/data-action.template.json](../data360-orchestrate/assets/definitions/data-action.template.json)
|
||||
- [../data360-orchestrate/UPSTREAM.md](../data360-orchestrate/UPSTREAM.md)
|
||||
- [../data360-orchestrate/references/plugin-setup.md](../data360-orchestrate/references/plugin-setup.md)
|
||||
- [../data360-orchestrate/references/feature-readiness.md](../data360-orchestrate/references/feature-readiness.md)
|
||||
|
||||
@ -1,5 +0,0 @@
|
||||
# Credits & Acknowledgments
|
||||
|
||||
This skill is part of the `*-datacloud` family of skills covering the full Data Cloud workflow lifecycle. Shared upstream source mapping and maintenance notes live in:
|
||||
- [../data360-orchestrate/CREDITS.md](../data360-orchestrate/CREDITS.md)
|
||||
- [../data360-orchestrate/UPSTREAM.md](../data360-orchestrate/UPSTREAM.md)
|
||||
@ -55,5 +55,3 @@ sf data360 connection schema-upsert -o myorg --name <connector-id> -f examples/c
|
||||
|
||||
- [SKILL.md](SKILL.md)
|
||||
- [../data360-orchestrate/references/plugin-setup.md](../data360-orchestrate/references/plugin-setup.md)
|
||||
- [../data360-orchestrate/UPSTREAM.md](../data360-orchestrate/UPSTREAM.md)
|
||||
- [CREDITS.md](CREDITS.md)
|
||||
|
||||
@ -142,7 +142,6 @@ Next step: <prepare phase or connector follow-up>
|
||||
|
||||
## References
|
||||
|
||||
- [README.md](README.md)
|
||||
- [examples/connections/heroku-postgres.json](examples/connections/heroku-postgres.json)
|
||||
- [examples/connections/redshift.json](examples/connections/redshift.json)
|
||||
- [examples/connections/sharepoint-unstructured.json](examples/connections/sharepoint-unstructured.json)
|
||||
@ -151,4 +150,3 @@ Next step: <prepare phase or connector follow-up>
|
||||
- [examples/connections/ingest-api-schema.json](examples/connections/ingest-api-schema.json)
|
||||
- [../data360-orchestrate/references/plugin-setup.md](../data360-orchestrate/references/plugin-setup.md)
|
||||
- [../data360-orchestrate/references/feature-readiness.md](../data360-orchestrate/references/feature-readiness.md)
|
||||
- [../data360-orchestrate/UPSTREAM.md](../data360-orchestrate/UPSTREAM.md)
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
# Credits & Acknowledgments
|
||||
|
||||
This skill is part of the `*-datacloud` family of skills covering the Data Cloud lifecycle: ingestion, harmonization, segmentation, and retrieval.
|
||||
@ -107,7 +107,6 @@ Next step: <segment / retrieve / follow-up>
|
||||
|
||||
## References
|
||||
|
||||
- [README.md](README.md)
|
||||
- [../data360-orchestrate/assets/definitions/dmo.template.json](../data360-orchestrate/assets/definitions/dmo.template.json)
|
||||
- [../data360-orchestrate/assets/definitions/mapping.template.json](../data360-orchestrate/assets/definitions/mapping.template.json)
|
||||
- [../data360-orchestrate/assets/definitions/relationship.template.json](../data360-orchestrate/assets/definitions/relationship.template.json)
|
||||
|
||||
@ -1,15 +0,0 @@
|
||||
# Credits & Acknowledgments
|
||||
|
||||
This skill family distills publicly shared Data Cloud implementation knowledge into sf-skills house style. Attribution is intentionally explicit because contributor credit is a core sf-skills principle.
|
||||
|
||||
---
|
||||
|
||||
This family intentionally:
|
||||
- keeps sf-skills naming consistency (`*-datacloud`)
|
||||
- keeps the external CLI plugin outside this repo
|
||||
- favors deterministic helper scripts and reusable JSON templates
|
||||
- rewrites examples into generic sf-skills-style guidance rather than copying workshop-specific payloads
|
||||
|
||||
See [UPSTREAM.md](UPSTREAM.md) for the maintenance contract.
|
||||
|
||||
---
|
||||
@ -47,7 +47,6 @@ See [references/plugin-setup.md](references/plugin-setup.md).
|
||||
| [scripts/diagnose-org.mjs](scripts/diagnose-org.mjs) | Classify org readiness by phase before mutating Data Cloud assets |
|
||||
| [references/feature-readiness.md](references/feature-readiness.md) | Map high-signal errors and feature gates to concrete next steps |
|
||||
| [assets/definitions/](assets/definitions/) | Generic JSON templates for repeatable Data Cloud definition files |
|
||||
| [UPSTREAM.md](UPSTREAM.md) | Upstream mapping for future distillation and maintenance |
|
||||
|
||||
## Generic templates
|
||||
|
||||
@ -119,9 +118,3 @@ sf data360 activation platforms -o myorg 2>/dev/null
|
||||
- [SKILL.md](SKILL.md) - Orchestrator guidance
|
||||
- [references/plugin-setup.md](references/plugin-setup.md) - Plugin install and verification
|
||||
- [references/feature-readiness.md](references/feature-readiness.md) - Readiness classification and setup guidance
|
||||
- [UPSTREAM.md](UPSTREAM.md) - Upstream tracking and distillation policy
|
||||
- [CREDITS.md](CREDITS.md) - Contributor and source attribution
|
||||
|
||||
## Primary contributor
|
||||
|
||||
**Gnanasekaran Thoppae** — primary contributor for the data360-orchestrate family.
|
||||
|
||||
@ -215,10 +215,8 @@ Next step: <next phase, setup guidance, or cross-skill handoff>
|
||||
## Reference Map
|
||||
|
||||
### Start here
|
||||
- [README.md](README.md)
|
||||
- [references/plugin-setup.md](references/plugin-setup.md)
|
||||
- [references/feature-readiness.md](references/feature-readiness.md)
|
||||
- [UPSTREAM.md](UPSTREAM.md)
|
||||
|
||||
### Phase skills
|
||||
- [data360-connect](../data360-connect/SKILL.md)
|
||||
|
||||
@ -1,45 +0,0 @@
|
||||
# Upstream Distillation Map for data360-orchestrate
|
||||
|
||||
This file exists to make downstream maintenance easy without sacrificing sf-skills consistency.
|
||||
|
||||
## Maintenance contract
|
||||
|
||||
When upstream changes, do **not** copy blindly.
|
||||
|
||||
Instead:
|
||||
1. review new upstream commits
|
||||
2. identify changed command behaviors, install patterns, or gotchas
|
||||
3. update sf-skills prompts and templates in a distilled form
|
||||
4. keep naming, attribution, and cross-skill boundaries consistent with sf-skills
|
||||
5. update this file with the new reviewed commit SHAs
|
||||
|
||||
## High-priority upstream areas to re-check
|
||||
|
||||
- installation / linking workflow for the community plugin
|
||||
- command counts and topic coverage
|
||||
- API-version guidance
|
||||
- known issues and bug-fix notes
|
||||
- live-tested command set
|
||||
- any new commands affecting Connect / Prepare / Harmonize / Segment / Act / Retrieve boundaries
|
||||
- connector-specific payload examples worth distilling into generic repo-safe examples
|
||||
- search-index / hybrid-search guidance and any command-surface changes around hybrid scoring or prefilter behavior
|
||||
- Ingestion API schema-upload flow, send-data examples, and problem-record guidance
|
||||
- unstructured-source setup differences between connection-level reruns, stream refreshes, and initial UI seeding
|
||||
- UI-only gaps where upstream introduces browser automation; validate before importing
|
||||
|
||||
## Cross-skill boundary reminders
|
||||
|
||||
Keep Data Cloud product work in `*-datacloud`, but do not blur into:
|
||||
- `agentforce-observe` for STDM/session tracing/parquet workflows
|
||||
- `platform-soql-query` for CRM SOQL-only tasks
|
||||
- `platform-data-manage` for CRM record seeding/cleanup
|
||||
- `platform-*-generate` skills for CRM schema creation (custom objects, fields, validation rules, etc.)
|
||||
|
||||
## Local helper files in this family
|
||||
|
||||
- `references/plugin-setup.md`
|
||||
- `scripts/bootstrap-plugin.sh`
|
||||
- `scripts/verify-plugin.sh`
|
||||
- `assets/definitions/`
|
||||
|
||||
These are sf-skills-owned conveniences and should evolve independently from upstream when that improves user experience.
|
||||
@ -1,7 +0,0 @@
|
||||
# Credits & Acknowledgments
|
||||
|
||||
Primary contributor: **Gnanasekaran Thoppae**
|
||||
|
||||
This skill is part of the `*-datacloud` family. Shared attribution, upstream source mapping, and maintenance notes live in:
|
||||
- [../data360-orchestrate/CREDITS.md](../data360-orchestrate/CREDITS.md)
|
||||
- [../data360-orchestrate/UPSTREAM.md](../data360-orchestrate/UPSTREAM.md)
|
||||
@ -48,4 +48,3 @@ sf data360 connection run-existing -o myorg --name <connection-id> 2>/dev/null
|
||||
- [SKILL.md](SKILL.md)
|
||||
- [examples/ingestion-api/README.md](examples/ingestion-api/README.md)
|
||||
- [../data360-orchestrate/assets/definitions/data-stream.template.json](../data360-orchestrate/assets/definitions/data-stream.template.json)
|
||||
- [CREDITS.md](CREDITS.md)
|
||||
|
||||
@ -183,7 +183,6 @@ Next step: <harmonize or retrieve>
|
||||
|
||||
## References
|
||||
|
||||
- [README.md](README.md)
|
||||
- [examples/ingestion-api/README.md](examples/ingestion-api/README.md)
|
||||
- [../data360-orchestrate/assets/definitions/data-stream.template.json](../data360-orchestrate/assets/definitions/data-stream.template.json)
|
||||
- [../data360-orchestrate/references/plugin-setup.md](../data360-orchestrate/references/plugin-setup.md)
|
||||
|
||||
@ -1,7 +0,0 @@
|
||||
# Credits & Acknowledgments
|
||||
|
||||
Primary contributor: **Gnanasekaran Thoppae**
|
||||
|
||||
This skill is part of the `*-datacloud` family. Shared attribution, upstream source mapping, and maintenance notes live in:
|
||||
- [../data360-orchestrate/CREDITS.md](../data360-orchestrate/CREDITS.md)
|
||||
- [../data360-orchestrate/UPSTREAM.md](../data360-orchestrate/UPSTREAM.md)
|
||||
@ -41,4 +41,3 @@ sf data360 query hybrid -o myorg --index Knowledge_Index --query "reset password
|
||||
|
||||
- [SKILL.md](SKILL.md)
|
||||
- [../data360-orchestrate/assets/definitions/search-index.template.json](../data360-orchestrate/assets/definitions/search-index.template.json)
|
||||
- [CREDITS.md](CREDITS.md)
|
||||
|
||||
@ -111,7 +111,6 @@ Next step: <segment / harmonize / follow-up>
|
||||
|
||||
## References
|
||||
|
||||
- [README.md](README.md)
|
||||
- [examples/search-indexes/vector-knowledge.json](examples/search-indexes/vector-knowledge.json)
|
||||
- [examples/search-indexes/hybrid-structured.json](examples/search-indexes/hybrid-structured.json)
|
||||
- [../data360-orchestrate/assets/definitions/search-index.template.json](../data360-orchestrate/assets/definitions/search-index.template.json)
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
# Credits & Acknowledgments
|
||||
|
||||
This skill is part of the `*-datacloud` family of skills covering the Salesforce Data Cloud workflow phases. Shared definitions, templates, and readiness scripts for this family live in the `data360-orchestrate` skill directory.
|
||||
@ -33,4 +33,3 @@ sf data360 calculated-insight list -o myorg 2>/dev/null
|
||||
- [SKILL.md](SKILL.md)
|
||||
- [../data360-orchestrate/assets/definitions/calculated-insight.template.json](../data360-orchestrate/assets/definitions/calculated-insight.template.json)
|
||||
- [../data360-orchestrate/assets/definitions/segment.template.json](../data360-orchestrate/assets/definitions/segment.template.json)
|
||||
- [CREDITS.md](CREDITS.md)
|
||||
|
||||
@ -107,8 +107,6 @@ Next step: <act / retrieve / follow-up>
|
||||
|
||||
## References
|
||||
|
||||
- [README.md](README.md)
|
||||
- [../data360-orchestrate/assets/definitions/calculated-insight.template.json](../data360-orchestrate/assets/definitions/calculated-insight.template.json)
|
||||
- [../data360-orchestrate/assets/definitions/segment.template.json](../data360-orchestrate/assets/definitions/segment.template.json)
|
||||
- [../data360-orchestrate/references/feature-readiness.md](../data360-orchestrate/references/feature-readiness.md)
|
||||
- [../data360-orchestrate/UPSTREAM.md](../data360-orchestrate/UPSTREAM.md)
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
---
|
||||
name: experience-cms-brand-apply
|
||||
description: "Extracts, retrieves, and applies CMS brand guidelines (voice, tone, style, colors, typography) to generated content. Use this skill ANY TIME a user request involves branding, brand voice, brand tone, brand guidelines, brand identity, brand styling, or applying a brand to content. Triggers for requests like \"apply my brand\", \"use our brand voice\", \"match our brand guidelines\", \"find my brand\", \"search for brand\", \"get brand instructions\", \"apply brand tone\". Handles the full workflow: searching for brands in Salesforce CMS, extracting brand instructions, and applying brand voice/tone/guidelines to generated content. Does not apply to media/image search (use experience-content-media-search skill), logo search, or creating new brand definitions."
|
||||
compatibility: "Requires get_brand_instructions and/or search_brands MCP tools"
|
||||
compatibility: "Requires get_brand_instructions and/or search_media_cms_channels MCP tools"
|
||||
metadata:
|
||||
version: "1.0"
|
||||
---
|
||||
@ -44,7 +44,7 @@ When a user requests branded content:
|
||||
|
||||
Copy this checklist and track your progress:
|
||||
|
||||
```
|
||||
```text
|
||||
CMS Branding Progress:
|
||||
- [ ] Step 1: Determine if brand is already identified or needs search
|
||||
- [ ] Step 2: Search for brands (if needed) and present options to user
|
||||
@ -63,35 +63,63 @@ Check if the user has already specified which brand to use:
|
||||
|
||||
## Step 2: Search for Brands
|
||||
|
||||
**Tool:** `search_brands`
|
||||
**Tool:** `search_media_cms_channels`
|
||||
|
||||
Brands are stored as CMS content of type `sfdc_cms__brand`. Search for them by
|
||||
querying the CMS channels with the brand content type.
|
||||
|
||||
> **Note:** Brand content search (`contentTypeFqn=sfdc_cms__brand`) is explicitly
|
||||
> excluded from the `experience-content-media-search` skill's scope. Calling
|
||||
> `search_media_cms_channels` directly here is correct and intentional — do not
|
||||
> route brand search through `experience-content-media-search`.
|
||||
|
||||
**Process:**
|
||||
|
||||
1. **Determine search query** — Use the user's description, company name, or a general keyword
|
||||
2. **Build the request:**
|
||||
1. **Determine search query** — Use the user's keyword. Brand search matches on
|
||||
brand title and description.
|
||||
2. **Build the request** with the fixed brand-search input contract:
|
||||
|
||||
```json
|
||||
{
|
||||
"inputs": [{
|
||||
"searchQuery": "keyword or brand name"
|
||||
"searchKeyword": "keyword",
|
||||
"searchLanguage": "<detected_language>",
|
||||
"channelType": "PublicUnauthenticated",
|
||||
"contentTypeFqn": "sfdc_cms__brand",
|
||||
"pageOffset": 0,
|
||||
"searchLimit": 25
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
3. **Call `search_brands`** with the query
|
||||
4. **Parse the response** — Extract brand results:
|
||||
Field rules:
|
||||
- `searchKeyword` — the user's keyword input
|
||||
- `searchLanguage` — auto-detect from the user's input; if unsure, use `en_US`
|
||||
- `channelType` — always `PublicUnauthenticated` (brand content is delivered
|
||||
via the public CMS channel; authenticated-channel brand search is not
|
||||
supported by this tool)
|
||||
- `contentTypeFqn` — always `sfdc_cms__brand`
|
||||
- `pageOffset` — `0`
|
||||
- `searchLimit` — `25`
|
||||
|
||||
3. **Call `search_media_cms_channels`** with the request
|
||||
4. **Parse the response** — A brand result has an ID starting with **`9Ps`**. Extract:
|
||||
- `managedContentId` — Unique ID (use this for extraction in Step 3)
|
||||
- `managedContentKey` — Content key identifier
|
||||
- `title` — Brand display name
|
||||
- `contentUrl` — URL to the brand content
|
||||
- `totalResults` — Number of brands found
|
||||
- `contentUrl` — URL to the brand content, found under
|
||||
`managedContentChannelDeliveryDetails[0].contentUrl`
|
||||
- `pageNumber`, `pageSize`, `totalResults` — pagination summary
|
||||
|
||||
### Presenting Brand Results
|
||||
|
||||
**If multiple brands found**, use `ask_followup_question` to present options:
|
||||
**If brands found**, first show a summary line, then use `ask_followup_question`
|
||||
to present options:
|
||||
|
||||
```
|
||||
I found [N] brands in your CMS. Which one should I apply?
|
||||
```text
|
||||
Showing [N] of [totalResults] total results (page [pageNumber], page size [pageSize]).
|
||||
|
||||
Which brand should I apply?
|
||||
|
||||
1. [Brand Title 1]
|
||||
2. [Brand Title 2]
|
||||
@ -100,15 +128,18 @@ I found [N] brands in your CMS. Which one should I apply?
|
||||
Which brand would you like to use?
|
||||
```
|
||||
|
||||
When the user replies with their selection, do NOT perform another search —
|
||||
proceed immediately to Step 3.
|
||||
|
||||
**If one brand found**, confirm with the user:
|
||||
|
||||
```
|
||||
```text
|
||||
I found the brand "[Brand Title]". Should I apply this brand's guidelines to the content?
|
||||
```
|
||||
|
||||
**If no brands found:**
|
||||
|
||||
```
|
||||
```text
|
||||
No brands found in Salesforce CMS. To use branding:
|
||||
1. Create a brand in Salesforce CMS (Content Type: sfdc_cms__brand)
|
||||
2. Provide brand guidelines directly in this conversation
|
||||
@ -152,7 +183,7 @@ The extracted brand instructions typically include:
|
||||
|
||||
| Error | Response |
|
||||
|---|---|
|
||||
| `search_brands` unavailable | "Brand search is unavailable. Please provide your brand name or guidelines directly." |
|
||||
| `search_media_cms_channels` unavailable | "Brand search is unavailable. Please provide your brand name or guidelines directly." |
|
||||
| `get_brand_instructions` unavailable | "Cannot retrieve brand instructions. Please share your brand guidelines in this conversation and I'll apply them manually." |
|
||||
| Org lacks Vibes branding | "CMS branding is not enabled for this org. Contact your admin to enable the Agentforce Vibes branding feature." |
|
||||
| Permission denied | "You don't have permission to access CMS brands. Ensure you have Managed Content Authoring permission." |
|
||||
|
||||
@ -1,5 +0,0 @@
|
||||
# Credits & Acknowledgments
|
||||
|
||||
This skill is built on official Salesforce LWC platform patterns and established component development practices.
|
||||
|
||||
---
|
||||
@ -15,7 +15,7 @@ Lightning Web Components development skill with PICKLES architecture methodology
|
||||
|
||||
### 1. Invoke the skill
|
||||
|
||||
```
|
||||
```yaml
|
||||
Skill: experience-lwc-generate
|
||||
Request: "Create a data table component for Account records"
|
||||
```
|
||||
@ -39,7 +39,7 @@ The skill generates:
|
||||
|
||||
## PICKLES Framework
|
||||
|
||||
```
|
||||
```text
|
||||
P → Prototype │ Validate ideas with wireframes & mock data
|
||||
I → Integrate │ Choose data source (LDS, Apex, GraphQL, API)
|
||||
C → Composition │ Structure component hierarchy & communication
|
||||
@ -80,6 +80,7 @@ S → Security │ Enforce permissions, FLS, and data protection
|
||||
| generating-metadata | Create Lightning Message Channels |
|
||||
| platform-metadata-deploy | Deploy component to org |
|
||||
|
||||
|
||||
## Spring '26 Features (API 66.0)
|
||||
|
||||
- **lwc:on directive**: Dynamic event binding from JavaScript
|
||||
|
||||
@ -7,7 +7,7 @@ This guide covers real-time notification patterns for Lightning Web Components u
|
||||
|
||||
## Overview
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ ASYNC NOTIFICATION ARCHITECTURE │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
|
||||
@ -154,7 +154,7 @@ LWC can interact with Apex in two ways: **@wire** (reactive/declarative) and **i
|
||||
|
||||
#### Quick Comparison
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ WIRE vs IMPERATIVE APEX CALLS │
|
||||
├──────────────────┬──────────────────────────────┬────────────────────────────────────┤
|
||||
@ -254,7 +254,7 @@ export default class ImperativeExample extends LightningElement {
|
||||
|
||||
#### Decision Tree
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────┐
|
||||
│ Need to modify data? │
|
||||
│ (Insert/Update/Delete) │
|
||||
@ -955,7 +955,7 @@ export default class AccountList extends LightningElement {
|
||||
|
||||
When two child components need to communicate but share the same parent, use the **parent as middleware**. This is the recommended pattern for master-detail UIs.
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ SIBLING COMMUNICATION FLOW │
|
||||
├─────────────────────────────────────────────────────────────────────┤
|
||||
|
||||
@ -7,7 +7,7 @@ This guide covers building Lightning Web Components for use in Salesforce Flow S
|
||||
|
||||
## Overview
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ FLOW ↔ LWC COMMUNICATION │
|
||||
├─────────────────────────────────────────────────────────────────────┤
|
||||
|
||||
@ -9,7 +9,7 @@ This guide provides comprehensive best practices for building production-ready L
|
||||
|
||||
The PICKLES Framework provides a structured approach to LWC architecture. Use it as a checklist during component design and implementation.
|
||||
|
||||
```
|
||||
```text
|
||||
🥒 P - Prototype → Validate ideas with wireframes & mock data
|
||||
🥒 I - Integrate → Choose data source (LDS, Apex, GraphQL)
|
||||
🥒 C - Composition → Structure component hierarchy & communication
|
||||
@ -29,7 +29,7 @@ The PICKLES Framework provides a structured approach to LWC architecture. Use it
|
||||
|
||||
Each component should do one thing well.
|
||||
|
||||
```
|
||||
```text
|
||||
✅ GOOD: accountCard, accountList, accountForm (separate components)
|
||||
❌ BAD: accountManager (does display, list, and form in one)
|
||||
```
|
||||
@ -52,7 +52,7 @@ Build complex UIs by composing simple components.
|
||||
|
||||
Data flows down (props), events bubble up.
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ DATA FLOW PATTERN │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
@ -268,7 +268,7 @@ this.dispatchEvent(new CustomEvent('change', {
|
||||
|
||||
### Event Naming Conventions
|
||||
|
||||
```
|
||||
```text
|
||||
✅ GOOD ❌ BAD
|
||||
──────────────────────── ────────────────────────
|
||||
onselect onSelectItem
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
| **PICKLES Compliance** | 25 | Architecture methodology adherence (optional) |
|
||||
|
||||
**Scoring Thresholds**:
|
||||
```
|
||||
```text
|
||||
⭐⭐⭐⭐⭐ 150-165 pts → Production-ready, full SLDS 2 + Dark Mode
|
||||
⭐⭐⭐⭐ 125-149 pts → Good component, minor styling issues
|
||||
⭐⭐⭐ 100-124 pts → Functional, needs SLDS cleanup
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
|
||||
LWC state management has evolved beyond simple reactive properties. This guide covers modern patterns for managing complex state across components, including the `@lwc/state` library and Salesforce Platform State Managers.
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ STATE MANAGEMENT SPECTRUM │
|
||||
├─────────────────────────────────────────────────────────────────────────────┤
|
||||
@ -588,7 +588,7 @@ disconnectedCallback() {
|
||||
|
||||
## Best Practices Summary
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ STATE MANAGEMENT BEST PRACTICES │
|
||||
├─────────────────────────────────────────────────────────────────────────────┤
|
||||
|
||||
@ -7,7 +7,7 @@ The **Triangle Architecture** is a foundational Salesforce pattern where Flow, L
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────┐
|
||||
│ FLOW │
|
||||
│ (Orchestrator) │
|
||||
@ -54,7 +54,7 @@ The **Triangle Architecture** is a foundational Salesforce pattern where Flow, L
|
||||
|
||||
**Use Case**: Custom UI component for user selection within a guided Flow.
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────┐ @api (in) ┌─────────┐
|
||||
│ FLOW │ ────────────────▶ │ LWC │
|
||||
│ Screen │ │ Screen │
|
||||
@ -320,7 +320,7 @@ describe('c-record-selector', () => {
|
||||
|
||||
When deploying integrated triangle solutions:
|
||||
|
||||
```
|
||||
```text
|
||||
1. APEX CLASSES
|
||||
└── @AuraEnabled controllers (LWC depends on these)
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Post-Tool Validation Hook for generating-lwc-components plugin.
|
||||
Post-Tool Validation Hook for experience-lwc-generate plugin.
|
||||
|
||||
This hook runs AFTER Write or Edit tool completes and provides SLDS 2
|
||||
validation feedback for LWC files (*.html, *.css, *.js).
|
||||
@ -38,7 +38,7 @@ for _ca_path in _CODE_ANALYZER_CANDIDATES:
|
||||
break
|
||||
|
||||
# Also add shared dir for other shared modules
|
||||
PLUGIN_ROOT = os.path.dirname(os.path.dirname(SCRIPT_DIR)) # generating-lwc-components/
|
||||
PLUGIN_ROOT = os.path.dirname(os.path.dirname(SCRIPT_DIR)) # experience-lwc-generate/
|
||||
SKILLS_ROOT = os.path.dirname(PLUGIN_ROOT)
|
||||
SHARED_DIR = os.path.join(SKILLS_ROOT, "shared")
|
||||
if os.path.isdir(SHARED_DIR):
|
||||
|
||||
@ -282,7 +282,7 @@ def format_output(results: Dict) -> str:
|
||||
output_parts.append(f" ... and {remaining} more issues")
|
||||
|
||||
output_parts.append("─" * 50)
|
||||
output_parts.append("📚 See: generating-lwc-components/references/template-anti-patterns.md")
|
||||
output_parts.append("📚 See: experience-lwc-generate/references/template-anti-patterns.md")
|
||||
|
||||
return "\n".join(output_parts)
|
||||
|
||||
|
||||
@ -1,46 +0,0 @@
|
||||
# Credits & Acknowledgments
|
||||
|
||||
This skill was built upon established patterns in technical diagramming and Salesforce data modeling. The following concepts and conventions shaped its design.
|
||||
|
||||
---
|
||||
|
||||
## Diagramming Concepts
|
||||
|
||||
### Text-Based Diagramming
|
||||
The skill uses Mermaid as its primary diagramming syntax, covering Entity Relationship Diagrams, sequence diagrams, and flowcharts. Key capabilities include:
|
||||
|
||||
- Entity Relationship Diagram syntax
|
||||
- Sequence diagram patterns
|
||||
- Flowchart and state diagram support
|
||||
- Live rendering through Mermaid-capable renderers
|
||||
|
||||
An alternative syntax, PlantUML, informed the UML diagram patterns used in sequence and class diagrams.
|
||||
|
||||
---
|
||||
|
||||
## Salesforce Domain Patterns
|
||||
|
||||
### Data Modeling Conventions
|
||||
The ERD conventions follow standard Salesforce object relationship patterns, including Master-Detail, Lookup, and External relationships as documented in the Salesforce platform's object model.
|
||||
|
||||
### Integration Architecture
|
||||
Integration sequence diagrams draw on widely-adopted API documentation patterns adapted for Salesforce's authentication and integration architecture.
|
||||
|
||||
### Schema Reference
|
||||
Object and field relationship information reflects standard Salesforce object reference conventions and relationship type definitions.
|
||||
|
||||
---
|
||||
|
||||
## Key Concepts
|
||||
|
||||
### ERD Notation
|
||||
The Entity Relationship Diagram conventions follow standard database modeling patterns adapted for Salesforce relationships (Master-Detail, Lookup, External).
|
||||
|
||||
### Sequence Diagram Patterns
|
||||
OAuth flow and integration sequence diagrams follow UML 2.0 standards with Salesforce-specific adaptations.
|
||||
|
||||
### Mermaid in Documentation
|
||||
The approach of using Mermaid for inline diagrams in Markdown documentation is a widely-adopted pattern in technical documentation that enables version-controlled diagrams alongside code.
|
||||
|
||||
### Color Accessibility
|
||||
The color palette follows accessibility guidelines for color-blind-friendly design, using a pastel fill with high-contrast stroke approach.
|
||||
@ -19,7 +19,7 @@
|
||||
|
||||
## Quick Start
|
||||
|
||||
```
|
||||
```text
|
||||
# Generate an OAuth diagram
|
||||
"Create a JWT Bearer OAuth flow diagram"
|
||||
|
||||
@ -85,7 +85,7 @@ sequenceDiagram
|
||||
```
|
||||
|
||||
### ASCII Fallback
|
||||
```
|
||||
```text
|
||||
┌───────────────┐ ┌───────────────┐
|
||||
│ Server │ │ Salesforce │
|
||||
└───────┬───────┘ └───────┬───────┘
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
---
|
||||
name: external-diagram-mermaid-generate
|
||||
description: "Salesforce architecture diagrams using Mermaid with ASCII fallback. Use this skill when generating text-based diagrams for Salesforce architecture, OAuth flows, ERDs, integration sequences, or Agentforce structure. TRIGGER when: user says \"diagram\", \"visualize\", \"ERD\", or asks for sequence diagrams, flowcharts, class diagrams, or architecture visualizations in Mermaid. DO NOT TRIGGER when: user wants PNG/SVG image output (use external-diagram-visual-generate), or asks about non-Salesforce systems."
|
||||
description: "Salesforce architecture diagrams using Mermaid with ASCII fallback. Use this skill when generating text-based diagrams for Salesforce architecture, OAuth flows, ERDs, integration sequences, or Agentforce structure. TRIGGER when: user says \"diagram\", \"visualize\", \"ERD\", or asks for sequence diagrams, flowcharts, class diagrams, or architecture visualizations in Mermaid. DO NOT TRIGGER when: user asks about non-Salesforce systems."
|
||||
compatibility: "Requires Mermaid-capable renderer for diagram previews"
|
||||
metadata:
|
||||
version: "1.0"
|
||||
@ -20,7 +20,6 @@ Use `external-diagram-mermaid-generate` when the user wants:
|
||||
- diagrams that can live directly in docs, READMEs, or issues
|
||||
|
||||
### Out of Scope — Delegate elsewhere when the user wants:
|
||||
- rendered PNG/SVG images or polished mockups → [external-diagram-visual-generate](../external-diagram-visual-generate/SKILL.md)
|
||||
- non-Salesforce systems only → use a more general diagramming skill
|
||||
- object discovery before an ERD → [platform-custom-object-generate](../platform-custom-object-generate/SKILL.md) or [platform-custom-field-generate](../platform-custom-field-generate/SKILL.md)
|
||||
|
||||
@ -125,7 +124,6 @@ Call out the key relationships, flow direction, and any assumptions.
|
||||
| Need | Delegate to | Reason |
|
||||
|---|---|---|
|
||||
| real object / field definitions | [platform-custom-object-generate](../platform-custom-object-generate/SKILL.md) / [platform-custom-field-generate](../platform-custom-field-generate/SKILL.md) | grounded ERD generation |
|
||||
| rendered diagram / image output | [external-diagram-visual-generate](../external-diagram-visual-generate/SKILL.md) | visual polish beyond Mermaid |
|
||||
| connected-app auth setup context | [integration-connectivity-connected-app-configure](../integration-connectivity-connected-app-configure/SKILL.md) | accurate OAuth flows |
|
||||
| Agentforce logic visualization | [agentforce-generate](../agentforce-generate/SKILL.md) | source-of-truth behavior details |
|
||||
| Flow behavior diagrams | [automation-flow-generate](../automation-flow-generate/SKILL.md) | actual Flow logic grounding |
|
||||
|
||||
@ -202,7 +202,7 @@ flowchart TD
|
||||
|
||||
## ASCII Fallback Template
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ 🤖 SERVICE AGENT STRUCTURE │
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
@ -283,17 +283,17 @@ flowchart TD
|
||||
## Conversation Flow Patterns
|
||||
|
||||
### 1. Linear Flow
|
||||
```
|
||||
```text
|
||||
Start → Topic → Action → Response → End
|
||||
```
|
||||
|
||||
### 2. Branching Flow
|
||||
```
|
||||
```text
|
||||
Start → Classify → [Topic A | Topic B | Escalate]
|
||||
```
|
||||
|
||||
### 3. Loop Back
|
||||
```
|
||||
```text
|
||||
Start → Topic → Action → Validate → [Success | Retry]
|
||||
```
|
||||
|
||||
|
||||
@ -268,7 +268,7 @@ flowchart TB
|
||||
|
||||
## ASCII Fallback Template
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ SYSTEM LANDSCAPE │
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
@ -107,7 +107,7 @@ flowchart LR
|
||||
## Key Concepts
|
||||
|
||||
### B2B Commerce Flow
|
||||
```
|
||||
```text
|
||||
WebStore → ProductCatalog → Product2
|
||||
↓ ↓
|
||||
BuyerAccount → WebCart → CartItem → Order
|
||||
@ -123,7 +123,7 @@ BuyerGroup → Entitlements (What they can see/buy)
|
||||
| BuyerGroup | Pricing/entitlement grouping |
|
||||
|
||||
### Entitlement Model
|
||||
```
|
||||
```text
|
||||
CommerceEntitlementPolicy
|
||||
├── CommerceEntitlementProduct (What products)
|
||||
└── CommerceEntitlementBuyerGroup (Who can see)
|
||||
@ -223,7 +223,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ B2B COMMERCE DATA MODEL (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
||||
|
||||
@ -130,7 +130,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ CAMPAIGNS DATA MODEL (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
||||
|
||||
@ -114,7 +114,7 @@ flowchart LR
|
||||
Each contact point links to an Individual.
|
||||
|
||||
### Consent Model
|
||||
```
|
||||
```text
|
||||
DataUsePurpose → ContactPointConsent ← ContactPoint
|
||||
(e.g., Marketing) (Opt-In/Out) (Email/Phone)
|
||||
```
|
||||
@ -179,7 +179,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ CONSENT DATA MODEL (GDPR/PRIVACY) (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
||||
|
||||
@ -86,7 +86,7 @@ flowchart LR
|
||||
## Key Concepts
|
||||
|
||||
### Content Architecture
|
||||
```
|
||||
```text
|
||||
ContentDocument (Container)
|
||||
├── ContentVersion (Current + History)
|
||||
├── ContentDocumentLink (Sharing to Records)
|
||||
@ -177,7 +177,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ SALESFORCE FILES DATA MODEL (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
||||
|
||||
@ -114,7 +114,7 @@ flowchart LR
|
||||
| Omitted | Excluded from forecast |
|
||||
|
||||
### Forecast Rollup Hierarchy
|
||||
```
|
||||
```text
|
||||
CEO
|
||||
└── VP Sales
|
||||
├── Regional Manager 1
|
||||
@ -182,7 +182,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ COLLABORATIVE FORECASTS DATA MODEL (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
||||
|
||||
@ -127,7 +127,7 @@ flowchart LR
|
||||
## Key Concepts
|
||||
|
||||
### FSL Object Hierarchy
|
||||
```
|
||||
```text
|
||||
Case/Asset → WorkOrder → WorkOrderLineItem → ServiceAppointment
|
||||
↓ ↓ ↓
|
||||
ProductRequired ProductConsumed AssignedResource
|
||||
@ -245,7 +245,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ FIELD SERVICE LIGHTNING DATA MODEL (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
||||
|
||||
@ -157,7 +157,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ PARTY MODEL (INDUSTRY CLOUD) DATA MODEL (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
||||
|
||||
@ -102,7 +102,7 @@ flowchart LR
|
||||
## Key Concepts
|
||||
|
||||
### Quote-to-Cash Flow
|
||||
```
|
||||
```text
|
||||
Opportunity → Quote → Order → Invoice → Payment
|
||||
↓ ↓ ↓
|
||||
OLI QLI OrderItem
|
||||
@ -121,7 +121,7 @@ Opportunity → Quote → Order → Invoice → Payment
|
||||
| Reduction Orders | Negative quantity adjustments |
|
||||
|
||||
### Pricebook Structure
|
||||
```
|
||||
```text
|
||||
Pricebook2 (Standard + Custom)
|
||||
↓
|
||||
PricebookEntry (Product + Price per Pricebook)
|
||||
@ -176,7 +176,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ QUOTE & ORDER DATA MODEL (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
||||
|
||||
@ -109,7 +109,7 @@ flowchart LR
|
||||
| **Dynamic Revenue Orchestration** | Guided selling |
|
||||
|
||||
### Product Hierarchy
|
||||
```
|
||||
```text
|
||||
ProductCatalog
|
||||
└── ProductCategory (Hierarchy)
|
||||
└── Product2
|
||||
@ -244,7 +244,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ REVENUE CLOUD DATA MODEL (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
||||
|
||||
@ -116,7 +116,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ SALES CLOUD DATA MODEL (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>), -.-> = converts │
|
||||
|
||||
@ -94,7 +94,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback Template
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ DATA MODEL (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
||||
|
||||
@ -112,7 +112,7 @@ flowchart LR
|
||||
## Key Concepts
|
||||
|
||||
### Scheduling Flow
|
||||
```
|
||||
```text
|
||||
Customer (Contact) → WorkType → ServiceAppointment ← ServiceResource
|
||||
↓
|
||||
ServiceTerritory
|
||||
@ -184,7 +184,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ SALESFORCE SCHEDULER DATA MODEL (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
||||
|
||||
@ -120,7 +120,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ SERVICE CLOUD DATA MODEL (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
||||
@ -173,14 +173,14 @@ flowchart LR
|
||||
## Service Cloud Patterns
|
||||
|
||||
### Case Flow
|
||||
```
|
||||
```text
|
||||
Customer → Contact → Case → CaseComment
|
||||
↓
|
||||
Entitlement (SLA)
|
||||
```
|
||||
|
||||
### Entitlement Coverage
|
||||
```
|
||||
```text
|
||||
Account → ServiceContract → Entitlement → Case
|
||||
└─────────────────────────────────────┘
|
||||
(direct)
|
||||
|
||||
@ -162,7 +162,7 @@ flowchart LR
|
||||
|
||||
## ASCII Fallback
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ ENTERPRISE TERRITORY MANAGEMENT DATA MODEL (L→R) │
|
||||
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
||||
|
||||
@ -217,7 +217,7 @@ sequenceDiagram
|
||||
|
||||
## ASCII Fallback Template - Outbound Integration
|
||||
|
||||
```
|
||||
```text
|
||||
┌───────────────┐ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐
|
||||
│ Trigger │ │ Queueable │ │ Named │ │ External │
|
||||
│ │ │ │ │ Credential │ │ API │
|
||||
|
||||
@ -80,7 +80,7 @@ sequenceDiagram
|
||||
|
||||
## ASCII Fallback Template
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────┐ ┌───────────────┐ ┌────────────────────┐
|
||||
│ User │ │ Mobile App │ │ Salesforce │
|
||||
│ │ │ or SPA │ │ (Auth Server) │
|
||||
|
||||
@ -83,7 +83,7 @@ sequenceDiagram
|
||||
|
||||
## ASCII Fallback Template
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────┐ ┌───────────────┐ ┌────────────────────┐
|
||||
│ User/ │ │ Application │ │ Salesforce │
|
||||
│ Browser │ │ Server │ │ (Auth Server) │
|
||||
|
||||
@ -71,7 +71,7 @@ sequenceDiagram
|
||||
|
||||
## ASCII Fallback Template
|
||||
|
||||
```
|
||||
```text
|
||||
┌───────────────────────┐ ┌────────────────────┐
|
||||
│ Service/Backend │ │ Salesforce │
|
||||
│ (client_id/secret) │ │ (Auth Server) │
|
||||
|
||||
@ -94,7 +94,7 @@ sequenceDiagram
|
||||
|
||||
## ASCII Fallback Template
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────┐ ┌───────────┐ ┌────────────┐ ┌────────────────┐
|
||||
│ User │ │ Browser │ │ Device │ │ Salesforce │
|
||||
│ │ │(phone/PC) │ │ (CLI/TV) │ │ (Auth Server) │
|
||||
@ -166,7 +166,7 @@ curl -X POST https://login.salesforce.com/services/oauth2/device/code \
|
||||
|
||||
## Step 2: Display to User
|
||||
|
||||
```
|
||||
```text
|
||||
═══════════════════════════════════════════════════════════════
|
||||
To authorize this device, please:
|
||||
|
||||
|
||||
@ -82,7 +82,7 @@ sequenceDiagram
|
||||
|
||||
## ASCII Fallback Template
|
||||
|
||||
```
|
||||
```text
|
||||
┌───────────────────────┐ ┌────────────────────┐
|
||||
│ Server/CI/CD │ │ Salesforce │
|
||||
│ (Private Key) │ │ (Certificate) │
|
||||
@ -145,7 +145,7 @@ sequenceDiagram
|
||||
```
|
||||
|
||||
### Signature
|
||||
```
|
||||
```text
|
||||
RS256(
|
||||
base64URLEncode(header) + "." + base64URLEncode(payload),
|
||||
privateKey
|
||||
|
||||
@ -66,7 +66,7 @@ sequenceDiagram
|
||||
|
||||
## ASCII Fallback Template
|
||||
|
||||
```
|
||||
```text
|
||||
┌───────────────────────┐ ┌────────────────────┐
|
||||
│ Application │ │ Salesforce │
|
||||
│ (stored tokens) │ │ (Auth Server) │
|
||||
|
||||
@ -115,7 +115,7 @@ sequenceDiagram
|
||||
|
||||
## ASCII Fallback Template
|
||||
|
||||
```
|
||||
```text
|
||||
┌────────────────┐ ┌────────────────────┐ ┌─────────────────────┐
|
||||
│ Client │ │ Salesforce │ │ OIDC Provider │
|
||||
│ (Mobile App) │ │ (Auth/RP Server) │ │ (Google/Facebook) │
|
||||
@ -221,7 +221,7 @@ sequenceDiagram
|
||||
|
||||
### Auth. Provider Setup
|
||||
|
||||
```
|
||||
```text
|
||||
Setup → Auth. Providers → New
|
||||
├── Provider Type: OpenID Connect (or specific: Google, Facebook)
|
||||
├── Consumer Key: [From OP Developer Console]
|
||||
|
||||
@ -211,7 +211,7 @@ flowchart TB
|
||||
|
||||
## ASCII Fallback Template
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ ROLE HIERARCHY │
|
||||
└─────────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
@ -5,7 +5,7 @@ Soft pastel color palette (Tailwind 200-level) with dark borders for clear defin
|
||||
|
||||
## Primary Palette (Tailwind 200 + Dark Borders)
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ COMPONENT │ FILL (200) │ STROKE (700+) │ TEXT COLOR │
|
||||
├───────────────────────────┼──────────────┼────────────────┼────────────────┤
|
||||
@ -24,7 +24,7 @@ Soft pastel color palette (Tailwind 200-level) with dark borders for clear defin
|
||||
|
||||
## Subgraph Background Colors (Tailwind 50-level)
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ SUBGRAPH │ FILL (50) │ STROKE (700+) │ STYLE │
|
||||
├───────────────────────────┼──────────────┼────────────────┼────────────────┤
|
||||
@ -45,7 +45,7 @@ Soft pastel color palette (Tailwind 200-level) with dark borders for clear defin
|
||||
|
||||
## Salesforce-Specific Colors
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ SALESFORCE COMPONENT │ FILL (200) │ STROKE (700+) │ TEXT COLOR │
|
||||
├───────────────────────────┼──────────────┼────────────────┼────────────────┤
|
||||
@ -62,7 +62,7 @@ Soft pastel color palette (Tailwind 200-level) with dark borders for clear defin
|
||||
|
||||
Color coding for data model diagrams by object type:
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ OBJECT TYPE │ FILL (200) │ STROKE (700+) │ TEXT COLOR │
|
||||
├───────────────────────────┼──────────────┼────────────────┼────────────────┤
|
||||
@ -114,7 +114,7 @@ style ext fill:#ecfdf5,stroke:#047857,stroke-dasharray:5
|
||||
|
||||
## Status Colors
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
│ STATUS │ FILL (200) │ STROKE (700+) │ ICON │
|
||||
├───────────────────────────┼──────────────┼────────────────┼────────────────┤
|
||||
@ -132,7 +132,7 @@ style ext fill:#ecfdf5,stroke:#047857,stroke-dasharray:5
|
||||
|
||||
Mermaid supports custom fonts via `%%{init}`:
|
||||
|
||||
```
|
||||
```text
|
||||
%%{init: { "fontFamily": "Inter, sans-serif", "fontSize": "14px" }}%%
|
||||
```
|
||||
|
||||
@ -187,7 +187,7 @@ Control diagram density with `%%{init}` configuration:
|
||||
|
||||
For clean, readable diagrams:
|
||||
|
||||
```
|
||||
```text
|
||||
%%{init: {"flowchart": {"nodeSpacing": 80, "rankSpacing": 70}} }%%
|
||||
```
|
||||
|
||||
@ -248,7 +248,7 @@ flowchart TB
|
||||
|
||||
### Simple Label (Recommended)
|
||||
|
||||
```
|
||||
```json
|
||||
["🤖 agentforce-generate"]
|
||||
```
|
||||
|
||||
@ -256,7 +256,7 @@ Keep labels short for consistent rendering.
|
||||
|
||||
### Database/Cylinder
|
||||
|
||||
```
|
||||
```json
|
||||
[(💾 Database)]
|
||||
```
|
||||
|
||||
@ -344,7 +344,7 @@ flowchart TB
|
||||
### Detailed Guidelines
|
||||
|
||||
#### Node Labels: lowercase (Recommended)
|
||||
```
|
||||
```text
|
||||
["🤖 agentforce-generate"] ✅ Preferred
|
||||
["🤖 agentforce-generate"] ❌ Avoid
|
||||
["🤖 agentforce-generate"] ❌ Avoid
|
||||
@ -357,7 +357,7 @@ flowchart TB
|
||||
- Easier to read in compact diagram nodes
|
||||
|
||||
#### Subgraph Titles: UPPERCASE
|
||||
```
|
||||
```text
|
||||
subgraph ai["🤖 AI & AGENTS"] ✅ UPPERCASE
|
||||
subgraph ai["🤖 ai & agents"] ❌ lowercase
|
||||
subgraph ai["🤖 Ai & Agents"] ❌ Title Case
|
||||
@ -370,7 +370,7 @@ subgraph ai["🤖 Ai & Agents"] ❌ Title Case
|
||||
- Maximum contrast between group titles and contents
|
||||
|
||||
#### Edge Labels: lowercase
|
||||
```
|
||||
```text
|
||||
-->|"schema"| ✅ lowercase
|
||||
-->|"Schema"| ❌ Title Case
|
||||
-->|"SCHEMA"| ❌ ALL CAPS
|
||||
@ -382,7 +382,7 @@ subgraph ai["🤖 Ai & Agents"] ❌ Title Case
|
||||
- Consistent with node label style
|
||||
|
||||
#### ASCII Diagrams: UPPERCASE for Headers
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────┐
|
||||
│ SYSTEM LANDSCAPE │ ✅ UPPERCASE header
|
||||
└─────────────────────────────────────┘
|
||||
|
||||
@ -48,7 +48,7 @@ Consistency guidelines for all sf-diagram generated diagrams.
|
||||
|
||||
### Example Structure
|
||||
|
||||
```
|
||||
```text
|
||||
%%{init: {...}}%%
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
@ -85,7 +85,7 @@ sequenceDiagram
|
||||
|
||||
### Field Representation
|
||||
|
||||
```
|
||||
```text
|
||||
OBJECT {
|
||||
Type FieldName Annotation "Comment"
|
||||
}
|
||||
@ -198,7 +198,7 @@ flowchart LR
|
||||
|
||||
### Box Drawing Characters
|
||||
|
||||
```
|
||||
```text
|
||||
Standard Box:
|
||||
┌─────────────────┐
|
||||
│ │
|
||||
@ -228,7 +228,7 @@ Rounded corners (optional):
|
||||
|
||||
### Arrow Characters
|
||||
|
||||
```
|
||||
```yaml
|
||||
Right: ───> or ──▶ or ────────────────>
|
||||
Left: <─── or ◀──
|
||||
Up: ▲
|
||||
@ -244,7 +244,7 @@ Bidirectional: <──>
|
||||
|
||||
### Example ASCII Sequence
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────┐ ┌───────────────┐ ┌────────────────┐
|
||||
│ Client │ │ Server │ │ Database │
|
||||
└────┬─────┘ └───────┬───────┘ └───────┬────────┘
|
||||
|
||||
@ -13,7 +13,7 @@ Standardized conventions for Salesforce data model diagrams with object type ind
|
||||
|
||||
### Examples
|
||||
|
||||
```
|
||||
```text
|
||||
Account [STD] → Standard Salesforce object
|
||||
Invoice__c [CUST] → Custom object
|
||||
SAP_Product__x [EXT] → External object via Salesforce Connect
|
||||
|
||||
@ -7,7 +7,7 @@ Use individual `style` declarations with **Tailwind 200-level pastel fills** and
|
||||
|
||||
Add this init directive at the start of every flowchart for optimal readability:
|
||||
|
||||
```
|
||||
```text
|
||||
%%{init: {"flowchart": {"nodeSpacing": 80, "rankSpacing": 70}} }%%
|
||||
```
|
||||
|
||||
@ -74,7 +74,7 @@ flowchart TB
|
||||
## Node Label Pattern
|
||||
|
||||
Keep labels short (icon + name only). Avoid `<br/>` and `<small>` tags:
|
||||
```
|
||||
```json
|
||||
["🔐 integration-connectivity-connected-app-configure"]
|
||||
```
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@ After generating the diagram, offer the user a localhost preview for real-time i
|
||||
## Start Preview
|
||||
|
||||
1. Save Mermaid code to temporary file:
|
||||
```
|
||||
```text
|
||||
Write: /tmp/mermaid-preview.mmd
|
||||
[Mermaid code content]
|
||||
```
|
||||
|
||||
@ -8,7 +8,7 @@ Real-world examples of using the sf-diagram skill.
|
||||
## Example 1: OAuth Flow Diagram
|
||||
|
||||
### Request
|
||||
```
|
||||
```text
|
||||
"Create a JWT Bearer OAuth flow diagram for our CI/CD pipeline integration"
|
||||
```
|
||||
|
||||
@ -60,7 +60,7 @@ sequenceDiagram
|
||||
```
|
||||
|
||||
#### ASCII Fallback
|
||||
```
|
||||
```text
|
||||
┌───────────────────────┐ ┌────────────────────┐
|
||||
│ GitHub Actions │ │ Salesforce │
|
||||
│ (Private Key) │ │ (Certificate) │
|
||||
@ -81,7 +81,7 @@ sequenceDiagram
|
||||
```
|
||||
|
||||
### Score
|
||||
```
|
||||
```yaml
|
||||
Score: 72/80 ⭐⭐⭐⭐⭐ Excellent
|
||||
├─ Accuracy: 20/20 ✓ All JWT Bearer steps correct
|
||||
├─ Clarity: 18/20 ✓ Clear labels, good flow
|
||||
@ -95,7 +95,7 @@ Score: 72/80 ⭐⭐⭐⭐⭐ Excellent
|
||||
## Example 2: Data Model ERD
|
||||
|
||||
### Request
|
||||
```
|
||||
```text
|
||||
"Create an ERD for our custom Invoice system with Invoice__c, Invoice_Line_Item__c, and relationships to Account and Product"
|
||||
```
|
||||
|
||||
@ -168,7 +168,7 @@ erDiagram
|
||||
```
|
||||
|
||||
#### ASCII Fallback
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────┐ ┌─────────────────────────┐
|
||||
│ ACCOUNT │ │ CONTACT │
|
||||
├─────────────────────────┤ ├─────────────────────────┤
|
||||
@ -214,7 +214,7 @@ erDiagram
|
||||
```
|
||||
|
||||
### Score
|
||||
```
|
||||
```yaml
|
||||
Score: 74/80 ⭐⭐⭐⭐⭐ Excellent
|
||||
├─ Accuracy: 20/20 ✓ All relationships correct
|
||||
├─ Clarity: 19/20 ✓ Clear field annotations
|
||||
@ -228,7 +228,7 @@ Score: 74/80 ⭐⭐⭐⭐⭐ Excellent
|
||||
## Example 3: Integration Sequence
|
||||
|
||||
### Request
|
||||
```
|
||||
```text
|
||||
"Diagram our real-time Order sync from Salesforce to SAP using Platform Events"
|
||||
```
|
||||
|
||||
@ -302,7 +302,7 @@ sequenceDiagram
|
||||
```
|
||||
|
||||
### Score
|
||||
```
|
||||
```yaml
|
||||
Score: 70/80 ⭐⭐⭐⭐ Very Good
|
||||
├─ Accuracy: 19/20 ✓ Platform Event pattern correct
|
||||
├─ Clarity: 18/20 ✓ Good error handling shown
|
||||
@ -316,7 +316,7 @@ Score: 70/80 ⭐⭐⭐⭐ Very Good
|
||||
## Example 4: Combined Request
|
||||
|
||||
### Request
|
||||
```
|
||||
```text
|
||||
"I need to document our partner portal authentication.
|
||||
Create: 1) The OAuth flow for partner login, 2) The data model showing Partner Account, Portal User, and Opportunities they can see"
|
||||
```
|
||||
|
||||
@ -53,7 +53,7 @@ python mermaid_preview.py status
|
||||
|
||||
## How It Works
|
||||
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Browser Tab │
|
||||
│ ┌─────────────────────────────────────────────────────┐ │
|
||||
|
||||
@ -1,80 +0,0 @@
|
||||
# Credits & Acknowledgments
|
||||
|
||||
This skill leverages cutting-edge AI technologies and tools to enable visual content generation in Salesforce development workflows.
|
||||
|
||||
---
|
||||
|
||||
## Technologies & Tools
|
||||
|
||||
### Google Gemini
|
||||
|
||||
Key capabilities:
|
||||
- Gemini 3 Pro multimodal AI model
|
||||
- Image generation via Nano Banana Pro extension
|
||||
- Code review and analysis capabilities
|
||||
- Documentation research and summarization
|
||||
|
||||
### Gemini CLI
|
||||
|
||||
Key features:
|
||||
- Command-line access to Gemini models
|
||||
- Extension support (Nano Banana)
|
||||
- Non-interactive mode with --yolo flag
|
||||
- JSON output for programmatic use
|
||||
|
||||
### Nano Banana Pro
|
||||
|
||||
Gemini image generation extension.
|
||||
|
||||
Key features:
|
||||
- High-quality image generation
|
||||
- ERD and diagram creation
|
||||
- UI/UX mockup generation
|
||||
- Architecture visualization
|
||||
|
||||
---
|
||||
|
||||
## Display Technologies
|
||||
|
||||
### timg
|
||||
|
||||
Terminal image viewer.
|
||||
|
||||
Key features:
|
||||
- Kitty graphics protocol support
|
||||
- Multiple format support (PNG, JPG, GIF)
|
||||
- Inline terminal display
|
||||
|
||||
### Kitty Graphics Protocol
|
||||
|
||||
High-fidelity image rendering protocol for modern terminals.
|
||||
|
||||
Key features:
|
||||
- High-fidelity image display in terminals
|
||||
- Supported by Ghostty, Kitty, WezTerm
|
||||
- Enables visual content in CLI workflows
|
||||
|
||||
### Ghostty Terminal
|
||||
|
||||
Modern GPU-accelerated terminal emulator.
|
||||
|
||||
Key features:
|
||||
- Kitty graphics protocol support
|
||||
- Cross-platform (macOS, Linux)
|
||||
- High performance rendering
|
||||
|
||||
---
|
||||
|
||||
## Salesforce Resources
|
||||
|
||||
### Salesforce Lightning Design System (SLDS)
|
||||
|
||||
- Design patterns for LWC mockups
|
||||
- Color palettes and typography
|
||||
- Component specifications
|
||||
|
||||
### Salesforce Developers Platform
|
||||
|
||||
- API documentation
|
||||
- Best practices guides
|
||||
- Platform architecture references
|
||||
@ -1,83 +0,0 @@
|
||||
# external-diagram-visual-generate
|
||||
|
||||
AI-powered visual content generation for Salesforce development. Generate ERD diagrams, LWC mockups, and architecture visuals using Gemini 3 Pro Image (Nano Banana Pro).
|
||||
|
||||
## Features
|
||||
|
||||
- **Visual ERD Generation**: Create actual rendered ERD diagrams (not just Mermaid code)
|
||||
- **LWC/UI Mockups**: Generate wireframes and component mockups following SLDS
|
||||
- **Gemini Code Review**: Parallel code review while Claude continues working
|
||||
- **Documentation Research**: Parallel Salesforce documentation research via Gemini
|
||||
|
||||
## Prerequisites
|
||||
|
||||
**IMPORTANT**: Run the prerequisites check before using this skill:
|
||||
|
||||
```bash
|
||||
scripts/check-prerequisites.sh
|
||||
```
|
||||
|
||||
| Requirement | Description | How to Install |
|
||||
|-------------|-------------|----------------|
|
||||
| **Ghostty Terminal** | Required for Kitty graphics protocol | Download from the Ghostty website |
|
||||
| **GEMINI_API_KEY** | Personal API key for Nano Banana Pro | Generate via Google AI Studio |
|
||||
| **Gemini CLI** | Command-line interface for Gemini | `npm install -g @google/gemini-cli` |
|
||||
| **Nano Banana Extension** | Image generation extension | `gemini extensions install nanobanana` |
|
||||
| **timg** | Terminal image viewer with Kitty support | `brew install timg` |
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Set up your API key
|
||||
|
||||
Add to `~/.zshrc`:
|
||||
```bash
|
||||
export GEMINI_API_KEY="your-personal-api-key"
|
||||
export NANOBANANA_MODEL=gemini-3-pro-image-preview
|
||||
```
|
||||
|
||||
### 2. Invoke the skill
|
||||
|
||||
```
|
||||
Skill: external-diagram-visual-generate
|
||||
Request: "Generate an ERD diagram showing Account, Contact, and Opportunity relationships"
|
||||
```
|
||||
|
||||
### 3. View the result
|
||||
|
||||
Images are displayed inline using Kitty graphics protocol (Ghostty) or via Claude's multimodal vision using the Read tool.
|
||||
|
||||
## Use Cases
|
||||
|
||||
| Use Case | Example Request |
|
||||
|----------|-----------------|
|
||||
| ERD Diagrams | "Generate a visual ERD for Account, Contact, Opportunity" |
|
||||
| LWC Mockups | "Create a mockup for an Account list datatable component" |
|
||||
| Code Review | "Get Gemini's review of this Apex trigger" |
|
||||
| Doc Research | "Research the Flow best practices in Salesforce docs" |
|
||||
|
||||
## Cross-Skill Integration
|
||||
|
||||
| Related Skill | When to Use |
|
||||
|---------------|-------------|
|
||||
| external-diagram-mermaid-generate | Convert Mermaid to visual rendering |
|
||||
| platform-custom-object-generate | Query object/field data before generating ERDs |
|
||||
| experience-lwc-generate | Generate mockups for LWC components |
|
||||
| platform-apex-generate | Review Apex code via Gemini sub-agent |
|
||||
|
||||
## Documentation
|
||||
|
||||
- [Gemini CLI Setup](references/gemini-cli-setup.md)
|
||||
|
||||
## Security Notes
|
||||
|
||||
**NEVER commit your GEMINI_API_KEY to version control**
|
||||
|
||||
- Store API key in `~/.zshrc` only (not in project files)
|
||||
- The key is personal and tied to your Google account billing
|
||||
|
||||
## Requirements
|
||||
|
||||
- Ghostty terminal (for Kitty graphics)
|
||||
- Gemini CLI with Nano Banana extension
|
||||
- GEMINI_API_KEY environment variable
|
||||
- timg (for terminal image display)
|
||||
@ -1,207 +0,0 @@
|
||||
---
|
||||
name: external-diagram-visual-generate
|
||||
description: "AI-powered image generation for Salesforce visuals via Nano Banana Pro. Use this skill when the user needs rendered PNG/SVG output such as visual ERDs (Entity Relationship Diagrams), UI mockups, wireframes, or architecture illustrations. TRIGGER when: user asks for PNG/SVG output, UI mockups, wireframes, visual ERDs, or says \"generate image\" / \"create mockup\". DO NOT TRIGGER when: text-based Mermaid diagrams (use external-diagram-mermaid-generate), or non-visual documentation tasks."
|
||||
metadata:
|
||||
version: "1.0"
|
||||
---
|
||||
|
||||
# external-diagram-visual-generate: Salesforce Visual AI Skill
|
||||
|
||||
Use this skill when the user needs **rendered visuals**, not text diagrams: ERDs, UI mockups, architecture illustrations, slide-ready images, or image edits using Nano Banana Pro.
|
||||
|
||||
## Scope
|
||||
|
||||
**In scope:**
|
||||
- PNG / SVG-style rendered image output
|
||||
- Visual ERDs and architecture diagrams
|
||||
- LWC or Experience Cloud mockups / wireframes
|
||||
- Image edits on previously generated visuals
|
||||
|
||||
**Out of scope — delegate instead:**
|
||||
- Mermaid or text-only diagrams → [external-diagram-mermaid-generate](../external-diagram-mermaid-generate/SKILL.md)
|
||||
- Object / field metadata discovery for ERDs → [platform-custom-object-generate](../platform-custom-object-generate/SKILL.md) or [platform-custom-field-generate](../platform-custom-field-generate/SKILL.md)
|
||||
- LWC implementation after the mockup is approved → [experience-lwc-generate](../experience-lwc-generate/SKILL.md)
|
||||
- Apex review / implementation → [platform-apex-generate](../platform-apex-generate/SKILL.md)
|
||||
|
||||
---
|
||||
|
||||
## Hard Gate: Prerequisites First
|
||||
|
||||
Run the prerequisites check before using the skill:
|
||||
|
||||
```bash
|
||||
scripts/check-prerequisites.sh
|
||||
```
|
||||
|
||||
If prerequisites fail, stop and route the user to setup guidance in:
|
||||
- [references/gemini-cli-setup.md](references/gemini-cli-setup.md)
|
||||
|
||||
---
|
||||
|
||||
## Required Inputs
|
||||
|
||||
Ask for or infer before generating:
|
||||
|
||||
| Input | Default if not provided |
|
||||
|---|---|
|
||||
| Image type | ERD |
|
||||
| Subject scope and key entities / systems | Ask the user |
|
||||
| Target quality | Draft (1K) |
|
||||
| Preferred style | architect.salesforce.com aesthetic |
|
||||
| Aspect ratio | Default (no override) |
|
||||
| Quick mode or interview mode | Interview mode |
|
||||
|
||||
---
|
||||
|
||||
## Interview-First Workflow
|
||||
|
||||
Unless the user asks for **quick / simple / just generate**, ask clarifying questions first using the question bank in [references/interview-questions.md](references/interview-questions.md).
|
||||
|
||||
| Request type | Ask about |
|
||||
|---|---|
|
||||
| ERD / schema | objects, visual style, purpose, extras |
|
||||
| UI mockup | component type, object/context, device/layout, style |
|
||||
| architecture image | systems, boundaries, protocols, emphasis |
|
||||
| image edit | what to keep, what to change, output quality |
|
||||
|
||||
**Quick mode defaults** (triggered by "quick", "simple", "just generate", "fast"):
|
||||
- professional style, 1K draft, legend included, one image first then iterate
|
||||
|
||||
---
|
||||
|
||||
## Recommended Workflow
|
||||
|
||||
### 1. Run prerequisites check
|
||||
Run `scripts/check-prerequisites.sh` and confirm all required tools pass before proceeding.
|
||||
|
||||
### 2. Gather inputs
|
||||
- object list / metadata (delegate to `platform-custom-object-generate` / `platform-custom-field-generate` if needed)
|
||||
- purpose: draft vs presentation vs documentation
|
||||
- desired aesthetic — read [references/architect-aesthetic-guide.md](references/architect-aesthetic-guide.md) for ERDs
|
||||
- aspect ratio / resolution
|
||||
|
||||
### 3. Run interview or use quick-mode defaults
|
||||
Load [references/interview-questions.md](references/interview-questions.md) for the matching question set (ERD, LWC, architecture, code review).
|
||||
|
||||
### 4. Build a concrete prompt
|
||||
Good prompts specify subject, composition, color treatment, labels/legends, and output quality goal.
|
||||
|
||||
### 5. Generate a fast draft at 1K
|
||||
```bash
|
||||
gemini --yolo "/generate 'Your prompt here'"
|
||||
```
|
||||
Open the result and review layout before spending on higher resolution.
|
||||
|
||||
### 6. Iterate using edits
|
||||
```bash
|
||||
gemini --yolo "/edit 'Specific change instruction'"
|
||||
```
|
||||
Use `/edit` for small adjustments — cheaper than regenerating. See [references/iteration-workflow.md](references/iteration-workflow.md).
|
||||
|
||||
### 7. Generate final at 2K/4K using the Python script
|
||||
Run `scripts/generate_image.py` when layout is confirmed:
|
||||
```bash
|
||||
uv run scripts/generate_image.py -p "Refined prompt" -f "output.png" -r 4K
|
||||
```
|
||||
|
||||
### 8. Error recovery
|
||||
- If `gemini --yolo` returns no image: re-run once; if it fails again, fall back to the Python script path.
|
||||
- If the Python script fails with `GEMINI_API_KEY not found`: verify the key is exported in your shell profile (`~/.zshrc` on macOS/zsh, `~/.bashrc` on Linux) and the terminal session is refreshed.
|
||||
- If the extension is missing: run `gemini extensions install nanobanana` and re-run the prerequisites check.
|
||||
|
||||
---
|
||||
|
||||
## Default Style Guidance
|
||||
|
||||
For ERDs, default to the **architect.salesforce.com** aesthetic unless the user asks otherwise:
|
||||
- dark border + light fill cards
|
||||
- cloud-specific accent colors
|
||||
- clean labels and relationship lines
|
||||
- presentation-ready whitespace and hierarchy
|
||||
|
||||
Full style specification: [references/architect-aesthetic-guide.md](references/architect-aesthetic-guide.md)
|
||||
|
||||
---
|
||||
|
||||
## Common Patterns
|
||||
|
||||
| Pattern | Default approach |
|
||||
|---|---|
|
||||
| visual ERD | get metadata if available, then render a draft first |
|
||||
| LWC mockup | load [assets/lwc/data-table.md](assets/lwc/data-table.md), [assets/lwc/record-form.md](assets/lwc/record-form.md), or [assets/lwc/dashboard-card.md](assets/lwc/dashboard-card.md) for the matching template |
|
||||
| architecture illustration | load [assets/architecture/integration-flow.md](assets/architecture/integration-flow.md); emphasize systems and flows |
|
||||
| image refinement | use `/edit` for small changes before regenerating |
|
||||
| final production asset | switch to script-driven 2K/4K generation via `scripts/generate_image.py` |
|
||||
| Apex / LWC code review | load [assets/review/apex-review.md](assets/review/apex-review.md) or [assets/review/lwc-review.md](assets/review/lwc-review.md) for the review prompt template |
|
||||
|
||||
---
|
||||
|
||||
## Output Expectations
|
||||
|
||||
Deliverables produced by this skill:
|
||||
|
||||
- **Draft image** (`<name>.png`) — 1K resolution rendered via `gemini --yolo "/generate ..."` for layout review
|
||||
- **Final image** (`<name>.png`) — 2K or 4K resolution rendered via `scripts/generate_image.py` once composition is approved
|
||||
- **Edit iteration** (`<name>.png`) — incremental refinement via `gemini --yolo "/edit ..."` without full regeneration
|
||||
|
||||
After delivering each image:
|
||||
- Open the file in Preview or attach it in the session for multimodal review
|
||||
- Ask the user whether to iterate on layout, labeling, or color before finalizing
|
||||
- Only proceed to high-res output after draft composition is confirmed
|
||||
|
||||
---
|
||||
|
||||
## Rules / Constraints
|
||||
|
||||
| Rule | Rationale |
|
||||
|---|---|
|
||||
| Always run prerequisites check before any generation | Missing tools produce silent failures |
|
||||
| Always draft at 1K before generating at 4K | Cost and time savings; composition changes at high res are wasteful |
|
||||
| Use `/edit` for incremental changes, not full regeneration | Cheaper and faster for small adjustments |
|
||||
| Never commit `GEMINI_API_KEY` to version control | Key is personal and tied to billing |
|
||||
| Delegate text diagrams to `external-diagram-mermaid-generate` | This skill owns rendered images only |
|
||||
|
||||
---
|
||||
|
||||
## Gotchas
|
||||
|
||||
| Issue | Resolution |
|
||||
|---|---|
|
||||
| Edit not applying correctly | Be specific: reference existing elements by name; one change at a time |
|
||||
| 4K output looks different from 1K draft | Use exact same prompt text; minor variations are normal model behavior |
|
||||
| `gemini --yolo` fails silently | Check that the Nano Banana extension is installed: `gemini extensions list` |
|
||||
| Image dimensions wrong | Set `--aspect-ratio` explicitly in `scripts/generate_image.py` using `-a "16:9"` |
|
||||
| RGBA image causes errors in Python script | Script auto-converts RGBA→RGB; ensure Pillow is installed via `uv` |
|
||||
|
||||
---
|
||||
|
||||
## Cross-Skill Integration
|
||||
|
||||
| Need | Delegate to | Reason |
|
||||
|---|---|---|
|
||||
| Mermaid first draft or text diagram | [external-diagram-mermaid-generate](../external-diagram-mermaid-generate/SKILL.md) | faster structural diagramming |
|
||||
| Object / field discovery for ERD | [platform-custom-object-generate](../platform-custom-object-generate/SKILL.md) / [platform-custom-field-generate](../platform-custom-field-generate/SKILL.md) | accurate schema grounding |
|
||||
| Turn mockup into real LWC component | [experience-lwc-generate](../experience-lwc-generate/SKILL.md) | implementation after design |
|
||||
| Apex review / implementation | [platform-apex-generate](../platform-apex-generate/SKILL.md) | code-quality follow-up |
|
||||
|
||||
---
|
||||
|
||||
## Reference File Index
|
||||
|
||||
| File | When to read |
|
||||
|---|---|
|
||||
| [references/gemini-cli-setup.md](references/gemini-cli-setup.md) | Prerequisites fail — Gemini CLI / Nano Banana setup guidance |
|
||||
| [references/interview-questions.md](references/interview-questions.md) | Step 3 — load question set matching the request type |
|
||||
| [references/iteration-workflow.md](references/iteration-workflow.md) | Step 6 — draft-to-final iteration patterns and cost tips |
|
||||
| [references/architect-aesthetic-guide.md](references/architect-aesthetic-guide.md) | Step 4 — ERD color palettes, box styles, prompt templates |
|
||||
| [references/examples-index.md](references/examples-index.md) | Step 4 — example prompts for ERD, LWC, architecture, code review |
|
||||
| [assets/erd/core-objects.md](assets/erd/core-objects.md) | Step 4 — prompt template for core CRM objects (Account, Contact, Opportunity, Case) |
|
||||
| [assets/erd/custom-objects.md](assets/erd/custom-objects.md) | Step 4 — prompt template for custom object ERDs |
|
||||
| [assets/lwc/data-table.md](assets/lwc/data-table.md) | Step 4 — prompt template for lightning-datatable mockups |
|
||||
| [assets/lwc/record-form.md](assets/lwc/record-form.md) | Step 4 — prompt template for lightning-record-form mockups |
|
||||
| [assets/lwc/dashboard-card.md](assets/lwc/dashboard-card.md) | Step 4 — prompt template for dashboard card / metric tile mockups |
|
||||
| [assets/architecture/integration-flow.md](assets/architecture/integration-flow.md) | Step 4 — prompt template for integration architecture diagrams |
|
||||
| [assets/review/apex-review.md](assets/review/apex-review.md) | Step 4 — Gemini review prompt template for Apex code |
|
||||
| [assets/review/lwc-review.md](assets/review/lwc-review.md) | Step 4 — Gemini review prompt template for LWC components |
|
||||
| [scripts/check-prerequisites.sh](scripts/check-prerequisites.sh) | Step 1 — run to verify all required tools are installed |
|
||||
| [scripts/generate_image.py](scripts/generate_image.py) | Step 7 — run for 2K/4K resolution output and image editing with resolution control |
|
||||
@ -1,55 +0,0 @@
|
||||
# Architecture Template: Integration Flow
|
||||
|
||||
## Prompt Template
|
||||
|
||||
```
|
||||
Professional Salesforce integration architecture diagram:
|
||||
|
||||
SYSTEMS:
|
||||
[List systems with types and icons]
|
||||
|
||||
INTEGRATION PATTERNS:
|
||||
[List integrations with protocols and directions]
|
||||
|
||||
COMPONENTS:
|
||||
- API Gateway (if applicable)
|
||||
- Authentication layer
|
||||
- Middleware/ESB (if applicable)
|
||||
- Error handling/retry logic
|
||||
|
||||
STYLING:
|
||||
- Cloud icon for Salesforce
|
||||
- Server icons for external systems
|
||||
- Arrows with protocol labels
|
||||
- Color coding by system type
|
||||
- Professional diagram style
|
||||
|
||||
FORMAT:
|
||||
- Landscape orientation
|
||||
- Left-to-right or hub-spoke layout
|
||||
- Include legend
|
||||
```
|
||||
|
||||
## Example
|
||||
|
||||
```bash
|
||||
gemini "/generate 'Salesforce integration architecture diagram:
|
||||
|
||||
Systems:
|
||||
1. Salesforce (cloud icon, blue)
|
||||
2. MuleSoft (middleware icon, purple)
|
||||
3. SAP ERP (server icon, orange)
|
||||
|
||||
Flows:
|
||||
1. Salesforce --REST--> MuleSoft --BAPI--> SAP
|
||||
- Account/Contact sync (bidirectional)
|
||||
|
||||
2. SAP --Events--> MuleSoft --Platform Events--> Salesforce
|
||||
- Invoice updates
|
||||
|
||||
Include:
|
||||
- OAuth 2.0 authentication badges
|
||||
- Error queue for failed messages
|
||||
|
||||
Style: Professional, clean lines, pastel colors'"
|
||||
```
|
||||
@ -1,131 +0,0 @@
|
||||
# ERD Template: Core Salesforce Objects (Architect.salesforce.com Style)
|
||||
|
||||
## Default Style
|
||||
|
||||
All ERDs now use the **official architect.salesforce.com aesthetic** by default:
|
||||
- Dark border + light translucent fill boxes
|
||||
- Header banner with Salesforce logo
|
||||
- LEGEND bar with ENTITIES and RELATIONSHIPS
|
||||
- Labeled relationship lines
|
||||
- Footer with copyright
|
||||
|
||||
See `references/architect-aesthetic-guide.md` for full specification.
|
||||
|
||||
---
|
||||
|
||||
## Prompt Template (Architect.salesforce.com Style)
|
||||
|
||||
```
|
||||
Create a Salesforce Core CRM ERD in the EXACT architect.salesforce.com style:
|
||||
|
||||
PAGE TITLE (very top, large bold text):
|
||||
'Core CRM Overview Data Model'
|
||||
|
||||
HEADER SECTION (below title):
|
||||
- Left: Salesforce cloud logo + 'SALESFORCE PLATFORM Overview' in dark teal (#0B827C) banner box
|
||||
- Center: LEGEND with 'ENTITIES' section showing:
|
||||
* Cloud Entity box (dark teal #0B827C border, light teal ~25% opacity fill)
|
||||
* Related Entity box (dark teal border, lighter fill)
|
||||
* External Entity box (black border, white fill)
|
||||
- Right: 'RELATIONSHIPS' section showing notation symbols for Parent/Child, Required, Optional, Many-to-Many
|
||||
|
||||
BOX STYLING - CRITICAL:
|
||||
- DARK BORDER: Solid 2px border in dark teal (#0B827C)
|
||||
- LIGHT TRANSLUCENT FILL: Same teal hue at ~25% opacity
|
||||
- Rounded corners (8-12px radius)
|
||||
- Text in dark gray/black on the light fill
|
||||
|
||||
ENTITY BOX FORMAT:
|
||||
┌─────────────────────────┐
|
||||
│ Logical Name │ (Bold, larger)
|
||||
│ APIName │ (Smaller, italic, gray)
|
||||
│ • Field1 │ (Bullet points)
|
||||
│ • Field2 │
|
||||
└─────────────────────────┘
|
||||
|
||||
OBJECTS TO INCLUDE (all with dark teal border + light teal fill):
|
||||
|
||||
- Account (center position):
|
||||
Account
|
||||
Account
|
||||
• Account Number
|
||||
• Name
|
||||
• Industry
|
||||
• Type
|
||||
|
||||
- Contact (linked to Account):
|
||||
Contact
|
||||
Contact
|
||||
• Name
|
||||
• Email
|
||||
• Title
|
||||
• Phone
|
||||
|
||||
- Opportunity (linked to Account):
|
||||
Opportunity
|
||||
Opportunity
|
||||
• Name
|
||||
• Amount
|
||||
• Close Date
|
||||
• StageName
|
||||
|
||||
- Case (linked to Account and Contact):
|
||||
Case
|
||||
Case
|
||||
• CaseNumber
|
||||
• Type
|
||||
• Priority
|
||||
• Status
|
||||
|
||||
RELATIONSHIP LINES:
|
||||
- Thin black lines with text labels ON the lines
|
||||
- Contact → Account: "child of" (crow's foot on Contact side)
|
||||
- Opportunity → Account: "child of" (crow's foot on Opportunity side)
|
||||
- Case → Account: "related to" (crow's foot on Case side)
|
||||
- Case → Contact: "related to" (optional)
|
||||
- STRAIGHT LINES ONLY (horizontal and vertical, no diagonals)
|
||||
|
||||
FOOTER:
|
||||
Left: '©2024 Salesforce - Subject to change without notice'
|
||||
Right: 'Last modified: [current date]'
|
||||
|
||||
CRITICAL: Dark teal borders with LIGHT translucent teal fill - NOT solid filled boxes.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
# Quick draft at 1K (iterate here)
|
||||
gemini --yolo "/generate '[paste prompt above]'"
|
||||
open ~/nanobanana-output/*.png # Review and refine
|
||||
|
||||
# Final at 4K (when satisfied)
|
||||
uv run scripts/generate_image.py \
|
||||
-p "[your refined prompt]" \
|
||||
-f "core-crm-erd.png" \
|
||||
-r 4K
|
||||
open ~/nanobanana-output/*core-crm*.png
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Cloud Color Reference
|
||||
|
||||
| Cloud | Border Color | Fill (~25% opacity) |
|
||||
|-------|--------------|---------------------|
|
||||
| Sales Cloud | `#0B827C` (Teal) | Light Teal |
|
||||
| Service Cloud | `#9E2A7D` (Magenta) | Light Pink |
|
||||
| Platform | `#5A67D8` (Purple) | Light Purple |
|
||||
|
||||
---
|
||||
|
||||
## Resolution Guide
|
||||
|
||||
| Phase | Resolution | Use Case |
|
||||
|-------|------------|----------|
|
||||
| Draft | 1K (CLI) | Quick iteration, prompt refinement |
|
||||
| Final | 4K (Python) | Documentation, presentations |
|
||||
|
||||
**Tip**: Iterate at 1K until layout is correct, then generate 4K final.
|
||||
@ -1,60 +0,0 @@
|
||||
# ERD Template: Custom Objects
|
||||
|
||||
## Prompt Template
|
||||
|
||||
```
|
||||
Professional Salesforce ERD diagram showing custom objects:
|
||||
|
||||
OBJECTS:
|
||||
[List custom objects with relationships]
|
||||
|
||||
COLOR CODING:
|
||||
- Standard Objects: Blue (#bae6fd fill, #0369a1 border)
|
||||
- Custom Objects: Orange (#fed7aa fill, #c2410c border)
|
||||
- External Objects: Green (#a7f3d0 fill, #047857 border)
|
||||
|
||||
RELATIONSHIPS:
|
||||
- Lookup (LK): Dashed arrow, optional parent
|
||||
- Master-Detail (MD): Solid thick arrow, cascade delete
|
||||
|
||||
STYLING:
|
||||
- Clean white background
|
||||
- Pastel fill colors with dark borders
|
||||
- Relationship labels on arrows
|
||||
- Professional diagram layout
|
||||
- Include color legend
|
||||
|
||||
FORMAT:
|
||||
- Auto-layout based on relationships
|
||||
- Primary objects centered
|
||||
- Child objects positioned below/right of parents
|
||||
```
|
||||
|
||||
## Example
|
||||
|
||||
```bash
|
||||
# Draft at 1K (iterate here)
|
||||
gemini --yolo "/generate 'Salesforce ERD for real estate app:
|
||||
- Property__c (orange, center): Main custom object
|
||||
- Listing__c (orange, right): Master-Detail to Property__c
|
||||
- Showing__c (orange, below): Lookup to both Property__c and Contact
|
||||
|
||||
Orange boxes for custom objects, blue for standard (Contact).
|
||||
Include legend. Professional style.'"
|
||||
open ~/nanobanana-output/*.png # Review and refine
|
||||
|
||||
# Final at 4K (when satisfied)
|
||||
uv run scripts/generate_image.py \
|
||||
-p "Salesforce ERD for real estate app..." \
|
||||
-f "realestate-erd.png" \
|
||||
-r 4K
|
||||
```
|
||||
|
||||
## Resolution Guide
|
||||
|
||||
| Phase | Resolution | Use Case |
|
||||
|-------|------------|----------|
|
||||
| Draft | 1K (CLI) | Quick iteration, prompt refinement |
|
||||
| Final | 4K (Python) | Documentation, presentations |
|
||||
|
||||
**Tip**: Iterate at 1K until layout is correct, then generate 4K final.
|
||||
@ -1,45 +0,0 @@
|
||||
# LWC Template: Dashboard Card Mockup
|
||||
|
||||
## Prompt Template
|
||||
|
||||
```
|
||||
Salesforce Lightning dashboard card/tile mockup:
|
||||
|
||||
CARD TYPE: [metric/chart/list/progress]
|
||||
|
||||
METRIC CARD:
|
||||
- Large metric value
|
||||
- Label below
|
||||
- Trend indicator: up/down arrow with percentage
|
||||
- Sparkline mini chart (optional)
|
||||
- Icon in corner
|
||||
|
||||
CHART CARD:
|
||||
- Chart type: [bar/line/pie/donut]
|
||||
- Legend position
|
||||
- Data labels on hover
|
||||
|
||||
LIST CARD:
|
||||
- Title with "View All" link
|
||||
- 3-5 list items
|
||||
- Each item: icon, primary text, secondary text
|
||||
|
||||
STYLING:
|
||||
- SLDS card component
|
||||
- White background with subtle shadow
|
||||
- Rounded corners
|
||||
- Header with title and action menu
|
||||
```
|
||||
|
||||
## Example: Metric Card
|
||||
|
||||
```bash
|
||||
gemini "/generate 'Salesforce dashboard metric card:
|
||||
- Large number: $1.2M
|
||||
- Label: Total Pipeline Value
|
||||
- Trend: +12% (green up arrow)
|
||||
- Icon: Opportunity icon (top-right)
|
||||
- Sparkline: Show 7-day trend mini chart
|
||||
|
||||
Style: SLDS card, white background, subtle shadow'"
|
||||
```
|
||||
@ -1,57 +0,0 @@
|
||||
# LWC Template: Data Table Mockup
|
||||
|
||||
## Prompt Template
|
||||
|
||||
```
|
||||
Salesforce Lightning Web Component data table mockup:
|
||||
|
||||
COMPONENT: lightning-datatable style
|
||||
|
||||
HEADER:
|
||||
- Component title: "[Title]"
|
||||
- Search box (right-aligned)
|
||||
- Action buttons: New, Refresh, Export
|
||||
|
||||
COLUMNS:
|
||||
[List columns with types]
|
||||
|
||||
SAMPLE DATA:
|
||||
- Show 5-7 sample rows with realistic data
|
||||
- Include row selection checkboxes
|
||||
- Show sorting arrows on sortable columns
|
||||
|
||||
STYLING:
|
||||
- SLDS (Salesforce Lightning Design System)
|
||||
- Zebra striping on rows
|
||||
- Hover highlight
|
||||
- Blue header bar
|
||||
- White background
|
||||
|
||||
ACTIONS:
|
||||
- Row-level action menu (three dots)
|
||||
- Bulk action buttons when rows selected
|
||||
|
||||
FORMAT:
|
||||
- Desktop view (1200px width)
|
||||
- Full component with card wrapper
|
||||
- Include pagination footer
|
||||
```
|
||||
|
||||
## Example
|
||||
|
||||
```bash
|
||||
gemini "/generate 'Salesforce LWC data table mockup:
|
||||
Title: Recent Opportunities
|
||||
Columns:
|
||||
1. Opportunity Name (link)
|
||||
2. Account Name (text)
|
||||
3. Amount (currency, right-aligned)
|
||||
4. Stage (picklist badge)
|
||||
5. Close Date (date)
|
||||
6. Owner (user with avatar)
|
||||
|
||||
Sample data: Show 5 realistic opportunities
|
||||
Include: Search, New button, row actions menu
|
||||
Style: SLDS, professional, clean
|
||||
Pagination: 1-5 of 127'"
|
||||
```
|
||||
@ -1,60 +0,0 @@
|
||||
# LWC Template: Record Form Mockup
|
||||
|
||||
## Prompt Template
|
||||
|
||||
```
|
||||
Salesforce Lightning Web Component record form mockup:
|
||||
|
||||
COMPONENT: lightning-record-form style
|
||||
|
||||
HEADER:
|
||||
- Object icon and label
|
||||
- Edit/Save/Cancel buttons (right)
|
||||
- Record name as title
|
||||
|
||||
LAYOUT:
|
||||
- Two-column layout for desktop
|
||||
- Responsive single column for mobile
|
||||
|
||||
SECTIONS:
|
||||
[Define sections with fields]
|
||||
|
||||
FIELD TYPES:
|
||||
- Text inputs with labels above
|
||||
- Picklists as dropdown
|
||||
- Lookups with search icon
|
||||
- Date pickers with calendar
|
||||
- Currency with formatting
|
||||
- Checkboxes for boolean
|
||||
|
||||
STYLING:
|
||||
- SLDS record page styling
|
||||
- Compact spacing
|
||||
- Blue section headers
|
||||
- Required field indicators (*)
|
||||
- Help text icons where applicable
|
||||
```
|
||||
|
||||
## Example
|
||||
|
||||
```bash
|
||||
gemini "/generate 'Salesforce LWC record form mockup:
|
||||
Object: Opportunity
|
||||
Mode: Edit
|
||||
|
||||
Sections:
|
||||
1. Opportunity Information:
|
||||
- Opportunity Name* (text)
|
||||
- Account Name* (lookup with search)
|
||||
- Type (picklist)
|
||||
- Lead Source (picklist)
|
||||
|
||||
2. Amount & Dates:
|
||||
- Amount (currency)
|
||||
- Close Date* (date picker)
|
||||
- Stage* (picklist)
|
||||
- Probability (percentage)
|
||||
|
||||
Footer: Save and Cancel buttons
|
||||
Style: SLDS, professional, desktop view'"
|
||||
```
|
||||
@ -1,57 +0,0 @@
|
||||
# Apex Code Review Template
|
||||
|
||||
## Gemini Review Prompt
|
||||
|
||||
```
|
||||
Review this Apex code for best practices and issues:
|
||||
|
||||
CODE:
|
||||
[paste code here]
|
||||
|
||||
REVIEW CATEGORIES:
|
||||
|
||||
1. BULKIFICATION
|
||||
- SOQL queries in loops
|
||||
- DML operations in loops
|
||||
- Governor limit risks
|
||||
- Collection usage
|
||||
|
||||
2. SECURITY
|
||||
- CRUD permissions check
|
||||
- FLS enforcement
|
||||
- Sharing model compliance
|
||||
- Injection vulnerabilities
|
||||
|
||||
3. BEST PRACTICES
|
||||
- Trigger handler pattern
|
||||
- One trigger per object
|
||||
- Separation of concerns
|
||||
- Proper exception handling
|
||||
|
||||
4. PERFORMANCE
|
||||
- Selective SOQL queries
|
||||
- Index usage
|
||||
- Unnecessary computation
|
||||
|
||||
5. MAINTAINABILITY
|
||||
- Code comments
|
||||
- Method length
|
||||
- Test coverage considerations
|
||||
|
||||
OUTPUT FORMAT:
|
||||
JSON with summary, issues array, bestPractices array, and score
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
gemini "Review this Apex trigger for issues: [paste code]" -o json
|
||||
```
|
||||
|
||||
## Severity Guidelines
|
||||
|
||||
| Severity | Criteria |
|
||||
|----------|----------|
|
||||
| High | Security, governor limits, data integrity |
|
||||
| Medium | Performance, best practices |
|
||||
| Low | Style, minor improvements |
|
||||
@ -1,48 +0,0 @@
|
||||
# LWC Code Review Template
|
||||
|
||||
## Gemini Review Prompt
|
||||
|
||||
```
|
||||
Review this Lightning Web Component for best practices:
|
||||
|
||||
JAVASCRIPT:
|
||||
[paste JS code]
|
||||
|
||||
HTML TEMPLATE:
|
||||
[paste HTML code]
|
||||
|
||||
REVIEW CATEGORIES:
|
||||
|
||||
1. ACCESSIBILITY (A11Y)
|
||||
- ARIA labels and roles
|
||||
- Keyboard navigation
|
||||
- Screen reader compatibility
|
||||
|
||||
2. PERFORMANCE
|
||||
- Wire service usage
|
||||
- Rendering optimization
|
||||
- Event handling
|
||||
|
||||
3. SECURITY
|
||||
- Locker Service compliance
|
||||
- XSS prevention
|
||||
|
||||
4. BEST PRACTICES
|
||||
- Component lifecycle
|
||||
- Error handling
|
||||
- Data binding
|
||||
|
||||
5. SALESFORCE PATTERNS
|
||||
- Lightning Data Service
|
||||
- Navigation service
|
||||
- Toast notifications
|
||||
|
||||
OUTPUT FORMAT:
|
||||
JSON with summary, issues array, accessibility score, and overall score
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
gemini "Review this LWC component: [paste code]" -o json
|
||||
```
|
||||
@ -1,257 +0,0 @@
|
||||
<!-- Parent: external-diagram-visual-generate/SKILL.md -->
|
||||
# Official Salesforce Architect ERD Aesthetic Guide
|
||||
|
||||
Reference for generating ERDs matching the **architect.salesforce.com** visual style.
|
||||
This is the default style for all ERD diagrams generated by external-diagram-visual-generate.
|
||||
|
||||
---
|
||||
|
||||
## Cloud-Specific Color Palettes
|
||||
|
||||
Each Salesforce cloud has its own brand color. The skill auto-detects which cloud to use based on the objects requested.
|
||||
|
||||
| Cloud | Border Color | Fill (~25% opacity) | Detect By Objects |
|
||||
|-------|--------------|---------------------|-------------------|
|
||||
| **Sales Cloud** | `#0B827C` (Teal) | Light Teal | Lead, Opportunity, Quote, Campaign, Order |
|
||||
| **Service Cloud** | `#9E2A7D` (Magenta) | Light Pink | Case, Knowledge, Entitlement, Swarm, Incident |
|
||||
| **Platform** | `#5A67D8` (Purple) | Light Purple | Account, Contact only (no cloud-specific objects) |
|
||||
| **Industries/Scheduler** | `#BA4383` (Pink) | Light Pink | ServiceTerritory, WorkType, Shift, ServiceResource |
|
||||
| **Nonprofit Cloud** | `#032D60` (Navy) | Light Gray | Survey, Donation, Program objects |
|
||||
|
||||
---
|
||||
|
||||
## The Signature Box Style: "Dark Border + Light Fill"
|
||||
|
||||
This is the defining visual pattern of architect.salesforce.com diagrams:
|
||||
|
||||
| Property | Value |
|
||||
|----------|-------|
|
||||
| **Border** | Solid 2px in cloud's brand color |
|
||||
| **Fill** | Same hue at ~25% opacity (translucent) |
|
||||
| **Corners** | Rounded (8-12px radius) |
|
||||
| **Text** | Dark gray/black on light fill |
|
||||
|
||||
### Visual Example
|
||||
|
||||
```
|
||||
┌─────────────────────────┐
|
||||
│ ░░░░░░░░░░░░░░░░░░░░░░░ │ ← Light translucent fill
|
||||
│ ░ Opportunity ░ │ ← Bold logical name
|
||||
│ ░ Opportunity ░ │ ← Smaller italic API name
|
||||
│ ░ • Name ░ │ ← Key fields with bullets
|
||||
│ ░ • Amount ░ │
|
||||
│ ░ • Close Date ░ │
|
||||
└─────────────────────────┘
|
||||
↑ Dark solid border
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Page Structure
|
||||
|
||||
### 1. Page Title (Top)
|
||||
|
||||
Large bold text centered at the very top:
|
||||
- Format: `"[Cloud Name] Overview Data Model"`
|
||||
- Example: `"Sales Cloud Overview Data Model"`
|
||||
|
||||
### 2. Header Banner
|
||||
|
||||
Below the title, a horizontal banner containing:
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────────────────────┐
|
||||
│ [salesforce] SALES CLOUD │ LEGEND: │
|
||||
│ Overview │ ENTITIES │ RELATIONSHIPS │
|
||||
│ │ [boxes...] │ [symbols...] │
|
||||
└──────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**Left Section:**
|
||||
- Salesforce cloud logo
|
||||
- "[CLOUD NAME] Overview" in dark background
|
||||
|
||||
**Center Section - ENTITIES:**
|
||||
- Cloud Entity (dark border + light fill)
|
||||
- Related Entity (dark border + light fill)
|
||||
- External Entity (black border + white fill)
|
||||
|
||||
**Right Section - RELATIONSHIPS:**
|
||||
- Parent to Child (Many-to-One)
|
||||
- Required to Required (One-to-One)
|
||||
- Optional to Optional (Zero-or-One to Zero-or-One)
|
||||
- Many-to-Many
|
||||
|
||||
### 3. Main Diagram Area
|
||||
|
||||
The ERD with objects and relationship lines.
|
||||
|
||||
### 4. Footer
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────────────────────┐
|
||||
│ ©2024 Salesforce - Subject to change without notice Last modified: [DATE]│
|
||||
└──────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Entity Box Format
|
||||
|
||||
Each object box contains:
|
||||
|
||||
```
|
||||
┌─────────────────────────┐
|
||||
│ Opportunity │ ← Bold logical name (larger font)
|
||||
│ Opportunity │ ← API name (smaller, italic, gray)
|
||||
│ • Name │ ← Key field 1 with bullet
|
||||
│ • Amount │ ← Key field 2 with bullet
|
||||
│ • Close Date │ ← Key field 3 with bullet
|
||||
│ • StageName │ ← Key field 4 (optional)
|
||||
└─────────────────────────┘
|
||||
```
|
||||
|
||||
### Recommended Fields by Object
|
||||
|
||||
| Object | Key Fields |
|
||||
|--------|------------|
|
||||
| Account | Account Number, Name, Industry, Type |
|
||||
| Contact | Name, Email, Title, Phone |
|
||||
| Lead | Name, Company, Status, Rating |
|
||||
| Opportunity | Name, Amount, Close Date, StageName |
|
||||
| Campaign | Name, Type, Status, StartDate |
|
||||
| Case | CaseNumber, Type, Priority, Status |
|
||||
| Quote | Name, ExpirationDate, Status |
|
||||
| Order | OrderNumber, EffectiveDate, Status |
|
||||
| Product2 | Name, ProductCode, IsActive |
|
||||
|
||||
---
|
||||
|
||||
## Relationship Line Labels
|
||||
|
||||
**Always include descriptive text labels on relationship lines.**
|
||||
|
||||
| Relationship Type | Label Examples |
|
||||
|-------------------|----------------|
|
||||
| Parent-Child | "child of", "parent of" |
|
||||
| Lookup | "related to" |
|
||||
| Junction | "member of", "participant in" |
|
||||
| Conversion | "converts to", "promoted to" |
|
||||
| Association | "assigned to", "owned by" |
|
||||
|
||||
### Line Styling
|
||||
|
||||
| Property | Value |
|
||||
|----------|-------|
|
||||
| Stroke width | 1-2px |
|
||||
| Color | Black (`#000000`) |
|
||||
| Direction | Straight horizontal or vertical only (NO diagonals) |
|
||||
| Crow's foot | On "many" side of relationship |
|
||||
| Bar | On "one" side (required) |
|
||||
| Circle + Bar | On "one" side (optional) |
|
||||
|
||||
---
|
||||
|
||||
## Master Prompt Template
|
||||
|
||||
Use this template when generating ERDs:
|
||||
|
||||
```
|
||||
Create a Salesforce [CLOUD_NAME] ERD in the EXACT architect.salesforce.com style:
|
||||
|
||||
PAGE TITLE (very top, large bold text):
|
||||
'[Cloud Name] Overview Data Model'
|
||||
|
||||
HEADER SECTION (below title):
|
||||
- Left: Salesforce cloud logo + '[CLOUD_NAME] Overview' in dark [COLOR] (#[HEX]) banner box
|
||||
- Center: LEGEND with 'ENTITIES' section showing:
|
||||
* Cloud Entity box (dark [COLOR] border, light [COLOR] ~25% opacity fill)
|
||||
* Related Entity box (dark border, lighter fill)
|
||||
* External Entity box (black border, white fill)
|
||||
- Right: 'RELATIONSHIPS' section showing notation symbols
|
||||
|
||||
BOX STYLING - CRITICAL:
|
||||
- DARK BORDER: Solid 2px border in dark [COLOR] (#[HEX])
|
||||
- LIGHT TRANSLUCENT FILL: Same [COLOR] hue at ~25% opacity
|
||||
- Rounded corners (8-12px radius)
|
||||
- Text in dark gray/black on the light fill
|
||||
|
||||
ENTITY BOX FORMAT:
|
||||
┌─────────────────────────┐
|
||||
│ Logical Name │ (Bold, larger)
|
||||
│ APIName │ (Smaller, italic, gray)
|
||||
│ • Field1 │ (Bullet points)
|
||||
│ • Field2 │
|
||||
└─────────────────────────┘
|
||||
|
||||
OBJECTS TO INCLUDE:
|
||||
[List objects with their fields]
|
||||
|
||||
RELATIONSHIP LINES:
|
||||
- Thin black lines with text labels ON the lines
|
||||
- 'child of' / 'parent of' / 'related to' labels
|
||||
- Crow's foot on many side, bar on one side
|
||||
- STRAIGHT LINES ONLY (horizontal and vertical)
|
||||
|
||||
FOOTER:
|
||||
Left: '©[YEAR] Salesforce - Subject to change without notice'
|
||||
Right: 'Last modified: [DATE]'
|
||||
|
||||
CRITICAL: Dark [COLOR] borders with LIGHT translucent [COLOR] fill.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Cloud-Specific Templates
|
||||
|
||||
### Sales Cloud
|
||||
|
||||
```
|
||||
COLOR: Teal #0B827C
|
||||
OBJECTS: Lead, Account, Contact, Opportunity, Campaign, CampaignMember,
|
||||
Quote, Order, Product2, PricebookEntry, Territory
|
||||
```
|
||||
|
||||
### Service Cloud
|
||||
|
||||
```
|
||||
COLOR: Magenta #9E2A7D
|
||||
OBJECTS: Case, Knowledge, KnowledgeArticle, Entitlement, Asset,
|
||||
ServiceContract, WorkOrder, Swarm, Incident, Problem
|
||||
```
|
||||
|
||||
### Platform (Generic)
|
||||
|
||||
```
|
||||
COLOR: Purple #5A67D8
|
||||
OBJECTS: Account, Contact, User, Custom Objects
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference Checklist
|
||||
|
||||
```
|
||||
ARCHITECT.SALESFORCE.COM ERD CHECKLIST
|
||||
═══════════════════════════════════════
|
||||
|
||||
☐ Page title at very top ("[Cloud] Overview Data Model")
|
||||
☐ Header banner with Salesforce logo + "[CLOUD] Overview"
|
||||
☐ Legend bar (ENTITIES + RELATIONSHIPS sections)
|
||||
☐ DARK border in cloud's brand color
|
||||
☐ LIGHT translucent fill (~25% opacity)
|
||||
☐ Entity boxes: Name + API Name + bullet fields
|
||||
☐ Labeled relationship lines ("child of", "related to")
|
||||
☐ Crow's foot notation for many-side
|
||||
☐ Straight lines only (no diagonals)
|
||||
☐ Footer with copyright + last modified date
|
||||
☐ Clean white background
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Version History
|
||||
|
||||
| Version | Changes |
|
||||
|---------|---------|
|
||||
| 1.0 | Initial version with Sales Cloud, Service Cloud, Platform styles |
|
||||
@ -1,35 +0,0 @@
|
||||
<!-- Parent: external-diagram-visual-generate/SKILL.md -->
|
||||
# Examples
|
||||
|
||||
Example prompts and outputs for external-diagram-visual-generate.
|
||||
|
||||
## ERD Examples
|
||||
|
||||
```bash
|
||||
# Basic CRM ERD
|
||||
gemini --yolo "/generate 'Salesforce ERD diagram: Account (blue), Contact (green), Opportunity (yellow). Show relationships with arrows. Clean white background.'"
|
||||
|
||||
# Custom Object ERD
|
||||
gemini --yolo "/generate 'ERD diagram for custom objects: Project__c, Task__c, Resource__c. Master-detail and lookup relationships shown.'"
|
||||
```
|
||||
|
||||
## LWC Mockup Examples
|
||||
|
||||
```bash
|
||||
# Data Table Mockup
|
||||
gemini --yolo "/generate 'Lightning datatable mockup showing Account records with columns: Name, Industry, Annual Revenue. Include search bar and pagination.'"
|
||||
|
||||
# Record Form Mockup
|
||||
gemini --yolo "/generate 'Salesforce Lightning record form for Contact object. Show Name, Email, Phone, Account lookup fields.'"
|
||||
```
|
||||
|
||||
## Architecture Examples
|
||||
|
||||
```bash
|
||||
# Integration Flow
|
||||
gemini --yolo "/generate 'Integration architecture diagram: Salesforce to ERP sync via MuleSoft. Show Platform Events, Named Credentials, External Services.'"
|
||||
```
|
||||
|
||||
## Output Location
|
||||
|
||||
Generated images are saved to `~/nanobanana-output/`
|
||||
@ -1,65 +0,0 @@
|
||||
<!-- Parent: external-diagram-visual-generate/SKILL.md -->
|
||||
# Gemini CLI Setup for external-diagram-visual-generate
|
||||
|
||||
## Prerequisites
|
||||
|
||||
### 1. Authenticate with Google
|
||||
|
||||
```bash
|
||||
# Start Gemini CLI - opens browser for OAuth
|
||||
gemini
|
||||
|
||||
# Select "Login with Google" when prompted
|
||||
# Credentials cached at ~/.gemini/oauth_creds.json
|
||||
```
|
||||
|
||||
### 2. Install Nano Banana Extension
|
||||
|
||||
```bash
|
||||
gemini extensions install nanobanana
|
||||
```
|
||||
|
||||
### 3. Install timg for Image Display
|
||||
|
||||
```bash
|
||||
brew install timg
|
||||
```
|
||||
|
||||
### 4. Configure Environment
|
||||
|
||||
Add to `~/.zshrc`:
|
||||
|
||||
```bash
|
||||
export NANOBANANA_MODEL=gemini-3-pro-image-preview
|
||||
export PATH="$HOME/.local/bin:$PATH"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Verification
|
||||
|
||||
```bash
|
||||
# Check Gemini CLI
|
||||
gemini --version
|
||||
|
||||
# Check Nano Banana
|
||||
gemini extensions list
|
||||
|
||||
# Check timg
|
||||
which timg
|
||||
|
||||
# Test image generation
|
||||
gemini "/generate 'A blue circle on white background'"
|
||||
timg ~/gemini-images/*.png
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File Locations
|
||||
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `~/.gemini/settings.json` | Gemini CLI settings |
|
||||
| `~/.gemini/oauth_creds.json` | OAuth tokens |
|
||||
| `~/.gemini/extensions/nanobanana/` | Nano Banana extension |
|
||||
| `~/gemini-images/` | Generated images |
|
||||
@ -1,529 +0,0 @@
|
||||
<!-- Parent: external-diagram-visual-generate/SKILL.md -->
|
||||
# Interview Questions Reference
|
||||
|
||||
This document defines the questions Claude should ask (via `AskUserQuestion`) before generating images with external-diagram-visual-generate.
|
||||
|
||||
---
|
||||
|
||||
## How to Use This Reference
|
||||
|
||||
When a user requests an image, Claude should:
|
||||
|
||||
1. **Detect image type** from the request
|
||||
2. **Find the matching question set** below
|
||||
3. **Invoke AskUserQuestion** with those questions
|
||||
4. **Build prompt** using the answers
|
||||
5. **Generate image** with optimized parameters
|
||||
|
||||
### Skip Interview Triggers
|
||||
|
||||
Skip questions and use defaults when user says:
|
||||
- "quick" - e.g., "Quick ERD of Account-Contact"
|
||||
- "simple" - e.g., "Simple LWC mockup"
|
||||
- "just generate" - e.g., "Just generate an architecture diagram"
|
||||
- "fast" - e.g., "Fast ERD draft"
|
||||
|
||||
---
|
||||
|
||||
## ERD Diagram Questions
|
||||
|
||||
### When to Use
|
||||
User mentions: ERD, entity relationship, data model, object relationships, schema diagram
|
||||
|
||||
### Questions
|
||||
|
||||
```json
|
||||
{
|
||||
"questions": [
|
||||
{
|
||||
"question": "Which objects should be included in the ERD?",
|
||||
"header": "Objects",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "Core CRM (Recommended)",
|
||||
"description": "Account, Contact, Opportunity, Case - standard sales/service objects"
|
||||
},
|
||||
{
|
||||
"label": "Sales Cloud",
|
||||
"description": "Lead, Campaign, Quote, Order, PriceBook, Product"
|
||||
},
|
||||
{
|
||||
"label": "Service Cloud",
|
||||
"description": "Case, Knowledge, Entitlement, Asset, ServiceContract"
|
||||
},
|
||||
{
|
||||
"label": "Custom objects",
|
||||
"description": "I'll specify the custom objects to include"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"question": "What visual style do you prefer?",
|
||||
"header": "Style",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "Architect.salesforce.com (Recommended)",
|
||||
"description": "Official Salesforce style: dark border + light fill, header banner, legend bar"
|
||||
},
|
||||
{
|
||||
"label": "Whiteboard",
|
||||
"description": "Hand-drawn look, casual feel for brainstorming"
|
||||
},
|
||||
{
|
||||
"label": "Technical",
|
||||
"description": "Detailed with field names and data types"
|
||||
},
|
||||
{
|
||||
"label": "Minimalist",
|
||||
"description": "Simple boxes, focus on relationships only"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"question": "What's the primary purpose of this ERD?",
|
||||
"header": "Purpose",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "Documentation (4K)",
|
||||
"description": "High quality for wikis, docs, long-term reference"
|
||||
},
|
||||
{
|
||||
"label": "Quick draft (1K)",
|
||||
"description": "Fast iteration, refine the prompt first"
|
||||
},
|
||||
{
|
||||
"label": "Presentation",
|
||||
"description": "Slides for stakeholders, clean and simple"
|
||||
},
|
||||
{
|
||||
"label": "Architecture review",
|
||||
"description": "Technical discussion with developers/architects"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"question": "Any special requirements? (Select all that apply)",
|
||||
"header": "Extras",
|
||||
"multiSelect": true,
|
||||
"options": [
|
||||
{
|
||||
"label": "Include legend",
|
||||
"description": "Add a legend explaining colors and relationship types"
|
||||
},
|
||||
{
|
||||
"label": "Show field names",
|
||||
"description": "Display key fields inside each object box"
|
||||
},
|
||||
{
|
||||
"label": "Color-code by type",
|
||||
"description": "Standard=blue, Custom=orange, External=green"
|
||||
},
|
||||
{
|
||||
"label": "None",
|
||||
"description": "Use default styling without extras"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Answer-to-Prompt Mapping
|
||||
|
||||
| Answer | Prompt Addition |
|
||||
|--------|-----------------|
|
||||
| Core CRM | "Account, Contact, Opportunity, Case with standard relationships" |
|
||||
| Sales Cloud | "Lead, Campaign, Quote, Order, PriceBook, Product with conversion flows" |
|
||||
| Service Cloud | "Case, Knowledge, Entitlement, Asset, ServiceContract hierarchy" |
|
||||
| Architect.salesforce.com | "Official architect.salesforce.com style: page title, header banner with Salesforce logo, LEGEND bar (ENTITIES + RELATIONSHIPS), dark border + light translucent fill boxes (~25% opacity), labeled relationship lines, footer with copyright" |
|
||||
| Whiteboard | "Hand-drawn sketch style, informal, whiteboard aesthetic" |
|
||||
| Technical | "Include field names, data types, API names in each box" |
|
||||
| Documentation (4K) | Use Python script with `-r 4K`, include full header + legend |
|
||||
| Quick draft (1K) | Use CLI or Python with `-r 1K` |
|
||||
| Include legend | "Include LEGEND bar at top with ENTITIES and RELATIONSHIPS sections" |
|
||||
| Color-code | "Auto-detect cloud color: Sales=Teal #0B827C, Service=Magenta #9E2A7D, Platform=Purple #5A67D8" |
|
||||
|
||||
### Default Values (for Skip Mode)
|
||||
|
||||
- Objects: Core CRM
|
||||
- Style: Architect.salesforce.com
|
||||
- Purpose: Quick draft (1K)
|
||||
- Extras: Include legend
|
||||
|
||||
---
|
||||
|
||||
## LWC Component Mockup Questions
|
||||
|
||||
### When to Use
|
||||
User mentions: LWC, Lightning Web Component, component mockup, wireframe, UI mockup, form, table, card
|
||||
|
||||
### Questions
|
||||
|
||||
```json
|
||||
{
|
||||
"questions": [
|
||||
{
|
||||
"question": "What type of component do you need?",
|
||||
"header": "Component",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "Data table (Recommended)",
|
||||
"description": "List view with columns, sorting, row actions"
|
||||
},
|
||||
{
|
||||
"label": "Record form",
|
||||
"description": "Create/edit form with fields and sections"
|
||||
},
|
||||
{
|
||||
"label": "Dashboard card",
|
||||
"description": "Metrics, charts, or KPI tiles"
|
||||
},
|
||||
{
|
||||
"label": "Custom layout",
|
||||
"description": "I'll describe the specific layout needed"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"question": "Which Salesforce object is this for?",
|
||||
"header": "Object",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "Account",
|
||||
"description": "Customer/company records"
|
||||
},
|
||||
{
|
||||
"label": "Contact",
|
||||
"description": "Individual person records"
|
||||
},
|
||||
{
|
||||
"label": "Opportunity",
|
||||
"description": "Sales deals and pipeline"
|
||||
},
|
||||
{
|
||||
"label": "Custom object",
|
||||
"description": "I'll specify the object name"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"question": "Where will this component be used?",
|
||||
"header": "Context",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "Lightning Record Page (Recommended)",
|
||||
"description": "Embedded on Account, Contact, etc. detail pages"
|
||||
},
|
||||
{
|
||||
"label": "Lightning App Page",
|
||||
"description": "Home page, dashboard, or custom app"
|
||||
},
|
||||
{
|
||||
"label": "Experience Cloud",
|
||||
"description": "Customer/partner portal (community)"
|
||||
},
|
||||
{
|
||||
"label": "Standalone app",
|
||||
"description": "Full-page Lightning app or utility bar"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"question": "Style preferences? (Select all that apply)",
|
||||
"header": "Style",
|
||||
"multiSelect": true,
|
||||
"options": [
|
||||
{
|
||||
"label": "SLDS standard",
|
||||
"description": "Standard Lightning Design System styling"
|
||||
},
|
||||
{
|
||||
"label": "Dense/compact",
|
||||
"description": "Reduced spacing for data-heavy views"
|
||||
},
|
||||
{
|
||||
"label": "Mobile-responsive",
|
||||
"description": "Adapts to mobile screen sizes"
|
||||
},
|
||||
{
|
||||
"label": "Card-based",
|
||||
"description": "Elevated card container with shadow"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Answer-to-Prompt Mapping
|
||||
|
||||
| Answer | Prompt Addition |
|
||||
|--------|-----------------|
|
||||
| Data table | "Lightning datatable with columns, header with search, row actions menu" |
|
||||
| Record form | "Lightning record form with sections, field labels, Save/Cancel buttons" |
|
||||
| Dashboard card | "SLDS card component with metric value, label, trend indicator" |
|
||||
| Lightning Record Page | "Component sized for record page sidebar or main content" |
|
||||
| Experience Cloud | "Portal-friendly styling, user-facing design" |
|
||||
| Dense/compact | "Compact spacing, reduced padding, data-dense layout" |
|
||||
| Mobile-responsive | "Responsive design, single column on mobile" |
|
||||
|
||||
### Default Values (for Skip Mode)
|
||||
|
||||
- Component: Data table
|
||||
- Object: Account
|
||||
- Context: Lightning Record Page
|
||||
- Style: SLDS standard
|
||||
|
||||
---
|
||||
|
||||
## Architecture/Integration Diagram Questions
|
||||
|
||||
### When to Use
|
||||
User mentions: architecture, integration, system diagram, data flow, API flow, authentication flow
|
||||
|
||||
### Questions
|
||||
|
||||
```json
|
||||
{
|
||||
"questions": [
|
||||
{
|
||||
"question": "What type of diagram do you need?",
|
||||
"header": "Diagram",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "Integration flow (Recommended)",
|
||||
"description": "System-to-system data synchronization"
|
||||
},
|
||||
{
|
||||
"label": "Data flow",
|
||||
"description": "Entity movement between systems"
|
||||
},
|
||||
{
|
||||
"label": "Authentication flow",
|
||||
"description": "OAuth, JWT, SSO sequence diagram"
|
||||
},
|
||||
{
|
||||
"label": "Event-driven",
|
||||
"description": "Platform Events, CDC, pub/sub architecture"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"question": "Which systems are involved?",
|
||||
"header": "Systems",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "Salesforce + ERP",
|
||||
"description": "SAP, Oracle, NetSuite, Microsoft Dynamics"
|
||||
},
|
||||
{
|
||||
"label": "Salesforce + Marketing",
|
||||
"description": "Marketo, Pardot, HubSpot, Marketing Cloud"
|
||||
},
|
||||
{
|
||||
"label": "Salesforce + Custom APIs",
|
||||
"description": "Internal services, microservices, legacy systems"
|
||||
},
|
||||
{
|
||||
"label": "Multiple systems",
|
||||
"description": "I'll specify the systems involved"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"question": "What protocols/patterns are used? (Select all that apply)",
|
||||
"header": "Protocols",
|
||||
"multiSelect": true,
|
||||
"options": [
|
||||
{
|
||||
"label": "REST APIs",
|
||||
"description": "JSON over HTTP, most common pattern"
|
||||
},
|
||||
{
|
||||
"label": "Platform Events / CDC",
|
||||
"description": "Salesforce event-driven integration"
|
||||
},
|
||||
{
|
||||
"label": "MuleSoft / iPaaS",
|
||||
"description": "Integration platform as middleware"
|
||||
},
|
||||
{
|
||||
"label": "SOAP / Legacy",
|
||||
"description": "XML-based, enterprise protocols"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"question": "What elements should be highlighted? (Select all that apply)",
|
||||
"header": "Elements",
|
||||
"multiSelect": true,
|
||||
"options": [
|
||||
{
|
||||
"label": "Auth badges",
|
||||
"description": "Show OAuth 2.0, JWT, API Key on connections"
|
||||
},
|
||||
{
|
||||
"label": "Error handling",
|
||||
"description": "Retry logic, dead letter queues, fallbacks"
|
||||
},
|
||||
{
|
||||
"label": "Data transforms",
|
||||
"description": "Mapping, conversion, enrichment steps"
|
||||
},
|
||||
{
|
||||
"label": "Timing/frequency",
|
||||
"description": "Sync intervals, batch schedules"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Answer-to-Prompt Mapping
|
||||
|
||||
| Answer | Prompt Addition |
|
||||
|--------|-----------------|
|
||||
| Integration flow | "System integration diagram with bidirectional data flow arrows" |
|
||||
| Authentication flow | "OAuth 2.0 sequence diagram with token exchange steps" |
|
||||
| Salesforce + ERP | "Salesforce (cloud icon) connected to ERP (server icon)" |
|
||||
| REST APIs | "REST/JSON labels on connection arrows" |
|
||||
| Platform Events | "Platform Events pub/sub with event bus in center" |
|
||||
| Auth badges | "OAuth 2.0 / JWT badges on integration arrows" |
|
||||
| Error handling | "Error queue and retry logic shown as separate path" |
|
||||
|
||||
### Default Values (for Skip Mode)
|
||||
|
||||
- Diagram: Integration flow
|
||||
- Systems: Salesforce + Custom APIs
|
||||
- Protocols: REST APIs
|
||||
- Elements: Auth badges
|
||||
|
||||
---
|
||||
|
||||
## Code Review Questions (Gemini Sub-Agent)
|
||||
|
||||
### When to Use
|
||||
User mentions: review, code review, check my code, analyze, audit, best practices
|
||||
|
||||
### Questions for Apex Review
|
||||
|
||||
```json
|
||||
{
|
||||
"questions": [
|
||||
{
|
||||
"question": "What type of Apex code is this?",
|
||||
"header": "Code Type",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "Trigger",
|
||||
"description": "Before/after trigger on an object"
|
||||
},
|
||||
{
|
||||
"label": "Batch job",
|
||||
"description": "Batch Apex for large data processing"
|
||||
},
|
||||
{
|
||||
"label": "Service class",
|
||||
"description": "Business logic, utility, or helper class"
|
||||
},
|
||||
{
|
||||
"label": "Controller",
|
||||
"description": "Aura/LWC controller or VF controller"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"question": "What should the review focus on?",
|
||||
"header": "Focus",
|
||||
"multiSelect": true,
|
||||
"options": [
|
||||
{
|
||||
"label": "Bulkification",
|
||||
"description": "SOQL/DML in loops, governor limits"
|
||||
},
|
||||
{
|
||||
"label": "Security",
|
||||
"description": "CRUD/FLS checks, injection vulnerabilities"
|
||||
},
|
||||
{
|
||||
"label": "Performance",
|
||||
"description": "Query optimization, caching, efficiency"
|
||||
},
|
||||
{
|
||||
"label": "Best practices",
|
||||
"description": "Naming, structure, patterns, testability"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference Card
|
||||
|
||||
| Image Type | Trigger Keywords | Questions |
|
||||
|------------|-----------------|-----------|
|
||||
| ERD | ERD, entity, data model, schema | Objects, Style, Purpose, Extras |
|
||||
| LWC Mockup | LWC, component, mockup, wireframe | Component, Object, Context, Style |
|
||||
| Architecture | architecture, integration, flow | Diagram, Systems, Protocols, Elements |
|
||||
| Code Review | review, analyze, check, audit | Code Type, Focus |
|
||||
|
||||
---
|
||||
|
||||
## Example: Full Interview Flow
|
||||
|
||||
### User Says
|
||||
"I need an ERD for my Service Cloud implementation"
|
||||
|
||||
### Claude Invokes AskUserQuestion
|
||||
```
|
||||
Objects: Core CRM / Sales Cloud / Service Cloud / Custom
|
||||
Style: Professional / Whiteboard / Technical / Minimalist
|
||||
Purpose: Documentation / Quick draft / Presentation / Review
|
||||
Extras: Legend / Field names / Color-code / None
|
||||
```
|
||||
|
||||
### User Selects
|
||||
- Objects: Service Cloud
|
||||
- Style: Professional
|
||||
- Purpose: Documentation
|
||||
- Extras: Legend, Color-code
|
||||
|
||||
### Claude Builds Prompt
|
||||
```
|
||||
Professional Salesforce ERD diagram showing Service Cloud objects:
|
||||
- Case (blue, center): Main service object
|
||||
- Knowledge (green, right): Linked articles
|
||||
- Entitlement (yellow, left): Service level agreements
|
||||
- Asset (orange, below): Customer-owned products
|
||||
- ServiceContract (purple, top): Contract management
|
||||
|
||||
Relationships:
|
||||
- Case → Knowledge (Lookup, dashed arrow)
|
||||
- Case → Asset (Lookup, dashed arrow)
|
||||
- Asset → ServiceContract (Master-Detail, solid arrow)
|
||||
|
||||
Color coding: Standard objects (blue), Service objects (green/yellow)
|
||||
Include legend in bottom-right corner.
|
||||
Clean white background, SLDS styling.
|
||||
```
|
||||
|
||||
### Claude Generates
|
||||
```bash
|
||||
uv run scripts/generate_image.py \
|
||||
-p "[prompt above]" \
|
||||
-f "service-cloud-erd.png" \
|
||||
-r 4K
|
||||
```
|
||||
@ -1,173 +0,0 @@
|
||||
<!-- Parent: external-diagram-visual-generate/SKILL.md -->
|
||||
# Iteration Workflow: Draft → Final
|
||||
|
||||
Best practices for cost-effective image generation with external-diagram-visual-generate.
|
||||
|
||||
## Why Iterate at Low Resolution?
|
||||
|
||||
| Resolution | Time | API Cost | Use Case |
|
||||
|------------|------|----------|----------|
|
||||
| **1K** | ~3s | $ | Drafts, prompt refinement, layout testing |
|
||||
| **2K** | ~5s | $$ | Medium quality, quick presentations |
|
||||
| **4K** | ~10s | $$$ | Production, documentation, final deliverables |
|
||||
|
||||
**Key Insight**: Get the prompt right at 1K before spending on 4K generation.
|
||||
|
||||
---
|
||||
|
||||
## The Workflow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ DRAFT PHASE (1K) │
|
||||
│ │
|
||||
│ 1. Generate initial image with CLI │
|
||||
│ gemini --yolo "/generate 'Your prompt...'" │
|
||||
│ │
|
||||
│ 2. Review in Preview │
|
||||
│ open ~/nanobanana-output/*.png │
|
||||
│ │
|
||||
│ 3. Is the layout correct? ─────────────────┐ │
|
||||
│ │ │ │
|
||||
│ ▼ No ▼ Yes │
|
||||
│ Refine prompt or use /edit Continue │
|
||||
│ └──────────────────────────────────────►│ │
|
||||
└─────────────────────────────────────────────┼───────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ FINAL PHASE (4K) │
|
||||
│ │
|
||||
│ 4. Generate production quality with Python script │
|
||||
│ uv run scripts/generate_image.py \ │
|
||||
│ -p "Your refined prompt" \ │
|
||||
│ -f "final-output.png" \ │
|
||||
│ -r 4K │
|
||||
│ │
|
||||
│ 5. Open and use │
|
||||
│ open ~/nanobanana-output/*final-output*.png │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Common Iteration Patterns
|
||||
|
||||
### Pattern 1: Prompt Refinement
|
||||
|
||||
```bash
|
||||
# Attempt 1: Too generic
|
||||
gemini --yolo "/generate 'Account ERD'"
|
||||
# Result: Missing relationships, wrong colors
|
||||
|
||||
# Attempt 2: Add specifics
|
||||
gemini --yolo "/generate 'Account ERD with Contact and Opportunity, blue boxes'"
|
||||
# Result: Better, but legend missing
|
||||
|
||||
# Attempt 3: Add styling details
|
||||
gemini --yolo "/generate 'Salesforce ERD: Account (blue, center), Contact (green),
|
||||
Opportunity (yellow). Master-detail = thick arrow. Lookup = dashed. Include legend.'"
|
||||
# Result: Perfect layout!
|
||||
|
||||
# Final: Generate at 4K
|
||||
uv run scripts/generate_image.py \
|
||||
-p "Salesforce ERD: Account (blue, center)..." \
|
||||
-f "crm-erd-final.png" \
|
||||
-r 4K
|
||||
```
|
||||
|
||||
### Pattern 2: Edit-Based Iteration
|
||||
|
||||
```bash
|
||||
# Start with basic ERD
|
||||
gemini --yolo "/generate 'Account-Contact ERD'"
|
||||
|
||||
# Edit to add more objects
|
||||
gemini --yolo "/edit 'Add Opportunity linked to Account with master-detail'"
|
||||
|
||||
# Edit to improve styling
|
||||
gemini --yolo "/edit 'Add legend, use Salesforce Lightning blue (#0176D3)'"
|
||||
|
||||
# Final at 4K
|
||||
uv run scripts/generate_image.py \
|
||||
-p "Account-Contact-Opportunity ERD with legend, SLDS colors" \
|
||||
-f "final-erd.png" \
|
||||
-r 4K
|
||||
```
|
||||
|
||||
### Pattern 3: Python Script for Editing
|
||||
|
||||
```bash
|
||||
# Generate at 1K
|
||||
uv run scripts/generate_image.py \
|
||||
-p "Dashboard mockup with charts" \
|
||||
-f "dashboard-v1.png"
|
||||
|
||||
# Edit with resolution control
|
||||
uv run scripts/generate_image.py \
|
||||
-p "Add a KPI summary bar at the top" \
|
||||
-i ~/nanobanana-output/*dashboard-v1*.png \
|
||||
-f "dashboard-v2.png" \
|
||||
-r 2K
|
||||
|
||||
# Final version
|
||||
uv run scripts/generate_image.py \
|
||||
-p "Polish: add subtle shadows, round corners on cards" \
|
||||
-i ~/nanobanana-output/*dashboard-v2*.png \
|
||||
-f "dashboard-final.png" \
|
||||
-r 4K
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Timestamp Filenames
|
||||
|
||||
The Python script automatically adds timestamps for easy versioning:
|
||||
|
||||
```
|
||||
~/nanobanana-output/
|
||||
├── 2026-01-13-10-30-15-erd-v1.png # First attempt
|
||||
├── 2026-01-13-10-32-45-erd-v2.png # After edit
|
||||
├── 2026-01-13-10-35-00-erd-final.png # Production 4K
|
||||
```
|
||||
|
||||
**Tip**: Use descriptive filenames like `crm-erd.png` - the timestamp is auto-prepended.
|
||||
|
||||
---
|
||||
|
||||
## When to Use Each Method
|
||||
|
||||
| Method | Best For |
|
||||
|--------|----------|
|
||||
| **CLI (`gemini --yolo`)** | Quick drafts, simple edits, style exploration |
|
||||
| **CLI `/edit`** | Iterative refinements of existing images |
|
||||
| **Python script** | 4K output, precise resolution control, automated workflows |
|
||||
|
||||
---
|
||||
|
||||
## Cost Optimization Tips
|
||||
|
||||
1. **Never generate 4K on first attempt** - always draft at 1K first
|
||||
2. **Use `/edit` for small changes** - cheaper than regenerating
|
||||
3. **Batch similar requests** - get all ERDs right before final generation
|
||||
4. **Save working prompts** - reuse successful prompt patterns
|
||||
5. **Use `--seed` for reproducibility** - same seed = similar output
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Image doesn't match prompt
|
||||
- Add more specific details (colors, positions, relationships)
|
||||
- Use SLDS color codes: `#0176D3` (blue), `#04844B` (green), `#FFB75D` (yellow)
|
||||
- Specify layout: "center", "top-right", "below parent"
|
||||
|
||||
### Edit not applying correctly
|
||||
- Be specific about what to change
|
||||
- Reference existing elements: "Move the Account box to center"
|
||||
- One change at a time for precision
|
||||
|
||||
### 4K output looks different from 1K draft
|
||||
- Use exact same prompt text
|
||||
- Consider using `--seed` for consistency
|
||||
- Minor variations are normal due to model behavior
|
||||
@ -1,101 +0,0 @@
|
||||
#!/bin/bash
|
||||
# check-prerequisites.sh - Verify external-diagram-visual-generate requirements before use
|
||||
# Returns 0 if all required checks pass, 1 if any required fail
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
GRAY='\033[0;90m'
|
||||
NC='\033[0m'
|
||||
|
||||
ERRORS=0
|
||||
WARNINGS=0
|
||||
|
||||
echo ""
|
||||
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||
echo -e "${BLUE} 📸 SF-IMAGEN PREREQUISITES CHECK${NC}"
|
||||
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||
echo ""
|
||||
echo -e "${GRAY} REQUIRED:${NC}"
|
||||
|
||||
# Check 1: macOS (required for Preview app)
|
||||
echo -n " Checking macOS (for Preview app)... "
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
echo -e "${GREEN}✓ macOS detected${NC}"
|
||||
else
|
||||
echo -e "${RED}✗ Not macOS${NC}"
|
||||
echo -e " ${YELLOW}→ external-diagram-visual-generate uses macOS Preview app for image display${NC}"
|
||||
echo -e " ${YELLOW}→ Current OS: $OSTYPE${NC}"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
# Check 2: Gemini API Key
|
||||
echo -n " Checking GEMINI_API_KEY... "
|
||||
if [[ -n "$GEMINI_API_KEY" ]]; then
|
||||
# Mask the key for display
|
||||
MASKED_KEY="${GEMINI_API_KEY:0:10}...${GEMINI_API_KEY: -4}"
|
||||
echo -e "${GREEN}✓ Set ($MASKED_KEY)${NC}"
|
||||
else
|
||||
echo -e "${RED}✗ Not set${NC}"
|
||||
echo -e " ${YELLOW}→ Nano Banana Pro requires a personal API key${NC}"
|
||||
echo -e " ${YELLOW}→ Get one at: https://aistudio.google.com/apikey${NC}"
|
||||
echo -e " ${YELLOW}→ Add to ~/.zshrc: export GEMINI_API_KEY=\"your-key\"${NC}"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
# Check 3: Gemini CLI
|
||||
echo -n " Checking Gemini CLI... "
|
||||
if command -v gemini &> /dev/null; then
|
||||
GEMINI_VERSION=$(gemini --version 2>/dev/null | head -1 || echo "installed")
|
||||
echo -e "${GREEN}✓ $GEMINI_VERSION${NC}"
|
||||
else
|
||||
echo -e "${RED}✗ Not installed${NC}"
|
||||
echo -e " ${YELLOW}→ Install: npm install -g @google/gemini-cli${NC}"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
# Check 4: Nano Banana Extension
|
||||
echo -n " Checking Nano Banana extension... "
|
||||
if gemini extensions list 2>/dev/null | grep -q "nanobanana"; then
|
||||
echo -e "${GREEN}✓ Installed${NC}"
|
||||
else
|
||||
echo -e "${RED}✗ Not installed${NC}"
|
||||
echo -e " ${YELLOW}→ Install: gemini extensions install nanobanana${NC}"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GRAY} OPTIONAL (for 4K/editing via Python script):${NC}"
|
||||
|
||||
# Check 5: uv (optional, for Python script)
|
||||
echo -n " Checking uv (Python runner)... "
|
||||
if command -v uv &> /dev/null; then
|
||||
UV_VERSION=$(uv --version 2>&1 | head -1)
|
||||
echo -e "${GREEN}✓ $UV_VERSION${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}○ Not installed (optional)${NC}"
|
||||
echo -e " ${GRAY}→ For 4K resolution/editing: curl -LsSf https://astral.sh/uv/install.sh | sh${NC}"
|
||||
WARNINGS=$((WARNINGS + 1))
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||
|
||||
if [[ $ERRORS -eq 0 ]]; then
|
||||
if [[ $WARNINGS -gt 0 ]]; then
|
||||
echo -e " ${GREEN}✅ All required prerequisites met!${NC}"
|
||||
echo -e " ${YELLOW}⚠️ $WARNINGS optional feature(s) unavailable${NC}"
|
||||
else
|
||||
echo -e " ${GREEN}✅ All prerequisites met! external-diagram-visual-generate is ready to use.${NC}"
|
||||
fi
|
||||
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||
echo ""
|
||||
exit 0
|
||||
else
|
||||
echo -e " ${RED}❌ $ERRORS required prerequisite(s) missing.${NC}"
|
||||
echo -e " ${RED} Please fix before using external-diagram-visual-generate.${NC}"
|
||||
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
@ -1,243 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# /// script
|
||||
# requires-python = ">=3.10"
|
||||
# dependencies = ["google-genai>=1.0.0", "pillow>=10.0.0"]
|
||||
# ///
|
||||
"""
|
||||
Direct Gemini API image generation with resolution control.
|
||||
|
||||
This script complements the CLI extension for power features:
|
||||
- Resolution control: 1K (draft), 2K (medium), 4K (production)
|
||||
- Image editing: Modify existing images with natural language
|
||||
- Timestamp filenames: Automatic versioning for iteration tracking
|
||||
|
||||
Usage:
|
||||
# Generate new image at 1K (draft)
|
||||
uv run scripts/generate_image.py -p "Salesforce ERD diagram..." -f "account-erd.png"
|
||||
|
||||
# Generate at 4K (production)
|
||||
uv run scripts/generate_image.py -p "Salesforce ERD diagram..." -f "account-erd.png" -r 4K
|
||||
|
||||
# Edit existing image
|
||||
uv run scripts/generate_image.py -p "Add a legend in bottom right" -i input.png -f "output.png"
|
||||
|
||||
Workflow: Draft → Iterate → Final
|
||||
1. Generate at 1K for quick feedback (~3s)
|
||||
2. Refine prompt until layout/content is correct
|
||||
3. Generate final at 4K for production quality (~10s)
|
||||
|
||||
License: MIT
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
from datetime import datetime
|
||||
from io import BytesIO
|
||||
from pathlib import Path
|
||||
|
||||
try:
|
||||
from google import genai
|
||||
from google.genai import types
|
||||
from PIL import Image
|
||||
except ImportError as e:
|
||||
print(f"Error: Missing dependency - {e}")
|
||||
print("Run with: uv run scripts/generate_image.py ...")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
# Resolution mapping (uppercase K required by API!)
|
||||
RESOLUTIONS = {
|
||||
"1K": "1K", # ~1024px - drafts, fast iteration
|
||||
"2K": "2K", # ~2048px - medium quality
|
||||
"4K": "4K", # ~4096px - production quality
|
||||
}
|
||||
|
||||
# Default output directory (matches CLI extension)
|
||||
OUTPUT_DIR = Path.home() / "nanobanana-output"
|
||||
|
||||
|
||||
def get_auto_resolution(image_path: str) -> str:
|
||||
"""Auto-detect resolution based on input image dimensions."""
|
||||
try:
|
||||
with Image.open(image_path) as img:
|
||||
max_dim = max(img.width, img.height)
|
||||
if max_dim < 1500:
|
||||
return "1K"
|
||||
elif max_dim < 3000:
|
||||
return "2K"
|
||||
else:
|
||||
return "4K"
|
||||
except Exception:
|
||||
return "1K"
|
||||
|
||||
|
||||
def generate_image(
|
||||
prompt: str,
|
||||
filename: str,
|
||||
resolution: str = "1K",
|
||||
input_image: str | None = None,
|
||||
api_key: str | None = None,
|
||||
aspect_ratio: str | None = None,
|
||||
) -> str:
|
||||
"""Generate or edit an image using Gemini 3 Pro Image API.
|
||||
|
||||
Args:
|
||||
prompt: Text description for generation or editing instruction
|
||||
filename: Output filename (timestamp will be prepended)
|
||||
resolution: Output resolution - 1K, 2K, or 4K (uppercase required!)
|
||||
input_image: Path to existing image for editing (optional)
|
||||
api_key: Gemini API key (falls back to GEMINI_API_KEY env var)
|
||||
aspect_ratio: Aspect ratio like "16:9", "1:1", "4:3" (optional)
|
||||
|
||||
Returns:
|
||||
Path to saved image file
|
||||
"""
|
||||
# Get API key
|
||||
api_key = api_key or os.environ.get("GEMINI_API_KEY")
|
||||
if not api_key:
|
||||
raise ValueError(
|
||||
"GEMINI_API_KEY not found. Set it in ~/.zshrc or pass via --api-key"
|
||||
)
|
||||
|
||||
# Initialize client
|
||||
client = genai.Client(api_key=api_key)
|
||||
|
||||
# Build contents (image first if editing, then prompt)
|
||||
contents = []
|
||||
if input_image:
|
||||
img = Image.open(input_image)
|
||||
# Convert RGBA to RGB if needed
|
||||
if img.mode == "RGBA":
|
||||
background = Image.new("RGB", img.size, (255, 255, 255))
|
||||
background.paste(img, mask=img.split()[3])
|
||||
img = background
|
||||
contents.append(img)
|
||||
|
||||
# Auto-detect resolution for editing if not specified
|
||||
if resolution == "1K":
|
||||
resolution = get_auto_resolution(input_image)
|
||||
print(f"Auto-detected resolution: {resolution}")
|
||||
|
||||
contents.append(prompt)
|
||||
|
||||
# Build image config
|
||||
image_config_kwargs = {"image_size": RESOLUTIONS[resolution]}
|
||||
if aspect_ratio:
|
||||
image_config_kwargs["aspect_ratio"] = aspect_ratio
|
||||
|
||||
# Generate with resolution config
|
||||
print(f"Generating at {resolution} resolution...")
|
||||
response = client.models.generate_content(
|
||||
model="gemini-3-pro-image-preview",
|
||||
contents=contents,
|
||||
config=types.GenerateContentConfig(
|
||||
response_modalities=["IMAGE", "TEXT"],
|
||||
image_config=types.ImageConfig(**image_config_kwargs),
|
||||
),
|
||||
)
|
||||
|
||||
# Save output with timestamp filename
|
||||
OUTPUT_DIR.mkdir(exist_ok=True)
|
||||
timestamp = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
|
||||
|
||||
# Clean filename (remove extension if present, we'll add .png)
|
||||
clean_name = Path(filename).stem
|
||||
output_filename = f"{timestamp}-{clean_name}.png"
|
||||
output_path = OUTPUT_DIR / output_filename
|
||||
|
||||
# Extract and save image from response
|
||||
for part in response.candidates[0].content.parts:
|
||||
if hasattr(part, "inline_data") and part.inline_data:
|
||||
img = Image.open(BytesIO(part.inline_data.data))
|
||||
# Convert to RGB if needed
|
||||
if img.mode == "RGBA":
|
||||
background = Image.new("RGB", img.size, (255, 255, 255))
|
||||
background.paste(img, mask=img.split()[3])
|
||||
img = background
|
||||
img.save(output_path, "PNG")
|
||||
return str(output_path)
|
||||
|
||||
raise RuntimeError("No image data in response")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Generate images with Gemini 3 Pro Image API",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog="""
|
||||
Examples:
|
||||
# Draft (fast, cheap)
|
||||
uv run generate_image.py -p "Account ERD diagram" -f "account-erd.png"
|
||||
|
||||
# Production (4K)
|
||||
uv run generate_image.py -p "Account ERD diagram" -f "account-erd.png" -r 4K
|
||||
|
||||
# Edit existing image
|
||||
uv run generate_image.py -p "Add legend" -i prev.png -f "updated.png"
|
||||
|
||||
# With aspect ratio
|
||||
uv run generate_image.py -p "Dashboard mockup" -f "dash.png" -a "16:9"
|
||||
""",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-p", "--prompt",
|
||||
required=True,
|
||||
help="Image description or editing instruction",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-f", "--filename",
|
||||
required=True,
|
||||
help="Output filename (timestamp auto-prepended)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-r", "--resolution",
|
||||
choices=["1K", "2K", "4K"],
|
||||
default="1K",
|
||||
help="Output resolution (default: 1K for drafts)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-i", "--input-image",
|
||||
help="Path to existing image for editing",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-k", "--api-key",
|
||||
help="Gemini API key (defaults to GEMINI_API_KEY env var)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-a", "--aspect-ratio",
|
||||
help="Aspect ratio (e.g., '16:9', '1:1', '4:3')",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--no-open",
|
||||
action="store_true",
|
||||
help="Don't auto-open the image in Preview after generation",
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
try:
|
||||
output_path = generate_image(
|
||||
prompt=args.prompt,
|
||||
filename=args.filename,
|
||||
resolution=args.resolution,
|
||||
input_image=args.input_image,
|
||||
api_key=args.api_key,
|
||||
aspect_ratio=args.aspect_ratio,
|
||||
)
|
||||
print(f"✅ Saved: {output_path}")
|
||||
|
||||
# Auto-open in macOS Preview unless --no-open is specified
|
||||
if not args.no_open:
|
||||
subprocess.run(["open", output_path], check=False)
|
||||
print(f" 📸 Opened in Preview")
|
||||
else:
|
||||
print(f" Open with: open {output_path}")
|
||||
except Exception as e:
|
||||
print(f"❌ Error: {e}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@ -1,3 +0,0 @@
|
||||
# Credits & Acknowledgments
|
||||
|
||||
This skill is built on established Salesforce OAuth and identity platform patterns, incorporating security best practices and architectural guidance from the Salesforce platform ecosystem.
|
||||
@ -23,21 +23,21 @@ This skill helps you create and manage:
|
||||
|
||||
### Create a Connected App
|
||||
|
||||
```
|
||||
```text
|
||||
Use the integration-connectivity-connected-app-configure skill to create a Connected App named "MyIntegration"
|
||||
with API and RefreshToken scopes for server-to-server integration.
|
||||
```
|
||||
|
||||
### Create an External Client App
|
||||
|
||||
```
|
||||
```text
|
||||
Use the integration-connectivity-connected-app-configure skill to create an External Client App named
|
||||
"MobileApp" for a mobile application with PKCE enabled.
|
||||
```
|
||||
|
||||
### Review Existing Apps
|
||||
|
||||
```
|
||||
```text
|
||||
Use the integration-connectivity-connected-app-configure skill to review and score my existing Connected Apps
|
||||
for security best practices.
|
||||
```
|
||||
@ -70,7 +70,7 @@ for security best practices.
|
||||
|
||||
## Directory Structure
|
||||
|
||||
```
|
||||
```text
|
||||
integration-connectivity-connected-app-configure/
|
||||
├── skills/
|
||||
│ └── integration-connectivity-connected-app-configure/
|
||||
@ -96,4 +96,3 @@ integration-connectivity-connected-app-configure/
|
||||
## Dependencies
|
||||
|
||||
- **platform-metadata-deploy**: For deploying apps to orgs
|
||||
- **sf-metadata**: For creating related metadata (Named Credentials)
|
||||
|
||||
@ -85,7 +85,7 @@ Read the appropriate template before generating — do not build from scratch:
|
||||
| `assets/eca-policies.xml` | ECA configurable policies |
|
||||
|
||||
If you need source-controlled ECA OAuth security metadata, retrieve it from an org first and treat the retrieved file as the schema source of truth:
|
||||
```
|
||||
```sh
|
||||
sf project retrieve start --metadata ExtlClntAppOauthSecuritySettings:<AppName> --target-org <alias>
|
||||
```
|
||||
|
||||
@ -172,7 +172,7 @@ When finishing, confirm and report in this order:
|
||||
5. **Next deployment / testing step**
|
||||
|
||||
Suggested output shape:
|
||||
```
|
||||
```text
|
||||
App: <name>
|
||||
Type: Connected App | External Client App
|
||||
Flow: <oauth flow>
|
||||
|
||||
@ -6,7 +6,7 @@ Real-world examples of using the integration-connectivity-connected-app-configur
|
||||
## Example 1: Create a Basic API Integration Connected App
|
||||
|
||||
**Request**:
|
||||
```
|
||||
```text
|
||||
Use the integration-connectivity-connected-app-configure skill to create a Connected App named "DataSyncIntegration"
|
||||
for syncing data with our external ERP system. It needs API access and refresh tokens.
|
||||
Contact email: admin@company.com
|
||||
@ -42,7 +42,7 @@ Contact email: admin@company.com
|
||||
## Example 2: Create a JWT Bearer App for CI/CD
|
||||
|
||||
**Request**:
|
||||
```
|
||||
```text
|
||||
Create a Connected App for our CI/CD pipeline using JWT Bearer flow.
|
||||
Name it "GitHubActionsDeployment" and use certificate "GH_Actions_Cert".
|
||||
```
|
||||
@ -77,7 +77,7 @@ Name it "GitHubActionsDeployment" and use certificate "GH_Actions_Cert".
|
||||
## Example 3: Create a Mobile App with External Client App
|
||||
|
||||
**Request**:
|
||||
```
|
||||
```text
|
||||
Create an External Client App for our mobile app "FieldServiceMobile".
|
||||
It needs PKCE enabled, refresh tokens, and should be packageable for distribution.
|
||||
```
|
||||
@ -134,7 +134,7 @@ sf project retrieve start \
|
||||
## Example 4: Review Existing Connected Apps
|
||||
|
||||
**Request**:
|
||||
```
|
||||
```text
|
||||
Review and score my existing Connected Apps for security best practices.
|
||||
```
|
||||
|
||||
@ -145,7 +145,7 @@ Review and score my existing Connected Apps for security best practices.
|
||||
4. Generate report
|
||||
|
||||
**Sample Report**:
|
||||
```
|
||||
```text
|
||||
📊 CONNECTED APP SECURITY REVIEW
|
||||
════════════════════════════════════════════════════════════════
|
||||
|
||||
@ -180,7 +180,7 @@ LegacyERPConnector:
|
||||
## Example 5: Migrate Connected App to External Client App
|
||||
|
||||
**Request**:
|
||||
```
|
||||
```text
|
||||
Migrate our "SalesPortal" Connected App to an External Client App for better security.
|
||||
```
|
||||
|
||||
@ -191,7 +191,7 @@ Migrate our "SalesPortal" Connected App to an External Client App for better sec
|
||||
4. Provide migration checklist
|
||||
|
||||
**Output**:
|
||||
```
|
||||
```text
|
||||
📦 MIGRATION PLAN: SalesPortal → External Client App
|
||||
════════════════════════════════════════════════════════════════
|
||||
|
||||
|
||||
@ -72,7 +72,7 @@ List all systems using each Connected App:
|
||||
|
||||
#### 2.2 Plan Credential Rollover
|
||||
|
||||
```
|
||||
```text
|
||||
Timeline Example:
|
||||
Week 1: Create ECA, deploy to DevHub
|
||||
Week 2: Update integration systems with new credentials
|
||||
|
||||
@ -7,7 +7,7 @@ Detailed OAuth flow patterns, configuration examples, and implementation guidanc
|
||||
|
||||
## Flow Selection Decision Tree
|
||||
|
||||
```
|
||||
```text
|
||||
START
|
||||
│
|
||||
├─ Do you have a backend server?
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user