acek-skills 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -4
- package/bin/cli.js +37 -5
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -65,8 +65,8 @@ Running `install` with no arguments walks you through three prompts:
|
|
|
65
65
|
◉ sf-testing
|
|
66
66
|
|
|
67
67
|
? Select the target IDE(s) / tool(s)
|
|
68
|
-
◉ Claude Code — project (./.claude/skills
|
|
69
|
-
◯ Claude Code — global (~/.claude/skills
|
|
68
|
+
◉ Claude Code — project (./.claude/skills)
|
|
69
|
+
◯ Claude Code — global (~/.claude/skills)
|
|
70
70
|
◯ Cursor (./.cursor/rules)
|
|
71
71
|
◯ Windsurf (./.windsurf/rules)
|
|
72
72
|
◯ GitHub Copilot (./.github/instructions)
|
|
@@ -122,8 +122,8 @@ The CLI prints a reminder after install if any placeholder was left unresolved.
|
|
|
122
122
|
|
|
123
123
|
| Target | Destination | Trigger behavior |
|
|
124
124
|
|---|---|---|
|
|
125
|
-
| **Claude Code** (project) | `./.claude/skills
|
|
126
|
-
| **Claude Code** (global) | `~/.claude/skills
|
|
125
|
+
| **Claude Code** (project) | `./.claude/skills/<skill>/SKILL.md` | Auto-triggered — Claude reads the `description` frontmatter and invokes the skill only when the task matches |
|
|
126
|
+
| **Claude Code** (global) | `~/.claude/skills/<skill>/SKILL.md` | Same as above, applies across every project on your machine |
|
|
127
127
|
| **Cursor** | `./.cursor/rules/<skill>.mdc` | Project rule (`alwaysApply: false`) — Cursor decides relevance from the `description` field |
|
|
128
128
|
| **Windsurf** | `./.windsurf/rules/<skill>.md` | Cascade rule (`trigger: model_decision`) — same idea, Windsurf's own matching |
|
|
129
129
|
| **GitHub Copilot** | `./.github/instructions/<skill>.instructions.md` | Custom instructions (`applyTo: "**"`) — applied repo-wide, no per-task trigger |
|
|
@@ -166,6 +166,11 @@ external systems.
|
|
|
166
166
|
Apex classes, triggers, batch jobs, test classes, SOQL, LWC (HTML/JS/CSS), Aura components, and
|
|
167
167
|
integration patterns. Covers governor limits, CRUD/FLS patterns, `@AuraEnabled` conventions, LWC
|
|
168
168
|
brand tokens + version badges, and REST/SOAP callout patterns.
|
|
169
|
+
|
|
170
|
+
> **Note:** its LWC section uses a custom `:host` brand-token block (`--brand`, `--r-sm`, etc.)
|
|
171
|
+
> plus a mandatory version badge — a different, incompatible styling convention from
|
|
172
|
+
> [`shaiden`](https://www.npmjs.com/package/shaiden) (SLDS 2 global hooks only). Don't install
|
|
173
|
+
> both against the same component without reconciling the two first.
|
|
169
174
|
</details>
|
|
170
175
|
|
|
171
176
|
<details>
|
package/bin/cli.js
CHANGED
|
@@ -10,17 +10,28 @@ const target = args[1]; // optional: specific skill name, or "--all"
|
|
|
10
10
|
|
|
11
11
|
const SKILLS_SRC = path.join(__dirname, '../skills');
|
|
12
12
|
|
|
13
|
+
function printBanner() {
|
|
14
|
+
console.log(`\x1b[36m
|
|
15
|
+
____ _ _____ _ _ ____
|
|
16
|
+
/ ___|| |/ /_ _| | | | / ___|
|
|
17
|
+
\\___ \\| ' / | || | | | \\___ \\
|
|
18
|
+
___) | . \\ | || |___| |___ ___) |
|
|
19
|
+
|____/|_|\\_\\___|_____|_____|____/\x1b[0m
|
|
20
|
+
\x1b[2mSalesforce skills for Claude Code\x1b[0m
|
|
21
|
+
`);
|
|
22
|
+
}
|
|
23
|
+
|
|
13
24
|
// Where each target/tool expects its instruction files, and how to format them.
|
|
14
25
|
const TARGETS = {
|
|
15
26
|
'claude-project': {
|
|
16
|
-
label: 'Claude Code — project (./.claude/skills
|
|
17
|
-
dir: (cwd) => path.join(cwd, '.claude/skills
|
|
27
|
+
label: 'Claude Code — project (./.claude/skills)',
|
|
28
|
+
dir: (cwd) => path.join(cwd, '.claude/skills'),
|
|
18
29
|
format: 'claude',
|
|
19
30
|
selected: true,
|
|
20
31
|
},
|
|
21
32
|
'claude-global': {
|
|
22
|
-
label: 'Claude Code — global (~/.claude/skills
|
|
23
|
-
dir: () => path.join(os.homedir(), '.claude/skills
|
|
33
|
+
label: 'Claude Code — global (~/.claude/skills)',
|
|
34
|
+
dir: () => path.join(os.homedir(), '.claude/skills'),
|
|
24
35
|
format: 'claude',
|
|
25
36
|
selected: false,
|
|
26
37
|
},
|
|
@@ -46,9 +57,12 @@ const TARGETS = {
|
|
|
46
57
|
|
|
47
58
|
// Copies a skill directory, substituting org-alias placeholders in any
|
|
48
59
|
// Markdown file along the way (binary/other files are copied as-is).
|
|
49
|
-
|
|
60
|
+
// `skip` excludes filenames at the top level (used to drop SKILL.md when
|
|
61
|
+
// mirroring a skill's supporting files next to a converted rule file).
|
|
62
|
+
function copySkillDir(src, dest, aliases, skip = new Set()) {
|
|
50
63
|
fs.mkdirSync(dest, { recursive: true });
|
|
51
64
|
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
65
|
+
if (skip.has(entry.name)) continue;
|
|
52
66
|
const srcPath = path.join(src, entry.name);
|
|
53
67
|
const destPath = path.join(dest, entry.name);
|
|
54
68
|
if (entry.isDirectory()) {
|
|
@@ -148,6 +162,20 @@ function installSkillToTarget(skillName, targetKey, cwd, aliases = {}) {
|
|
|
148
162
|
path.join(destDir, `${skillName}${EXT[targetDef.format]}`),
|
|
149
163
|
content,
|
|
150
164
|
);
|
|
165
|
+
|
|
166
|
+
// Carry over supporting files (e.g. references/) alongside the converted
|
|
167
|
+
// rule file — these tools don't have Claude Code's skill directory, so we
|
|
168
|
+
// mirror it as <skillName>/ next to the main rule file.
|
|
169
|
+
const skillDir = path.join(SKILLS_SRC, skillName);
|
|
170
|
+
const extras = fs.readdirSync(skillDir).filter((f) => f !== 'SKILL.md');
|
|
171
|
+
if (extras.length > 0) {
|
|
172
|
+
copySkillDir(
|
|
173
|
+
skillDir,
|
|
174
|
+
path.join(destDir, skillName),
|
|
175
|
+
aliases,
|
|
176
|
+
new Set(['SKILL.md']),
|
|
177
|
+
);
|
|
178
|
+
}
|
|
151
179
|
}
|
|
152
180
|
|
|
153
181
|
function aliasesFromEnv() {
|
|
@@ -171,6 +199,8 @@ function warnIfAliasesUnresolved(skillNames, aliases) {
|
|
|
171
199
|
}
|
|
172
200
|
|
|
173
201
|
async function runInteractiveInstall() {
|
|
202
|
+
printBanner();
|
|
203
|
+
|
|
174
204
|
let prompts;
|
|
175
205
|
try {
|
|
176
206
|
prompts = require('prompts');
|
|
@@ -254,6 +284,7 @@ async function runInteractiveInstall() {
|
|
|
254
284
|
async function main() {
|
|
255
285
|
if (command === 'install') {
|
|
256
286
|
if (target === '--all') {
|
|
287
|
+
printBanner();
|
|
257
288
|
const available = listSkills();
|
|
258
289
|
const aliases = aliasesFromEnv();
|
|
259
290
|
for (const skill of available) {
|
|
@@ -264,6 +295,7 @@ async function main() {
|
|
|
264
295
|
);
|
|
265
296
|
warnIfAliasesUnresolved(available, aliases);
|
|
266
297
|
} else if (target) {
|
|
298
|
+
printBanner();
|
|
267
299
|
const available = listSkills();
|
|
268
300
|
if (!available.includes(target)) {
|
|
269
301
|
console.error(
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "acek-skills",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Installable Claude Code skills for Salesforce development (admin, dev, BA, testing, devops, security review, data migration, ideation)",
|
|
5
5
|
"bin": {
|
|
6
6
|
"acek-skills": "bin/cli.js"
|
|
@@ -24,9 +24,10 @@
|
|
|
24
24
|
"license": "MIT",
|
|
25
25
|
"repository": {
|
|
26
26
|
"type": "git",
|
|
27
|
-
"url": "git+https://github.com/AcekBecek16/acek-sf-skills.git"
|
|
27
|
+
"url": "git+https://github.com/AcekBecek16/acek-sf-skills.git",
|
|
28
|
+
"directory": "packages/acek-skills"
|
|
28
29
|
},
|
|
29
|
-
"homepage": "https://github.com/AcekBecek16/acek-sf-skills#readme",
|
|
30
|
+
"homepage": "https://github.com/AcekBecek16/acek-sf-skills/tree/master/packages/acek-skills#readme",
|
|
30
31
|
"bugs": {
|
|
31
32
|
"url": "https://github.com/AcekBecek16/acek-sf-skills/issues"
|
|
32
33
|
}
|