Skip to content

Commit cef9512

Browse files
committed
Merge remote-tracking branch 'origin/develop' into sm/W-23051181-1-migrate-salesforcedx-apex-into-vscode
2 parents a0b15d1 + e3927b9 commit cef9512

30 files changed

Lines changed: 366 additions & 1045 deletions

.claude/plans/W-23094888.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# W-23094888 — Enable unicorn/no-array-sort-for-min-max
2+
3+
## Context
4+
- Enable `unicorn/no-array-sort-for-min-max`: disallow `[...].sort()[0]` for min/max; prefer `Math.min`/`Math.max`.
5+
- Rule exists in `eslint-plugin-unicorn` v68 (`node_modules/.../rules/no-array-sort-for-min-max.js`).
6+
- Depends W-23094887 (`prefer-boolean-return`) — already merged (commit afef5779a).
7+
- Add to `eslint.config.mjs` `**/*.ts` block, alphabetical: between `unicorn/no-array-sort` (172) and `unicorn/no-boolean-sort-comparator` (173).
8+
- Prior pattern: single `chore(eslint): enable unicorn/<rule>` commit (e.g. 48f4e16aa, afef5779a).
9+
10+
## Scope (verified via lint)
11+
- 0 violations across repo. Built `packages/eslint-local-rules`, enabled rule, ran eslint → 0 `no-array-sort-for-min-max` hits.
12+
- Pre-existing 217 errors (unused vars `scripts/`, xsd parsing) — unrelated.
13+
- No-op enablement: config-only, no source fixes.
14+
15+
## Phases
16+
17+
### Phase 1 — enable rule
18+
- Add `'unicorn/no-array-sort-for-min-max': 'error',` after `'unicorn/no-array-sort': 'error',` line in `eslint.config.mjs`.
19+
- Build local rules first (`packages/eslint-local-rules`), else ERR_MODULE_NOT_FOUND.
20+
- files: `eslint.config.mjs`
21+
- commit: `chore(eslint): enable unicorn/no-array-sort-for-min-max - W-23094888`
22+
23+
## Skills
24+
- concise (plan/docs style)
25+
- typescript (eslint.config.mjs governs TS files)
26+
- verification (lint gate)
27+
- changelog (lint-only chore; prior unicorn enables had no entry — confirm none needed)
28+
29+
## Verification
30+
- No e2e/runtime impact: pure lint config, 0 source changes.
31+
- No unit/Playwright needed — no source touched.

.claude/plans/W-23127988.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# W-23127988 — E2E flake: LWC LSP hover lightning-accordion
2+
3+
## Context
4+
5+
- retryRate 67%. Flake, not product defect (run 27976286397: retry 0 fail, retry 1 pass).
6+
- `waitForLwcLspReady` (`lwcUtils.ts:222`) gates only on index-status UI item, not `doHover` readiness.
7+
- HTML hover step in `lwcLspHover.headless.spec.ts` (step "hover over lightning-accordion tag and verify the LWC LSP hover card appears", currently ~lines 57-76) does single `hover()` + one-shot `expect(.monaco-hover).toBeVisible({timeout:15_000})`.
8+
- Cold-LSP: hover provider not ready when index item shows; single hover that misses never re-triggers → `.monaco-hover` never visible → fail.
9+
- Fix per WI: poll inside `toPass` — re-hover + assert.
10+
- Reference steps by their `test.step` title, not line numbers (file is 117 lines and grows; line-number-only refs go stale).
11+
12+
## Phases
13+
14+
### Phase 1 — gate HTML hover on availability via toPass re-hover
15+
16+
- File: `packages/salesforcedx-vscode-lwc/test/playwright/specs/lwcLspHover.headless.spec.ts`
17+
- Target: the HTML hover-verify `test.step` ("hover over lightning-accordion tag…"); wrap only the `hover()` + `.monaco-hover` assert (not the `goToLineCol` / `waitFor` setup) in `expect(async () => {...}).toPass({ timeout })`.
18+
- Each attempt: `tagToken.hover()`, then assert `.monaco-hover` w/ `View in Component Library` visible.
19+
- **Open question — must re-trigger fire on every attempt?** Hypothesis: if the pointer is already over the token, Monaco may not recompute the hover, so a missed first attempt never repaints. NOT verified — no Monaco source in `node_modules`, no repo precedent for mouse-move-away. Do NOT bake the move-away into the code as an asserted fact.
20+
- Implementation: keep each `toPass` attempt self-contained so a stale/absent hover is re-driven. Before each `hover()`, dismiss any open hover (e.g. `page.keyboard.press('Escape')`) and/or move the pointer off the token (`page.mouse.move` to editor body coords) so the next `hover()` is a genuine pointer transition. This is defensive: harmless if Monaco re-fires anyway, necessary if it suppresses same-token re-hover.
21+
- The move-away/Escape mechanism must be **confirmed in the local verification step** (below) — observe `.monaco-hover` actually disappear then reappear across attempts — before relying on it. If local run shows a bare re-`hover()` already repaints, drop the move-away to keep the step minimal.
22+
- Drop inner 15_000 → short per-attempt assert timeout; outer `toPass` timeout ~45_000.
23+
- Precedent: `lwcRename.headless.spec.ts:80-82,106-108` (toPass poll on flaky debounced UI); `lwcCustomComponentsIndex.headless.spec.ts:45`. (Precedent covers the toPass-around-flaky-assert pattern, NOT the hover re-trigger specifics.)
24+
- Commit: `test(lwc): poll lightning-accordion hover in toPass for cold-LSP - W-23127988`
25+
26+
### Phase 2 (optional, same commit if cheap) — apply same poll to JS hover
27+
28+
- Same file, JS hover-verify `test.step` ("hover over LightningElement…", desktop-only, 20_000 one-shot). Same cold-LSP race on `LightningElement` hover.
29+
- Wrap the `hover()` + `.monaco-hover` assert in `toPass` for consistency (same re-trigger handling as Phase 1); reduces future flake.
30+
- Fold into Phase 1 commit (one logical change: hover-readiness polling).
31+
32+
## Skills to apply
33+
34+
- playwright-e2e (toPass for async UI; avoid one-shot asserts on LSP-dependent UI)
35+
- concise (plan + any comments)
36+
37+
## Verification
38+
39+
- e2e-covered: the spec itself is the test — green run on branch confirms fix. Run `npm run test:web -w salesforcedx-vscode-lwc -- --retries 0` (and/or `test:desktop`); the `lwcPlaywrightE2E` CI workflow runs this on ubuntu (where flake observed). Ideally repeated runs to confirm retryRate drop.
40+
- Not e2e-covered:
41+
- `npm run compile` / typecheck spec file (no `let`, ternary, etc. per eslint).
42+
- eslint clean on changed spec.
43+
- **Confirm the re-trigger mechanism before PR** — local run (or PWDEBUG/headed) with `--retries 0` (`npm run test:web -w salesforcedx-vscode-lwc -- --retries 0`, so flake is observed not masked) on the HTML hover step: watch the DOM and verify across at least two `toPass` attempts that `.monaco-hover` actually disappears and reappears. This proves the loop re-drives a missed hover. If a bare re-`hover()` already repaints, drop the Escape/move-away. If even the move-away does not re-fire, escalate: the toPass loop is then ineffective and Phase 1 needs a different trigger (e.g. dispatch synthetic `mousemove`, or re-focus the token via `goToLineCol`).
44+
- **Status:** as committed, the Escape + editor-body `mouse.move` is retained defensively — the local confirm-and-trim step above was not performed, so the move-away is kept (harmless if Monaco re-fires anyway). Trim only after the local DOM observation confirms a bare re-`hover()` repaints.

.claude/skills/gus-cli/SKILL.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ Objects: `ADM_Work__c`, `ADM_Epic__c` (not ADM_Theme\_\_c).
8282

8383
Closed statuses: see ## Status\_\_c values. Use `LIMIT 50` (or 100) when querying team or epic work.
8484

85+
**Open-WI queries must ALSO exclude the "Bug no-fix" terminals**: `Duplicate`, `Inactive`, `Never`, `Not a bug`, `Not Reproducible`, `Rejected`, `Eng Internal`. Terminal despite no "Closed" prefix — omit them and a `Duplicate` WI wrongly shows as open.
86+
8587
**Create:** Always set `Story_Points__c=2`, `Product_Tag__c=a1aB000000005G3IAI`, `RecordTypeId`. Include `Subject__c`, `Assignee__c`, `Scrum_Team__c=a00B0000000w9xPIAQ`, `Epic__c` (optional), `QA_Engineer__c` (optional), `Details__c` (optional). Leave `Sprint__c` blank; never modify it. **Details\_\_c:** write concisely—fragments/bullets, minimal words, no repetition (see .claude/skills/concise/SKILL.md).
8688

8789
**`Details__c` ≥20 chars required.** `Details__c` (field label "Description") has a User Story validation rule: <20 chars → create fails with `Description must be at least 20 characters to submit a User Story`. Despite docs marking it optional, treat as required on create. Note: `Description__c` is a DIFFERENT field (label "Comment", unvalidated)—don't confuse them; the validated body field is `Details__c`.
@@ -132,6 +134,8 @@ sf data query --query "SELECT Id, Name, Description__c FROM ADM_Epic__c WHERE Te
132134

133135
Closed = `Health__c` in ('Completed', 'Canceled'). Use `Description__c` when populated to match work to epic.
134136

137+
**`Description__c` is not filterable in SOQL**`WHERE`/`LIKE` on it errors `field 'Description__c' can not be filtered in a query call`. To match an epic by text, fetch all open epics and match on `Name`, or post-filter `Description__c` client-side (e.g. with jq). Only `SELECT` it.
138+
135139
## Epic guide: which work items go where
136140

137141
Use to pick the right Epic\_\_c when creating work. Query epics first; match by Name/Description. Key epics:
@@ -163,9 +167,9 @@ When unsure which epic: ask the user.
163167

164168
`[ai-auto]` in `Subject__c` or `Details__c` opts a WI into the [auto-build-wi workflow](../../workflows/auto-build-wi.js) (claim → plan → build → review → draft PR). See [workflows/README.md](../../workflows/README.md).
165169

166-
- Add only on explicit user request; prefer `Subject__c`
170+
- Add only on explicit user request; only `Subject__c` (title), never `Details__c`
167171
- Skip for WIs needing design/coordination
168-
- Query: `(Subject__c LIKE '%[ai-auto]%' OR Details__c LIKE '%[ai-auto]%')`
172+
- Query: `Subject__c LIKE '%[ai-auto]%'`
169173

170174
## Compound workflows
171175

@@ -193,6 +197,8 @@ When unsure which epic: ask the user.
193197
When creating/updating, only use New,In Progress,Ready for Review,QA In Progress,Fixed,Waiting,Closed
194198
When completing a work item, use `Closed`.
195199

200+
To mark a WI as a duplicate: set `Status__c='Duplicate'` + link the original via `Related_Work__c` (label "Duplicate Of"). `Closed - Duplicate` does NOT persist here — a trigger reverts it to `Duplicate` — so use `Duplicate` directly. `Duplicate` is terminal (treat like Closed) for open/unfinished queries.
201+
196202
**Flow:** New → Acknowledged → Triaged → In Progress → Ready for Review → Fixed → QA In Progress → Completed/Closed
197203

198204
**Blocked:** Investigating | More Info Reqd from Support | Waiting On Customer | Waiting On 3rd Party | Waiting | Deferred | Integrate | Pending Release

.claude/workflows/auto-build-wi.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,8 +326,15 @@ const hasPrUrl = details =>
326326
// A blocker is "satisfied" only once its work has actually merged — i.e. the WI
327327
// reached a terminal closed/completed status. 'Ready for Review' / 'Fixed' mean
328328
// the PR exists but hasn't merged, so a dependency in those states is NOT met.
329+
// GUS "Bug no-fix" terminal statuses — terminal like Closed/Completed, but the
330+
// label carries no "Closed" prefix. `Duplicate` is the canonical state for a
331+
// duplicate WI (the `Closed - Duplicate` status does not persist — a GUS trigger
332+
// reverts it to `Duplicate`), so the sequencing/dependency gates must count it as done.
333+
const NO_FIX_TERMINAL = new Set([
334+
'Duplicate', 'Inactive', 'Never', 'Not a bug', 'Not Reproducible', 'Rejected', 'Eng Internal',
335+
])
329336
const isBlockerSatisfied = status =>
330-
status === 'Completed' || status.startsWith('Closed')
337+
status === 'Completed' || status.startsWith('Closed') || NO_FIX_TERMINAL.has(status)
331338

332339
// A PR whose ONLY changed file is its own plan (or otherwise empty) has no
333340
// implementation — the Build phase no-op'd but reported 'done'. Such a PR still

.github/workflows/apexLogE2E.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ jobs:
5656
- name: Setup Node.js
5757
uses: actions/setup-node@v4
5858
with:
59-
node-version: '22'
59+
node-version: '22.22.3'
6060
cache: 'npm'
6161

6262
- uses: google/wireit@setup-github-actions-caching/v2
@@ -185,7 +185,7 @@ jobs:
185185
- name: Setup Node.js
186186
uses: actions/setup-node@v4
187187
with:
188-
node-version: '22'
188+
node-version: '22.22.3'
189189
cache: 'npm'
190190

191191
- uses: google/wireit@setup-github-actions-caching/v2

.github/workflows/apexLspE2E.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ jobs:
6666
- name: Setup Node.js
6767
uses: actions/setup-node@v4
6868
with:
69-
node-version: '22'
69+
node-version: '22.22.3'
7070
cache: 'npm'
7171

7272
- uses: google/wireit@setup-github-actions-caching/v2

.github/workflows/apexOasE2E.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ jobs:
7070
- name: Setup Node.js
7171
uses: actions/setup-node@v4
7272
with:
73-
node-version: '22'
73+
node-version: '22.22.3'
7474
cache: 'npm'
7575

7676
- uses: google/wireit@setup-github-actions-caching/v2

.github/workflows/apexReplayDebuggerE2E.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ jobs:
7070
- name: Setup Node.js
7171
uses: actions/setup-node@v4
7272
with:
73-
node-version: '22'
73+
node-version: '22.22.3'
7474
cache: 'npm'
7575

7676
- uses: google/wireit@setup-github-actions-caching/v2

.github/workflows/apexTestingE2E.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ jobs:
5656
- name: Setup Node.js
5757
uses: actions/setup-node@v4
5858
with:
59-
node-version: '22'
59+
node-version: '22.22.3'
6060
cache: 'npm'
6161

6262
- uses: google/wireit@setup-github-actions-caching/v2
@@ -209,7 +209,7 @@ jobs:
209209
- name: Setup Node.js
210210
uses: actions/setup-node@v4
211211
with:
212-
node-version: '22'
212+
node-version: '22.22.3'
213213
cache: 'npm'
214214

215215
- uses: google/wireit@setup-github-actions-caching/v2

.github/workflows/auraE2E.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ jobs:
6666
- name: Setup Node.js
6767
uses: actions/setup-node@v4
6868
with:
69-
node-version: '22'
69+
node-version: '22.22.3'
7070
cache: 'npm'
7171

7272
- uses: google/wireit@setup-github-actions-caching/v2

0 commit comments

Comments
 (0)