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 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. **Commands** — if `sf-architect` is selected and at least one Claude Code target is chosen, its
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`, `sf-security-review`,
152
- `sf-data-migration`). Plans are saved to `instructions/architecture/` and are resumable across
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, and a dedicated PII & Data Privacy section — field classification,
234
- sandbox data masking, and UU PDP-aware review practices.
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, and debugging org-only test failures. Enforces the 85% coverage
243
- floor and `AuraHandledException` assertion conventions.
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 commands
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.2.0 install`).
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.
@@ -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.
@@ -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 commands
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.2.0",
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",
@@ -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: **67.0** (Summer '26)
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