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.
@@ -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",
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 task-by-task → RESUME (new session)
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
- dependency list, and status `P` (Pending).
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
- Work through tasks in dependency order, one at a time:
181
-
182
- 1. Announce which task is starting and which Owner Skill's conventions apply.
183
- 2. Set that task's status to `IP` (In Progress) in the plan file.
184
- 3. Do the work following that owner skill's rules exactly as if that skill were invoked directly.
185
- 4. On completion, set status to `D` (Done) and append **one line** to the Execution Log — no
186
- narrative, just what changed and where.
187
- 5. If a task cannot proceed (missing decision, blocked dependency, discovered conflict), set
188
- status to `B` (Blocked), write a one-line reason, and surface it to the user immediately rather
189
- than guessing.
190
- 6. Move to the next unblocked task. If all remaining tasks are blocked, stop and ask the user how
191
- to proceed using the choice format.
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 the first task that is not `D`, confirm with the user in one line ("Resuming at TASK-04:
205
- [description], owner sf-testingproceeding"), and continue Phase 4.
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 | Status |
275
- | ------- | --------------------------------------------------------------------------- | ----------- | ---------- | ------ |
276
- | TASK-01 | [what] | sf-admin | — | D |
277
- | TASK-02 | Grant access via `[PS/PSG name from Decision 3]` — extend/create as decided | sf-admin | TASK-01 | P |
278
- | TASK-03 | [what] | sf-dev | TASK-01 | IP |
279
- | TASK-04 | [what] | sf-testing | TASK-03 | P |
280
- | TASK-05 | [what] | sf-devops | TASK-04 | P |
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 blocked needs Decision on callout timeout, asked user
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