acek-skills 1.0.3 → 1.2.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/commands/sf-init.md +165 -0
- package/package.json +3 -2
- package/skills/sf-architect/SKILL.md +74 -25
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Bootstrap or refresh the project's architecture.md baseline — org aliases, tech stack, data model, integrations, and Permission Set inventory that sf-architect reads before planning any feature.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /sf-init — Architecture Baseline Bootstrap
|
|
6
|
+
|
|
7
|
+
This command creates (or refreshes) `architecture.md` at the project root. It is a one-time setup
|
|
8
|
+
step per project — `sf-architect` reads this file on every plan afterward instead of re-scanning
|
|
9
|
+
the whole project from scratch each time.
|
|
10
|
+
|
|
11
|
+
**This command follows `sf-architect`'s conventions exactly:** scan before asking, never fabricate
|
|
12
|
+
a name that wasn't found, every clarification is a choice with an "Other" option — never a bare
|
|
13
|
+
open text prompt.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Step 1 — Check for an existing baseline
|
|
18
|
+
|
|
19
|
+
Look for `architecture.md` at the project root.
|
|
20
|
+
|
|
21
|
+
- **Not found** → run the [Bootstrap Flow](#bootstrap-flow) below.
|
|
22
|
+
- **Found** → run the [Refresh Flow](#refresh-flow) below. Do not blindly overwrite or blindly
|
|
23
|
+
merge — always diff and confirm first.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Bootstrap Flow
|
|
28
|
+
|
|
29
|
+
### 1. Scan the project
|
|
30
|
+
|
|
31
|
+
Before asking anything, gather what can be found directly:
|
|
32
|
+
|
|
33
|
+
- **Data model** — custom objects under `force-app/main/default/objects/`, their purpose (from
|
|
34
|
+
field/label context, not guessed)
|
|
35
|
+
- **Components** — LWC folders and Apex classes/triggers present
|
|
36
|
+
- **LWC styling convention in use** — check existing component CSS: custom `:host` brand-token
|
|
37
|
+
block (`sf-dev` standard) vs `--slds-g-*` global hooks (`shaiden` convention) vs none yet
|
|
38
|
+
- **Automation layer balance** — rough split of Flow-triggered vs Apex-triggered automation found
|
|
39
|
+
- **Integrations** — Named Credentials, external callouts referenced in Apex
|
|
40
|
+
- **Permission Sets / Permission Set Groups** — existing inventory
|
|
41
|
+
- **API version** — from `sfdx-project.json` or existing metadata
|
|
42
|
+
- **Org aliases** — run `sf org list` to see what's actually configured locally
|
|
43
|
+
|
|
44
|
+
### 2. Ask only what can't be scanned
|
|
45
|
+
|
|
46
|
+
Batch these into one round-trip, always as choices with an "Other" option:
|
|
47
|
+
|
|
48
|
+
- Which scanned org is **Production** vs **Sandbox/Dev**? (options = orgs found by `sf org list`)
|
|
49
|
+
- Is there an established **data classification / retention / masking policy** already in place?
|
|
50
|
+
(options: "Yes — describe it", "No, not yet documented", "Partially — describe what exists")
|
|
51
|
+
- Any **org-specific constraints** that always apply (naming conventions, governance rules,
|
|
52
|
+
deployment windows)? (options: "Yes — describe", "None beyond standard practice")
|
|
53
|
+
|
|
54
|
+
If `sf org list` returns nothing or the CLI isn't available, ask for aliases directly via the
|
|
55
|
+
choice format instead — never require typing from memory when a scan could have answered it.
|
|
56
|
+
|
|
57
|
+
### 3. Write architecture.md
|
|
58
|
+
|
|
59
|
+
Compile everything into `architecture.md` at the project root using the
|
|
60
|
+
[Baseline Template](#baseline-template) below.
|
|
61
|
+
|
|
62
|
+
### 4. Confirm
|
|
63
|
+
|
|
64
|
+
Tell the user the file was created and that `sf-architect` will now read it automatically on
|
|
65
|
+
future plans instead of re-scanning the whole project each time.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Refresh Flow
|
|
70
|
+
|
|
71
|
+
### 1. Re-scan the project
|
|
72
|
+
|
|
73
|
+
Same scan as [Bootstrap Step 1](#1-scan-the-project), fresh.
|
|
74
|
+
|
|
75
|
+
### 2. Diff against the existing file
|
|
76
|
+
|
|
77
|
+
Compare the fresh scan to what's currently in `architecture.md`. Categorize:
|
|
78
|
+
|
|
79
|
+
- **Added** — new objects/components/Permission Sets/integrations found
|
|
80
|
+
- **Removed** — previously listed items no longer found
|
|
81
|
+
- **Changed** — e.g. org alias no longer resolves, API version bumped
|
|
82
|
+
|
|
83
|
+
Never touch manually-maintained sections (**Data Privacy Baseline** notes, **Org-Specific
|
|
84
|
+
Constraints**) as part of an automatic refresh — those are only updated if the user explicitly
|
|
85
|
+
asks to revise them.
|
|
86
|
+
|
|
87
|
+
### 3. Present the diff and confirm before writing
|
|
88
|
+
|
|
89
|
+
Show what changed as a choice question:
|
|
90
|
+
|
|
91
|
+
- **Update all** — apply every detected change to the auto-scanned sections
|
|
92
|
+
- **Review each change** — walk through each addition/removal one at a time for confirmation
|
|
93
|
+
- **Cancel** — leave `architecture.md` untouched
|
|
94
|
+
|
|
95
|
+
Do not write anything until the user picks one.
|
|
96
|
+
|
|
97
|
+
### 4. Write and log
|
|
98
|
+
|
|
99
|
+
Apply the confirmed changes, update the `Last Scanned` timestamp, and append one line to the
|
|
100
|
+
Changelog section (e.g. `2026-07-13 — Refreshed: +2 objects, org alias updated`).
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Baseline Template
|
|
105
|
+
|
|
106
|
+
```markdown
|
|
107
|
+
# Architecture Baseline — [Project Name]
|
|
108
|
+
|
|
109
|
+
_Generated by /sf-init — YYYY-MM-DD_
|
|
110
|
+
_Last Scanned: YYYY-MM-DD HH:MM_
|
|
111
|
+
|
|
112
|
+
## Org Aliases
|
|
113
|
+
|
|
114
|
+
- Production: `[alias]`
|
|
115
|
+
- Sandbox / Dev: `[alias]`
|
|
116
|
+
|
|
117
|
+
## Tech Stack Baseline
|
|
118
|
+
|
|
119
|
+
- API Version: `[version]`
|
|
120
|
+
- LWC Styling Convention: [sf-dev standard SLDS 2 / shaiden / mixed — note which components use which]
|
|
121
|
+
- Primary Automation Layer: [Flow-first / Apex-heavy / mixed]
|
|
122
|
+
|
|
123
|
+
## Data Model Overview
|
|
124
|
+
|
|
125
|
+
| Object | Type | Purpose |
|
|
126
|
+
| ------ | ----------------- | -------- |
|
|
127
|
+
| [Name] | Standard / Custom | [1 line] |
|
|
128
|
+
|
|
129
|
+
## Existing Integrations
|
|
130
|
+
|
|
131
|
+
| System | Type | Notes |
|
|
132
|
+
| ------ | ------------------------------------------------ | -------- |
|
|
133
|
+
| [Name] | Named Credential / REST callout / Platform Event | [1 line] |
|
|
134
|
+
|
|
135
|
+
## Permission Set / PSG Inventory
|
|
136
|
+
|
|
137
|
+
| Name | Type | Purpose |
|
|
138
|
+
| ------ | ------------------------------------- | -------- |
|
|
139
|
+
| [Name] | Permission Set / Permission Set Group | [1 line] |
|
|
140
|
+
|
|
141
|
+
## Data Privacy Baseline
|
|
142
|
+
|
|
143
|
+
[Established classification/retention/masking policy, or "Not yet documented"]
|
|
144
|
+
|
|
145
|
+
## Org-Specific Constraints
|
|
146
|
+
|
|
147
|
+
[Naming conventions, governance rules, non-negotiables — manually maintained, not auto-refreshed
|
|
148
|
+
by future /sf-init runs unless explicitly requested]
|
|
149
|
+
|
|
150
|
+
## Changelog
|
|
151
|
+
|
|
152
|
+
- YYYY-MM-DD — Initial bootstrap
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Relationship to sf-architect
|
|
158
|
+
|
|
159
|
+
`sf-architect`'s Discovery phase checks for this file first and reads it instead of re-scanning
|
|
160
|
+
the whole project on every plan. Only feature-specific touchpoints not already covered by the
|
|
161
|
+
baseline get scanned fresh. If this file doesn't exist yet when `sf-architect` runs, it falls back
|
|
162
|
+
to its own full scan and may suggest running `/sf-init` first for future efficiency.
|
|
163
|
+
|
|
164
|
+
Re-run `/sf-init` periodically or after major structural changes (new integration, object model
|
|
165
|
+
overhaul, org alias change) — it's a refresh, not a one-time-only command.
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "acek-skills",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.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"
|
|
7
7
|
},
|
|
8
8
|
"files": [
|
|
9
9
|
"bin/",
|
|
10
|
-
"skills/"
|
|
10
|
+
"skills/",
|
|
11
|
+
"commands"
|
|
11
12
|
],
|
|
12
13
|
"keywords": [
|
|
13
14
|
"claude",
|
|
@@ -72,7 +72,7 @@ unrelated features into one plan.
|
|
|
72
72
|
## Workflow
|
|
73
73
|
|
|
74
74
|
```
|
|
75
|
-
DISCOVERY (grill me) → DECISIONS → PLAN (gate) → EXECUTE
|
|
75
|
+
DISCOVERY (grill me) → DECISIONS → PLAN (gate) → EXECUTE in batches (parallel where safe) → RESUME (new session)
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
### Phase 1 — Discovery ("Grill Me")
|
|
@@ -138,7 +138,9 @@ Nothing is built yet. This phase only produces decisions with rationale.
|
|
|
138
138
|
|
|
139
139
|
1. Compile Discovery + Decisions into the full plan file using the [Plan Template](#plan-template).
|
|
140
140
|
2. Break the work into tasks. Every task gets an ID, a description, an **Owner Skill**, a
|
|
141
|
-
|
|
141
|
+
**Touches** list (exact file(s)/component(s) it will create or modify), a dependency list, and
|
|
142
|
+
status `P` (Pending). `Touches` is what Phase 4 uses to decide which tasks are safe to run in
|
|
143
|
+
parallel — be specific and accurate here, not vague.
|
|
142
144
|
3. **If any task's Owner Skill is `sf-devops` or `sf-data-migration`, resolve org aliases before
|
|
143
145
|
finalizing** — see [Org Alias Resolution](#org-alias-resolution) below. Skip this step
|
|
144
146
|
entirely if no task touches those two skills; don't ask about aliases a plan doesn't need.
|
|
@@ -177,18 +179,42 @@ commands.
|
|
|
177
179
|
|
|
178
180
|
### Phase 4 — Execute
|
|
179
181
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
182
|
+
Tasks run in **batches**, not strictly one at a time. Within a batch, independent tasks are
|
|
183
|
+
dispatched to parallel subagents; tasks that depend on each other still run in sequence.
|
|
184
|
+
|
|
185
|
+
1. **Compute the ready set.** A task is ready when every task in its `Depends On` list is `D`.
|
|
186
|
+
2. **Split the ready set into parallel-safe groups.** Two ready tasks can run in the same batch
|
|
187
|
+
only if their `Touches` values don't overlap (no shared file/component). If a task's `Touches`
|
|
188
|
+
is unclear or ambiguous, treat it as not parallel-safe — run it alone.
|
|
189
|
+
3. **Dispatch the batch:**
|
|
190
|
+
- **Batch of 1** → run directly in the main thread, exactly as before (no subagent overhead
|
|
191
|
+
for solo work).
|
|
192
|
+
- **Batch of 2+** → dispatch each task to a separate subagent via the Task tool, in the same
|
|
193
|
+
turn. Each subagent prompt must state explicitly: the task description, the exact file(s) in
|
|
194
|
+
`Touches`, and "follow `sf-[owner skill]`'s conventions exactly as if that skill were invoked
|
|
195
|
+
directly" — never duplicate that skill's rules into the prompt, just name it and let it
|
|
196
|
+
trigger in the subagent's own context.
|
|
197
|
+
- **Assign each subagent in a batch a random name from the pool below, unique within that
|
|
198
|
+
batch** — used only as a tracking label in the orchestrator's own narration and Execution Log
|
|
199
|
+
("Dispatched to Sasha"), never written into code, commits, or file content.
|
|
200
|
+
4. **Only the orchestrator (main thread) writes to the plan file.** Subagents report their result
|
|
201
|
+
back; they never edit `instructions/architecture/*.md` directly. Once every subagent in the
|
|
202
|
+
batch has reported back, the orchestrator updates each task's status serially — this is what
|
|
203
|
+
prevents concurrent writes to the same plan file.
|
|
204
|
+
5. **Per task, on completion:** set status to `D` (Done) and append **one line** to the Execution
|
|
205
|
+
Log — no narrative, just what changed, where, and (if dispatched in a batch) which agent name
|
|
206
|
+
handled it.
|
|
207
|
+
6. **Per task, if it can't proceed** (missing decision, blocked dependency, discovered conflict):
|
|
208
|
+
set status to `B` (Blocked), write a one-line reason, and surface it to the user — a Blocked
|
|
209
|
+
task in a batch does not stop the other tasks in that same batch from completing.
|
|
210
|
+
7. **Recompute and repeat.** After a batch finishes, recompute the ready set (newly-unblocked
|
|
211
|
+
tasks may now qualify) and dispatch the next batch. Continue until every task is `D`, or every
|
|
212
|
+
remaining task is `B` — in which case stop and ask the user how to proceed via the choice
|
|
213
|
+
format.
|
|
214
|
+
|
|
215
|
+
**Subagent name pool** (pick unique names within a batch; reuse across different batches is fine):
|
|
216
|
+
Maya, Sasha, Nadia, Kirana, Alya, Cinta, Bunga, Dewi, Farah, Gita, Intan, Laras, Mira, Nita,
|
|
217
|
+
Putri, Rani, Sari, Tantri, Vina, Wulan
|
|
192
218
|
|
|
193
219
|
### Phase 5 — Resume
|
|
194
220
|
|
|
@@ -201,8 +227,12 @@ direct reference to a plan file.
|
|
|
201
227
|
feature name and last-updated date as the option label).
|
|
202
228
|
4. Read only that plan file. The **Resume Briefing** section is sufficient to continue — if it
|
|
203
229
|
isn't, that's a defect in how the plan was written, not a reason to re-derive context elsewhere.
|
|
204
|
-
5. Find
|
|
205
|
-
|
|
230
|
+
5. Find every task that is not `D`. **Any task still marked `IP` from a previous session means
|
|
231
|
+
its batch was interrupted mid-flight** — don't assume it actually finished or actually failed;
|
|
232
|
+
treat it as `P` again and re-verify its `Touches` before re-dispatching (check whether the file
|
|
233
|
+
actually reflects the change described in the task, since the interruption could have happened
|
|
234
|
+
before or after the underlying work landed). Recompute the ready/parallel-safe batch from
|
|
235
|
+
there and continue Phase 4 normally.
|
|
206
236
|
|
|
207
237
|
---
|
|
208
238
|
|
|
@@ -271,24 +301,33 @@ Permission Set Group `[PSG Name]`
|
|
|
271
301
|
|
|
272
302
|
## Task Breakdown
|
|
273
303
|
|
|
274
|
-
| ID | Description | Owner Skill | Depends On
|
|
275
|
-
| ------- | --------------------------------------------------------------------------- | ----------- |
|
|
276
|
-
| TASK-01 | [what] | sf-admin | —
|
|
277
|
-
| TASK-02 | Grant access via `[PS/PSG name from Decision 3]` — extend/create as decided | sf-admin | TASK-01
|
|
278
|
-
| TASK-03 | [what] | sf-dev | TASK-01
|
|
279
|
-
| TASK-04 | [what] | sf-
|
|
280
|
-
| TASK-05 | [what] | sf-
|
|
304
|
+
| ID | Description | Owner Skill | Touches | Depends On | Status |
|
|
305
|
+
| ------- | --------------------------------------------------------------------------- | ----------- | --------------------------- | ---------------- | ------ |
|
|
306
|
+
| TASK-01 | [what] | sf-admin | `Project__c` (object) | — | D |
|
|
307
|
+
| TASK-02 | Grant access via `[PS/PSG name from Decision 3]` — extend/create as decided | sf-admin | `[PS/PSG name]` | TASK-01 | P |
|
|
308
|
+
| TASK-03 | [what] | sf-dev | `ProjectController.cls` | TASK-01 | P |
|
|
309
|
+
| TASK-04 | [what] | sf-dev | `projectCard` (LWC) | TASK-01 | P |
|
|
310
|
+
| TASK-05 | [what] | sf-testing | `ProjectControllerTest.cls` | TASK-03 | P |
|
|
311
|
+
| TASK-06 | [what] | sf-devops | manifest + deploy | TASK-04, TASK-05 | P |
|
|
281
312
|
|
|
282
313
|
**Status codes:** `P` Pending · `IP` In Progress · `B` Blocked · `D` Done
|
|
283
314
|
|
|
315
|
+
**Touches** is what makes parallel dispatch safe: TASK-02, TASK-03, and TASK-04 all depend only on
|
|
316
|
+
TASK-01 and touch different things — they're a valid parallel batch. TASK-05 depends on TASK-03
|
|
317
|
+
and must wait for it. TASK-06 depends on both TASK-04 and TASK-05, so it waits for the slower of
|
|
318
|
+
the two.
|
|
319
|
+
|
|
284
320
|
---
|
|
285
321
|
|
|
286
322
|
## Execution Log
|
|
287
323
|
|
|
288
|
-
_One line per completed or blocked task. No narrative.
|
|
324
|
+
_One line per completed or blocked task. No narrative. Include the agent name if the task was
|
|
325
|
+
dispatched as part of a parallel batch — omit it for solo/main-thread tasks._
|
|
289
326
|
|
|
290
327
|
- YYYY-MM-DD HH:MM — TASK-01 done — Created `Project__c` fields per Decision 1
|
|
291
|
-
- YYYY-MM-DD HH:MM — TASK-02
|
|
328
|
+
- YYYY-MM-DD HH:MM — TASK-02 done (agent: Nadia) — Extended `Project Manager Access` PS
|
|
329
|
+
- YYYY-MM-DD HH:MM — TASK-03 done (agent: Sasha) — Added `getProjects()` to `ProjectController.cls`
|
|
330
|
+
- YYYY-MM-DD HH:MM — TASK-04 blocked (agent: Kirana) — needs Decision on empty-state copy, asked user
|
|
292
331
|
```
|
|
293
332
|
|
|
294
333
|
---
|
|
@@ -339,6 +378,9 @@ best if users need to review before submitting (D) Other — describe your own a
|
|
|
339
378
|
9. **Read `architecture.md` instead of re-scanning the whole project.** If the project baseline
|
|
340
379
|
exists (from `/sf-init`), it already has the tech stack, data model, Permission Set inventory,
|
|
341
380
|
and org aliases — reuse it. Only scan for what's specific to the current feature.
|
|
381
|
+
10. **Don't parallelize trivial batches.** A batch of 2+ is only worth subagent overhead when the
|
|
382
|
+
tasks are substantial (real file edits, not one-liners). If a "parallel-safe" batch is tiny,
|
|
383
|
+
running it directly in the main thread is often cheaper than the dispatch overhead.
|
|
342
384
|
|
|
343
385
|
---
|
|
344
386
|
|
|
@@ -356,5 +398,12 @@ best if users need to review before submitting (D) Other — describe your own a
|
|
|
356
398
|
- ✕ Skipping the Permission Set Strategy decision because the feature "seems simple" — access
|
|
357
399
|
control is part of every feature that touches an object, field, Apex class, or LWC
|
|
358
400
|
- ✕ Assuming a new Permission Set is needed without first scanning for an existing one that fits
|
|
401
|
+
- ✕ Dispatching two tasks in parallel when their `Touches` overlap, or when either one's
|
|
402
|
+
`Touches` is too vague to be sure it doesn't
|
|
403
|
+
- ✕ Letting a subagent write directly to the plan file — only the orchestrator writes status/log
|
|
404
|
+
updates, and only after the batch reports back
|
|
405
|
+
- ✕ Reusing the same agent name for two subagents within the same batch
|
|
406
|
+
- ✕ Treating an `IP` task found on resume as already finished — it means the batch was
|
|
407
|
+
interrupted, not that the work landed; re-verify before re-dispatching
|
|
359
408
|
- ✕ Asking the user to type an org alias from memory when `sf org list` can just be run
|
|
360
409
|
- ✕ Resolving org aliases for a plan that has no `sf-devops`/`sf-data-migration` task at all
|