acek-skills 1.2.0 → 1.4.0
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 +75 -10
- package/agents/sf-admin.md +18 -0
- package/agents/sf-ba.md +16 -0
- package/agents/sf-data-migration.md +18 -0
- package/agents/sf-dev.md +18 -0
- package/agents/sf-devops.md +18 -0
- package/agents/sf-ideation.md +18 -0
- package/agents/sf-security-review.md +19 -0
- package/agents/sf-testing.md +18 -0
- package/bin/cli.js +66 -1
- package/package.json +3 -2
- package/skills/sf-admin/SKILL.md +15 -1
- package/skills/sf-architect/SKILL.md +123 -48
- package/skills/sf-ba/SKILL.md +19 -3
- package/skills/sf-data-migration/SKILL.md +15 -1
- package/skills/sf-dev/SKILL.md +36 -34
- package/skills/sf-devops/SKILL.md +17 -1
- package/skills/sf-ideation/SKILL.md +28 -9
- package/skills/sf-security-review/SKILL.md +67 -1
- package/skills/sf-testing/SKILL.md +129 -6
package/README.md
CHANGED
|
@@ -23,6 +23,7 @@ Admin • Development • Testing • DevOps • Security Review • Data Migrat
|
|
|
23
23
|
- [Non-interactive install](#non-interactive-install)
|
|
24
24
|
- [Org alias templating](#org-alias-templating)
|
|
25
25
|
- [Install targets](#install-targets)
|
|
26
|
+
- [Sub-agents](#sub-agents)
|
|
26
27
|
- [Skills reference](#skills-reference)
|
|
27
28
|
- [CLI reference](#cli-reference)
|
|
28
29
|
- [Project structure](#project-structure)
|
|
@@ -83,7 +84,11 @@ Running `install` with no arguments walks you through three prompts:
|
|
|
83
84
|
converted into that tool's native rule format.
|
|
84
85
|
3. **Org aliases** — only asked if one of the selected skills references them (currently
|
|
85
86
|
`sf-devops` and `sf-data-migration`). Leave blank to fill in later by hand.
|
|
86
|
-
4. **
|
|
87
|
+
4. **Sub-agents** — any selected skill that has a matching sub-agent (same technical id, e.g.
|
|
88
|
+
`sf-dev`) installs it automatically to `.claude/agents/` on Claude Code targets — no separate
|
|
89
|
+
prompt. See [Sub-agents](#sub-agents). Not installed for Cursor/Windsurf/Copilot targets, which
|
|
90
|
+
have no subagent concept.
|
|
91
|
+
5. **Commands** — if `sf-architect` is selected and at least one Claude Code target is chosen, its
|
|
87
92
|
companion `/sf-init` slash command installs automatically to `.claude/commands/` — no separate
|
|
88
93
|
prompt. Not installed for Cursor/Windsurf/Copilot targets, which have no slash-command concept.
|
|
89
94
|
|
|
@@ -139,6 +144,36 @@ Cursor and Windsurf approximate it with their own rule-matching; Copilot's custo
|
|
|
139
144
|
apply more broadly since it has no equivalent trigger mechanism. Check each tool's docs if the
|
|
140
145
|
matching behavior matters for your workflow.
|
|
141
146
|
|
|
147
|
+
## Sub-agents
|
|
148
|
+
|
|
149
|
+
`sf-architect` acts as Salesforce's plan-mode orchestrator: once a plan is approved, it dispatches
|
|
150
|
+
each task to the owner skill's own sub-agent (Claude Code's native `Agent` tool, `subagent_type:
|
|
151
|
+
sf-[owner skill]`) instead of following that skill's conventions itself. Every owner skill has a
|
|
152
|
+
matching sub-agent under `agents/`, same technical id as its skill folder, each with a **fixed**
|
|
153
|
+
narrated persona:
|
|
154
|
+
|
|
155
|
+
| Owner skill (`subagent_type`) | Persona |
|
|
156
|
+
| ------------------------------ | --------------- |
|
|
157
|
+
| `sf-admin` | Eva Lovia |
|
|
158
|
+
| `sf-dev` | Comatozze |
|
|
159
|
+
| `sf-testing` | Riley Reid |
|
|
160
|
+
| `sf-devops` | Channel Preston |
|
|
161
|
+
| `sf-security-review` | Madison Ivy |
|
|
162
|
+
| `sf-data-migration` | Britney Amber |
|
|
163
|
+
| `sf-ba` | Isla Summer |
|
|
164
|
+
| `sf-ideation` | Asa Akira |
|
|
165
|
+
|
|
166
|
+
`sf-architect` itself narrates as **Ashley Fires** and is never dispatched as a sub-agent of
|
|
167
|
+
itself — it only ever assigns work out. Personas are narration only (a response signature line);
|
|
168
|
+
they never appear inside generated file content (PRDs, code, commit messages) except as a tracking
|
|
169
|
+
label in the Architecture Plan's Execution Log.
|
|
170
|
+
|
|
171
|
+
Installing a skill that has a matching sub-agent installs both automatically, to
|
|
172
|
+
`.claude/agents/<name>.md` — Claude Code targets only, since Cursor/Windsurf/Copilot have no
|
|
173
|
+
subagent equivalent (same rule as `/sf-init`, see [Install targets](#install-targets)). A skill's
|
|
174
|
+
sub-agent works standalone too — dispatch it directly with the `Agent` tool — but it's designed to
|
|
175
|
+
be driven by `sf-architect`'s plan-mode flow.
|
|
176
|
+
|
|
142
177
|
## Skills reference
|
|
143
178
|
|
|
144
179
|
<details>
|
|
@@ -148,8 +183,10 @@ Salesforce's plan mode. Gates all work behind an approved Architecture Plan befo
|
|
|
148
183
|
metadata is touched: runs Discovery (project scan + choice-based clarifying questions, never open
|
|
149
184
|
text), proposes Decisions with trade-offs for data model / automation layer / integration pattern
|
|
150
185
|
/ security model / Permission Set strategy, then breaks approved work into tasks dispatched to the
|
|
151
|
-
right skill (`sf-admin`, `sf-dev`, `sf-testing`, `sf-devops`,
|
|
152
|
-
`sf-data-migration`
|
|
186
|
+
right owner skill's **sub-agent** (`sf-admin`, `sf-dev`, `sf-testing`, `sf-devops`,
|
|
187
|
+
`sf-security-review`, `sf-data-migration` — see [Sub-agents](#sub-agents)) — always including a
|
|
188
|
+
`sf-security-review` task when the plan touches a PII-bearing object/field, an integration, or a
|
|
189
|
+
sharing/OWD change. Plans are saved to `instructions/architecture/` and are resumable across
|
|
153
190
|
sessions without re-scanning the project or re-reading chat history. Complements — does not
|
|
154
191
|
replace — `sf-ba` (PRDs) and `sf-ideation` (open-ended brainstorming), and can consume either as
|
|
155
192
|
input.
|
|
@@ -177,7 +214,10 @@ data management (import/export/data loader) — anything declarative, no code in
|
|
|
177
214
|
|
|
178
215
|
Writes PRDs, user stories, feature specs, and functional requirements — structured Markdown docs
|
|
179
216
|
intended to hand off to an admin or developer. Triggers on "write a PRD", "document requirements",
|
|
180
|
-
"write user stories", or when a business problem needs to become executable documentation.
|
|
217
|
+
"write user stories", or when a business problem needs to become executable documentation. Its
|
|
218
|
+
Admin Spec / Dev Spec templates are for work that will **not** go through `sf-architect`; for
|
|
219
|
+
open-ended brainstorming on a specific existing component instead of net-new requirements, it
|
|
220
|
+
hands off to `sf-ideation`.
|
|
181
221
|
|
|
182
222
|
</details>
|
|
183
223
|
|
|
@@ -230,8 +270,9 @@ opportunities.
|
|
|
230
270
|
|
|
231
271
|
CRUD/FLS checks, sharing model review, `with sharing` enforcement, SOQL injection, XSS in LWC,
|
|
232
272
|
hardcoded credential detection, and a production sign-off checklist. Also covers Shield,
|
|
233
|
-
encryption, audit trail,
|
|
234
|
-
|
|
273
|
+
encryption, audit trail, a dedicated PII & Data Privacy section — field classification, sandbox
|
|
274
|
+
data masking, and UU PDP-aware review practices — plus Guest User/Experience Cloud access review
|
|
275
|
+
and Connected App/External Client App (OAuth) review checklists.
|
|
235
276
|
|
|
236
277
|
</details>
|
|
237
278
|
|
|
@@ -239,8 +280,9 @@ sandbox data masking, and UU PDP-aware review practices.
|
|
|
239
280
|
<summary><strong>sf-testing</strong> — Apex test strategy</summary>
|
|
240
281
|
|
|
241
282
|
Test classes, `TestDataFactory` patterns, mocking HTTP callouts and platform events, test
|
|
242
|
-
assertions, coverage reports,
|
|
243
|
-
floor
|
|
283
|
+
assertions, coverage reports, debugging org-only test failures, and LWC Jest unit tests
|
|
284
|
+
(`@salesforce/sfdx-lwc-jest`). Enforces the 85% Apex coverage floor, `AuraHandledException`
|
|
285
|
+
assertion conventions, and a 3-scenario minimum (happy/empty/interaction) for every LWC component.
|
|
244
286
|
|
|
245
287
|
</details>
|
|
246
288
|
|
|
@@ -253,9 +295,13 @@ lives in its `SKILL.md`.
|
|
|
253
295
|
acek-skills install Interactive: pick skills, target IDE(s)/tool(s), and org aliases
|
|
254
296
|
acek-skills install --all Install all skills to Claude Code (project), no prompts
|
|
255
297
|
acek-skills install <name> Install a single skill to Claude Code (project), no prompts
|
|
256
|
-
acek-skills list List available skills and
|
|
298
|
+
acek-skills list List available skills, commands, and sub-agents
|
|
257
299
|
```
|
|
258
300
|
|
|
301
|
+
Any installed skill with a matching **sub-agent** (`.claude/agents/<name>.md`) installs it
|
|
302
|
+
automatically alongside it — Claude Code targets only, since Cursor/Windsurf/Copilot have no
|
|
303
|
+
subagent equivalent. See [Sub-agents](#sub-agents).
|
|
304
|
+
|
|
259
305
|
Installing `sf-architect` also installs its companion **`/sf-init`** slash command — Claude Code
|
|
260
306
|
targets only (`.claude/commands/`), since Cursor/Windsurf/Copilot have no slash-command
|
|
261
307
|
equivalent. Run `/sf-init` once per project after installing to bootstrap `architecture.md`;
|
|
@@ -276,6 +322,15 @@ skills/
|
|
|
276
322
|
sf-ideation/SKILL.md
|
|
277
323
|
sf-security-review/SKILL.md
|
|
278
324
|
sf-testing/SKILL.md
|
|
325
|
+
agents/
|
|
326
|
+
sf-admin.md sub-agent dispatched by sf-architect (subagent_type: sf-admin) — Claude Code only
|
|
327
|
+
sf-ba.md
|
|
328
|
+
sf-data-migration.md
|
|
329
|
+
sf-dev.md
|
|
330
|
+
sf-devops.md
|
|
331
|
+
sf-ideation.md
|
|
332
|
+
sf-security-review.md
|
|
333
|
+
sf-testing.md
|
|
279
334
|
commands/
|
|
280
335
|
sf-init.md /sf-init slash command — companion to sf-architect, Claude Code only
|
|
281
336
|
bin/
|
|
@@ -299,6 +354,10 @@ bin/
|
|
|
299
354
|
2. No CLI changes needed — `list` and `install` pick up any folder under `skills/` automatically.
|
|
300
355
|
3. If the skill needs org-specific values, use the `{{PROD_ORG_ALIAS}}` / `{{DEV_ORG_ALIAS}}`
|
|
301
356
|
placeholders (see [Org alias templating](#org-alias-templating)) rather than hardcoding one.
|
|
357
|
+
4. Optional: to make the skill dispatchable as one of `sf-architect`'s sub-agents, add
|
|
358
|
+
`agents/<name>.md` with the same technical id as the skill folder — see [Sub-agents](#sub-agents)
|
|
359
|
+
for the frontmatter shape and persona convention. Also no CLI changes needed; `install` matches
|
|
360
|
+
agent files to skill names by filename.
|
|
302
361
|
|
|
303
362
|
## FAQ
|
|
304
363
|
|
|
@@ -310,9 +369,15 @@ responds, and doesn't touch any org, sandbox, or production data on its own.
|
|
|
310
369
|
Yes — deselect any skill in the interactive wizard, or use `install <name>` for a single one.
|
|
311
370
|
|
|
312
371
|
**Can I re-run install to update after a new version is published?**
|
|
313
|
-
Yes, `npx` always resolves the latest version unless you pin one (`npx acek-skills@1.
|
|
372
|
+
Yes, `npx` always resolves the latest version unless you pin one (`npx acek-skills@1.4.0 install`).
|
|
314
373
|
Re-running overwrites previously installed files for the skills/targets you select.
|
|
315
374
|
|
|
375
|
+
**What are the sub-agents in `.claude/agents/`?**
|
|
376
|
+
Dispatch targets for `sf-architect`'s plan-mode execution — one per owner skill, invoked via
|
|
377
|
+
Claude Code's `Agent` tool (`subagent_type: sf-[owner skill]`) instead of `sf-architect` following
|
|
378
|
+
that skill's conventions itself. See [Sub-agents](#sub-agents). Only installed for Claude Code
|
|
379
|
+
targets; Cursor/Windsurf/Copilot have no subagent concept.
|
|
380
|
+
|
|
316
381
|
**Why do only Claude Code skills auto-trigger?**
|
|
317
382
|
Claude Code has a native skill system that matches tasks against each skill's `description`
|
|
318
383
|
frontmatter. Cursor, Windsurf, and Copilot don't expose the same mechanism, so their versions are
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sf-admin
|
|
3
|
+
description: >
|
|
4
|
+
Salesforce administrator sub-agent — dispatched by sf-architect for tasks whose Owner Skill is
|
|
5
|
+
`sf-admin`. Handles declarative configuration: custom objects/fields, page layouts, record
|
|
6
|
+
types, profiles, permission sets, sharing rules, validation rules, and flows.
|
|
7
|
+
tools: Read, Write, Edit, Grep, Glob, Bash
|
|
8
|
+
model: inherit
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Open your response with the persona signature line defined in `sf-admin`'s Persona section, then
|
|
12
|
+
load and strictly follow the `sf-admin` skill for every convention, checklist, and pattern in
|
|
13
|
+
this task — do not improvise anything that skill already defines.
|
|
14
|
+
|
|
15
|
+
The dispatch prompt supplies task-specific details (task ID, description, exact files in
|
|
16
|
+
`Touches`, and any relevant Architecture Plan decisions). Report back a concise summary of what
|
|
17
|
+
changed and where. Do not write to the plan file — only the orchestrator writes status/log
|
|
18
|
+
updates.
|
package/agents/sf-ba.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sf-ba
|
|
3
|
+
description: >
|
|
4
|
+
Salesforce business analyst sub-agent — dispatched by sf-architect for tasks whose Owner Skill
|
|
5
|
+
is `sf-ba`. Handles PRDs, user stories, feature specs, and functional requirement documents.
|
|
6
|
+
tools: Read, Write, Edit, Grep, Glob
|
|
7
|
+
model: inherit
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Open your response with the persona signature line defined in `sf-ba`'s Persona section, then
|
|
11
|
+
load and strictly follow the `sf-ba` skill for every convention and document structure it
|
|
12
|
+
defines — do not improvise anything that skill already defines.
|
|
13
|
+
|
|
14
|
+
The dispatch prompt supplies task-specific details (task ID, description, and any relevant
|
|
15
|
+
Architecture Plan context). Report back a concise summary of what document was written and
|
|
16
|
+
where. Do not write to the plan file — only the orchestrator writes status/log updates.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sf-data-migration
|
|
3
|
+
description: >
|
|
4
|
+
Salesforce data migration sub-agent — dispatched by sf-architect for tasks whose Owner Skill is
|
|
5
|
+
`sf-data-migration`. Handles bulk import/export strategy, upsert scripts with External IDs, and
|
|
6
|
+
data cleansing.
|
|
7
|
+
tools: Read, Write, Edit, Grep, Glob, Bash
|
|
8
|
+
model: inherit
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Open your response with the persona signature line defined in `sf-data-migration`'s Persona
|
|
12
|
+
section, then load and strictly follow the `sf-data-migration` skill for every convention,
|
|
13
|
+
checklist, and pattern in this task — do not improvise anything that skill already defines.
|
|
14
|
+
|
|
15
|
+
The dispatch prompt supplies task-specific details (task ID, description, exact files in
|
|
16
|
+
`Touches`, and any relevant Architecture Plan decisions, including resolved org aliases). Report
|
|
17
|
+
back a concise summary of what changed and where. Do not write to the plan file — only the
|
|
18
|
+
orchestrator writes status/log updates.
|
package/agents/sf-dev.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sf-dev
|
|
3
|
+
description: >
|
|
4
|
+
Salesforce developer sub-agent — dispatched by sf-architect for tasks whose Owner Skill is
|
|
5
|
+
`sf-dev`. Handles custom development: Apex classes/triggers/batch jobs, LWC/Aura components,
|
|
6
|
+
SOQL, and integration/callout code.
|
|
7
|
+
tools: Read, Write, Edit, Grep, Glob, Bash
|
|
8
|
+
model: inherit
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Open your response with the persona signature line defined in `sf-dev`'s Persona section, then
|
|
12
|
+
load and strictly follow the `sf-dev` skill for every convention, checklist, and pattern in this
|
|
13
|
+
task — do not improvise anything that skill already defines.
|
|
14
|
+
|
|
15
|
+
The dispatch prompt supplies task-specific details (task ID, description, exact files in
|
|
16
|
+
`Touches`, and any relevant Architecture Plan decisions). Report back a concise summary of what
|
|
17
|
+
changed and where. Do not write to the plan file — only the orchestrator writes status/log
|
|
18
|
+
updates.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sf-devops
|
|
3
|
+
description: >
|
|
4
|
+
Salesforce DevOps sub-agent — dispatched by sf-architect for tasks whose Owner Skill is
|
|
5
|
+
`sf-devops`. Handles deployment manifests, dry-run validation, Change Requests, and
|
|
6
|
+
sandbox-to-production deploys via SF CLI.
|
|
7
|
+
tools: Read, Write, Grep, Glob, Bash
|
|
8
|
+
model: inherit
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Open your response with the persona signature line defined in `sf-devops`'s Persona section, then
|
|
12
|
+
load and strictly follow the `sf-devops` skill for every convention, checklist, and pattern in
|
|
13
|
+
this task — do not improvise anything that skill already defines.
|
|
14
|
+
|
|
15
|
+
The dispatch prompt supplies task-specific details (task ID, description, exact files in
|
|
16
|
+
`Touches`, and any relevant Architecture Plan decisions, including resolved org aliases). Report
|
|
17
|
+
back a concise summary of what changed and where. Do not write to the plan file — only the
|
|
18
|
+
orchestrator writes status/log updates.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sf-ideation
|
|
3
|
+
description: >
|
|
4
|
+
Salesforce ideation sub-agent — dispatched by sf-architect for tasks whose Owner Skill is
|
|
5
|
+
`sf-ideation`. Generates anchored enhancement ideas for an existing Apex class, LWC component,
|
|
6
|
+
or closed/approved PRD.
|
|
7
|
+
tools: Read, Grep, Glob, Write
|
|
8
|
+
model: inherit
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Open your response with the persona signature line defined in `sf-ideation`'s Persona section,
|
|
12
|
+
then load and strictly follow the `sf-ideation` skill's anchor requirement and idea-generation
|
|
13
|
+
pattern — do not improvise anything that skill already defines.
|
|
14
|
+
|
|
15
|
+
The dispatch prompt supplies task-specific details (task ID, description, and the anchor
|
|
16
|
+
file/component/PRD to ground ideas in). Report back a concise summary of the ideas produced and
|
|
17
|
+
where they were written. Do not write to the plan file — only the orchestrator writes status/log
|
|
18
|
+
updates.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sf-security-review
|
|
3
|
+
description: >
|
|
4
|
+
Salesforce security review sub-agent — dispatched by sf-architect for tasks whose Owner Skill
|
|
5
|
+
is `sf-security-review`. Handles CRUD/FLS audits, sharing model review, PII/data-privacy
|
|
6
|
+
checks, and production sign-off.
|
|
7
|
+
tools: Read, Grep, Glob
|
|
8
|
+
model: inherit
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Open your response with the persona signature line defined in `sf-security-review`'s Persona
|
|
12
|
+
section, then load and strictly follow the `sf-security-review` skill for every convention,
|
|
13
|
+
checklist, and pattern in this task — do not improvise anything that skill already defines.
|
|
14
|
+
|
|
15
|
+
This agent is read-only by design — it audits and reports, it never edits code or metadata
|
|
16
|
+
itself. The dispatch prompt supplies task-specific details (task ID, description, exact
|
|
17
|
+
files/components to review, and any relevant Architecture Plan decisions). Report back findings
|
|
18
|
+
and a sign-off status. Do not write to the plan file — only the orchestrator writes status/log
|
|
19
|
+
updates.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sf-testing
|
|
3
|
+
description: >
|
|
4
|
+
Salesforce testing sub-agent — dispatched by sf-architect for tasks whose Owner Skill is
|
|
5
|
+
`sf-testing`. Handles Apex test classes, TestDataFactory, callout/platform-event mocking, and
|
|
6
|
+
LWC Jest unit tests.
|
|
7
|
+
tools: Read, Write, Edit, Grep, Glob, Bash
|
|
8
|
+
model: inherit
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Open your response with the persona signature line defined in `sf-testing`'s Persona section,
|
|
12
|
+
then load and strictly follow the `sf-testing` skill for every convention, checklist, and pattern
|
|
13
|
+
in this task — do not improvise anything that skill already defines.
|
|
14
|
+
|
|
15
|
+
The dispatch prompt supplies task-specific details (task ID, description, exact files in
|
|
16
|
+
`Touches`, and any relevant Architecture Plan decisions). Report back a concise summary of what
|
|
17
|
+
changed and where. Do not write to the plan file — only the orchestrator writes status/log
|
|
18
|
+
updates.
|
package/bin/cli.js
CHANGED
|
@@ -10,6 +10,7 @@ const target = args[1]; // optional: specific skill name, or "--all"
|
|
|
10
10
|
|
|
11
11
|
const SKILLS_SRC = path.join(__dirname, '../skills');
|
|
12
12
|
const COMMANDS_SRC = path.join(__dirname, '../commands');
|
|
13
|
+
const AGENTS_SRC = path.join(__dirname, '../agents');
|
|
13
14
|
|
|
14
15
|
function printBanner() {
|
|
15
16
|
console.log(`\x1b[36m
|
|
@@ -28,6 +29,7 @@ const TARGETS = {
|
|
|
28
29
|
label: 'Claude Code — project (./.claude/skills)',
|
|
29
30
|
dir: (cwd) => path.join(cwd, '.claude/skills'),
|
|
30
31
|
commandsDir: (cwd) => path.join(cwd, '.claude/commands'),
|
|
32
|
+
agentDir: (cwd) => path.join(cwd, '.claude/agents'),
|
|
31
33
|
format: 'claude',
|
|
32
34
|
selected: true,
|
|
33
35
|
},
|
|
@@ -35,6 +37,7 @@ const TARGETS = {
|
|
|
35
37
|
label: 'Claude Code — global (~/.claude/skills)',
|
|
36
38
|
dir: () => path.join(os.homedir(), '.claude/skills'),
|
|
37
39
|
commandsDir: () => path.join(os.homedir(), '.claude/commands'),
|
|
40
|
+
agentDir: () => path.join(os.homedir(), '.claude/agents'),
|
|
38
41
|
format: 'claude',
|
|
39
42
|
selected: false,
|
|
40
43
|
},
|
|
@@ -122,6 +125,30 @@ function installCommandToTarget(commandName, targetKey, cwd, aliases = {}) {
|
|
|
122
125
|
fs.writeFileSync(path.join(destDir, `${commandName}.md`), content);
|
|
123
126
|
}
|
|
124
127
|
|
|
128
|
+
// Sub-agents (.claude/agents/*.md) are dispatched by sf-architect via the
|
|
129
|
+
// Agent tool (subagent_type: sf-<skill>) — one per owner skill, same
|
|
130
|
+
// technical id as the matching skill folder. Like commands, they're a
|
|
131
|
+
// Claude-Code-only concept: Cursor/Windsurf/Copilot have no subagent
|
|
132
|
+
// equivalent, so they only ever install to 'claude' format targets.
|
|
133
|
+
function listAgents() {
|
|
134
|
+
if (!fs.existsSync(AGENTS_SRC)) return [];
|
|
135
|
+
return fs
|
|
136
|
+
.readdirSync(AGENTS_SRC, { withFileTypes: true })
|
|
137
|
+
.filter((e) => e.isFile() && e.name.endsWith('.md'))
|
|
138
|
+
.map((e) => e.name.replace(/\.md$/, ''));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function installAgentToTarget(agentName, targetKey, cwd) {
|
|
142
|
+
const targetDef = TARGETS[targetKey];
|
|
143
|
+
if (targetDef.format !== 'claude' || !targetDef.agentDir) return;
|
|
144
|
+
const destDir = targetDef.agentDir(cwd);
|
|
145
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
146
|
+
fs.copyFileSync(
|
|
147
|
+
path.join(AGENTS_SRC, `${agentName}.md`),
|
|
148
|
+
path.join(destDir, `${agentName}.md`),
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
125
152
|
// Pulls `name`/`description` out of the SKILL.md frontmatter (YAML folded
|
|
126
153
|
// scalar style: "description: >") so non-Claude formats can reuse them.
|
|
127
154
|
function parseSkill(skillName) {
|
|
@@ -299,6 +326,7 @@ async function runInteractiveInstall() {
|
|
|
299
326
|
);
|
|
300
327
|
}
|
|
301
328
|
|
|
329
|
+
const availableAgents = listAgents();
|
|
302
330
|
const cwd = process.cwd();
|
|
303
331
|
for (const targetKey of targets) {
|
|
304
332
|
for (const skillName of skills) {
|
|
@@ -308,6 +336,16 @@ async function runInteractiveInstall() {
|
|
|
308
336
|
`✅ ${skills.length} skill(s) installed to ${TARGETS[targetKey].label}`,
|
|
309
337
|
);
|
|
310
338
|
|
|
339
|
+
const agentsToInstall = skills.filter((s) => availableAgents.includes(s));
|
|
340
|
+
if (agentsToInstall.length > 0 && TARGETS[targetKey].agentDir) {
|
|
341
|
+
for (const agentName of agentsToInstall) {
|
|
342
|
+
installAgentToTarget(agentName, targetKey, cwd);
|
|
343
|
+
}
|
|
344
|
+
console.log(
|
|
345
|
+
`✅ ${agentsToInstall.length} sub-agent(s) installed to ${TARGETS[targetKey].label}`,
|
|
346
|
+
);
|
|
347
|
+
}
|
|
348
|
+
|
|
311
349
|
if (skills.includes('sf-architect') && TARGETS[targetKey].commandsDir) {
|
|
312
350
|
installCommandToTarget('sf-init', targetKey, cwd, aliases);
|
|
313
351
|
console.log(
|
|
@@ -340,6 +378,17 @@ async function main() {
|
|
|
340
378
|
console.log(
|
|
341
379
|
`✅ All ${available.length} skill(s) installed to ${TARGETS['claude-project'].label}`,
|
|
342
380
|
);
|
|
381
|
+
const agentsToInstall = listAgents().filter((a) =>
|
|
382
|
+
available.includes(a),
|
|
383
|
+
);
|
|
384
|
+
for (const agentName of agentsToInstall) {
|
|
385
|
+
installAgentToTarget(agentName, 'claude-project', process.cwd());
|
|
386
|
+
}
|
|
387
|
+
if (agentsToInstall.length > 0) {
|
|
388
|
+
console.log(
|
|
389
|
+
`✅ ${agentsToInstall.length} sub-agent(s) installed to ${TARGETS['claude-project'].label}`,
|
|
390
|
+
);
|
|
391
|
+
}
|
|
343
392
|
if (available.includes('sf-architect')) {
|
|
344
393
|
installCommandToTarget(
|
|
345
394
|
'sf-init',
|
|
@@ -370,6 +419,12 @@ async function main() {
|
|
|
370
419
|
console.log(
|
|
371
420
|
`✅ Installed skill: ${target} → ${TARGETS['claude-project'].label}`,
|
|
372
421
|
);
|
|
422
|
+
if (listAgents().includes(target)) {
|
|
423
|
+
installAgentToTarget(target, 'claude-project', process.cwd());
|
|
424
|
+
console.log(
|
|
425
|
+
`✅ Installed sub-agent: ${target} → ${TARGETS['claude-project'].label}`,
|
|
426
|
+
);
|
|
427
|
+
}
|
|
373
428
|
if (target === 'sf-architect') {
|
|
374
429
|
installCommandToTarget(
|
|
375
430
|
'sf-init',
|
|
@@ -397,6 +452,11 @@ async function main() {
|
|
|
397
452
|
console.log('\n⚡ Available commands:');
|
|
398
453
|
commands.forEach((c) => console.log(` - /${c}`));
|
|
399
454
|
}
|
|
455
|
+
const agents = listAgents();
|
|
456
|
+
if (agents.length > 0) {
|
|
457
|
+
console.log('\n🤖 Available sub-agents (dispatched by sf-architect):');
|
|
458
|
+
agents.forEach((a) => console.log(` - ${a}`));
|
|
459
|
+
}
|
|
400
460
|
} else {
|
|
401
461
|
console.log(`
|
|
402
462
|
Usage:
|
|
@@ -404,7 +464,12 @@ Usage:
|
|
|
404
464
|
acek-skills install --all Install all skills to Claude Code (project), no prompts
|
|
405
465
|
acek-skills install <name> Install a single skill to Claude Code (project), no prompts
|
|
406
466
|
|
|
407
|
-
acek-skills list List available skills and
|
|
467
|
+
acek-skills list List available skills, commands, and sub-agents
|
|
468
|
+
|
|
469
|
+
Each installed skill that has a matching sub-agent (same technical id, e.g. sf-dev) also installs
|
|
470
|
+
that sub-agent to .claude/agents/ (Claude Code targets only — Cursor/Windsurf/Copilot have no
|
|
471
|
+
subagent equivalent). sf-architect dispatches these during Phase 4 execution instead of following
|
|
472
|
+
their conventions itself.
|
|
408
473
|
|
|
409
474
|
Installing sf-architect also installs its companion /sf-init slash command (Claude Code targets
|
|
410
475
|
only — Cursor/Windsurf/Copilot have no slash-command equivalent). Run /sf-init once per project
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "acek-skills",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
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"
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
"files": [
|
|
9
9
|
"bin/",
|
|
10
10
|
"skills/",
|
|
11
|
-
"commands"
|
|
11
|
+
"commands",
|
|
12
|
+
"agents"
|
|
12
13
|
],
|
|
13
14
|
"keywords": [
|
|
14
15
|
"claude",
|
package/skills/sf-admin/SKILL.md
CHANGED
|
@@ -12,9 +12,23 @@ description: >
|
|
|
12
12
|
|
|
13
13
|
# Salesforce Administrator Skill
|
|
14
14
|
|
|
15
|
+
## Persona
|
|
16
|
+
|
|
17
|
+
When this skill runs — standalone or dispatched as a sub-agent — open the response with:
|
|
18
|
+
|
|
19
|
+
`— Eva Lovia, sf-admin`
|
|
20
|
+
|
|
21
|
+
This is narration only. Never include this name inside generated file content: not in PRDs, CRs,
|
|
22
|
+
metadata, code comments, or commit messages. The one existing exception is the Architecture Plan's
|
|
23
|
+
Execution Log (owned by `sf-architect`), which may reference it as a tracking label when this
|
|
24
|
+
skill is dispatched as a sub-agent task.
|
|
25
|
+
|
|
15
26
|
## Environment Context
|
|
16
27
|
|
|
17
|
-
- API Version: **
|
|
28
|
+
- API Version: **not hardcoded** — new files inherit whatever `sourceApiVersion` is set in the
|
|
29
|
+
project's `sfdx-project.json` when scaffolded via SF CLI. When touching an **existing**
|
|
30
|
+
class/component/metadata item, check its `apiVersion`: below **62.0** → bump to **67.0** as part
|
|
31
|
+
of the change; 62.0+ → leave as-is unless the task needs 67.0+ behavior specifically.
|
|
18
32
|
- Org Type: Enterprise (single org: sandbox + production)
|
|
19
33
|
- Tooling: **SF CLI** for metadata retrieval; most admin tasks done declaratively in Setup UI
|
|
20
34
|
- Any metadata changes intended for production must go through the DevOps deployment process
|