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.
Files changed (3) hide show
  1. package/README.md +9 -4
  2. package/bin/cli.js +37 -5
  3. 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/user)
69
- ◯ Claude Code — global (~/.claude/skills/user)
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/user/<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/user/<skill>/SKILL.md` | Same as above, applies across every project on your machine |
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/user)',
17
- dir: (cwd) => path.join(cwd, '.claude/skills/user'),
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/user)',
23
- dir: () => path.join(os.homedir(), '.claude/skills/user'),
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
- function copySkillDir(src, dest, aliases) {
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.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
  }