Skip to content
Merged
Show file tree
Hide file tree
Changes from 40 commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
4a5f29c
feat: refactor SObject refresh pipeline W-21240055
peternhale Feb 24, 2026
78084a7
perf(core): unify sobject refresh into single Effect scope
peternhale Feb 24, 2026
3e01937
perf(services): tune batch concurrency for optimal streaming throughput
peternhale Feb 24, 2026
15cedd7
refactor(services): rename FsService.safeWrite to safeWriteFile
peternhale Feb 24, 2026
b42abbc
feat(metadata): migrate SObject refresh from core to metadata extension
peternhale Feb 25, 2026
14f4033
feat(services): add TransmogrifierService and migrate SOQL to service…
peternhale Feb 25, 2026
e54732a
Merge origin/develop
peternhale Feb 25, 2026
b7af8eb
fix: correct soql tsconfig references after merge
peternhale Feb 25, 2026
67b3791
refactor: consolidate SObject types to TransmogrifierService
peternhale Feb 25, 2026
396bbc7
refactor: replace getSObjectPaths with individual path methods on Pro…
peternhale Feb 25, 2026
c8da2d4
chore: update package-lock.json
peternhale Feb 25, 2026
1db53e5
chore: move minSObjects.json from data/ to resources/ (data/ is gitig…
peternhale Feb 25, 2026
0cfad3d
fix: pin strip-ansi to v5 to prevent ESM-only v7 from being hoisted
peternhale Feb 25, 2026
d3a3ec7
fix(lwc): replace static strip-ansi import with require to handle ESM…
peternhale Feb 25, 2026
ded00b3
revert: undo strip-ansi pin; npm install correctly nests v5 for lwc
peternhale Feb 25, 2026
bcfb7fd
fix: use @salesforce/core main entry for Global to avoid subpath expo…
peternhale Feb 25, 2026
35b97be
refactor: consolidate @salesforce/core imports onto single import sta…
peternhale Feb 25, 2026
94c921c
refactor: eliminate vscode-utils deps for SObject path/IO in metadata…
peternhale Feb 25, 2026
377b1a2
refactor(utils-vscode): revert unintentional SObject additions
peternhale Feb 25, 2026
3834a17
refactor(services): expose subscribeToSObjectRefresh as plain API for…
peternhale Feb 26, 2026
74d38ef
refactor(core): move sf.internal.sobjectrefresh.complete command owne…
peternhale Feb 26, 2026
ff66890
test(core): fix CommandEventDispatcher test to mock registerCommand r…
peternhale Feb 26, 2026
223ac3b
refactor: follow effect patterns
mshanemc Feb 27, 2026
56ded75
Merge remote-tracking branch 'origin/develop' into sm/w-21240055-feed…
mshanemc Feb 27, 2026
9f984bc
refactor: effect best practices
mshanemc Feb 27, 2026
022c4c6
refactor: more effect-like, use cache when available for batch things
mshanemc Feb 27, 2026
0a3c39a
feat: progress indicator on sobject writes
mshanemc Feb 27, 2026
ad280ee
refactor: sfdx-core as devDep
mshanemc Feb 27, 2026
068335d
chore: a few more things
mshanemc Feb 27, 2026
8e9ec33
refactor: let soql editors manage their own org change notifications
mshanemc Feb 27, 2026
3441500
chore: do call
mshanemc Feb 27, 2026
776c452
refactor(metadata,soql,org-browser): multi-org metadata cache with sh…
peternhale Mar 2, 2026
fa57130
docs: update skill stuff
mshanemc Mar 3, 2026
3809147
refactor: simplified "global" dependencies
mshanemc Mar 3, 2026
2ae8f0d
Merge remote-tracking branch 'origin/develop' into sm/feedback-3
mshanemc Mar 3, 2026
b483ec5
test: update mocks for new pattern
mshanemc Mar 3, 2026
3f9eeb6
refactor: cache key
mshanemc Mar 3, 2026
226a2ce
chore: remove faux-generator package remnants
peternhale Mar 3, 2026
4b6733b
chore: fix typo
daphne-sfdc Mar 4, 2026
505ebe4
Merge branch 'develop' into sm/feedback-3
daphne-sfdc Mar 4, 2026
4758824
docs: e2e skips for non-target tests
mshanemc Mar 5, 2026
bc7be68
test: add Playwright refreshSObjectDefinitions spec, temporarily isol…
mshanemc Mar 5, 2026
2b3b1ed
chore: labels cleanup
mshanemc Mar 5, 2026
e575222
test: labels for e2e
mshanemc Mar 5, 2026
cc77ffd
Merge remote-tracking branch 'origin/develop' into sm/feedback-3
mshanemc Mar 5, 2026
d84bdb9
fix: web support by avoiding fspath
mshanemc Mar 5, 2026
d1c86cc
Merge remote-tracking branch 'origin/develop' into sm/feedback-3
mshanemc Mar 5, 2026
f73eb6f
refactor: decide to call completion "command" based on core ext prese…
mshanemc Mar 5, 2026
d9b5f6b
ci: restore all ci
mshanemc Mar 5, 2026
f614e15
test: outputchannel fixes
mshanemc Mar 5, 2026
a1b29aa
Merge branch 'develop' into sm/feedback-3
daphne-sfdc Mar 6, 2026
4b1f15a
test: e2e hardening
mshanemc Mar 6, 2026
80d22f7
Merge remote-tracking branch 'origin/develop' into sm/outputChannelFi…
mshanemc Mar 6, 2026
55c721b
test: refocus for cmd visibility
mshanemc Mar 6, 2026
c6c6380
Merge branch 'sm/feedback-3' of https://github.com/forcedotcom/salesf…
mshanemc Mar 6, 2026
1821c07
test: remove original sobjectdefinitions e2e test
mshanemc Mar 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .claude/skills/concise/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
---
name: concise
description: when creating/modifying md files (plans) in skills/rules for AI
description: Writing style for AI-consumed docs. Proactively apply when creating or editing any md file in .claude/skills/ or .claude/rules/ or .cursor/rules/.
disable-model-invocation: false
---

# Concise

We want to save tokens and preserve context window size.
Save tokens and preserve context window.

- use fragments/bullets, not full sentences
- remove as many words as possible without altering meaning
- fragments/bullets, not full sentences
- remove words without altering meaning
- cut repetition
- prefer shorter words that mean the same thing
- prefer shorter synonyms
68 changes: 37 additions & 31 deletions .claude/skills/services-extension-consumption/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,22 @@ const ExtensionProviderServiceLive = Layer.effect(
const api = yield * (yield * ExtensionProviderService).getServicesApi;
```

## Prebuilt vs Per-Extension Services

`api.services.prebuiltServicesDependencies` — pre-built `Context.Context` from services extension activation. Wrap with `Layer.succeedContext(...)`.

Shares singleton instances (caches, watchers) across extensions; avoids re-building stateful services.

Per-extension layers (must build yourself):

| Layer | Why |
|---|---|
| `ChannelServiceLayer(displayName)` | Own output channel |
| `ErrorHandlerService.Default` | Depends on own ChannelService |
| `ExtensionContextServiceLayer(context)` | Own `ExtensionContext` |
| `SdkLayerFor(context)` | Own tracer (extension name/version in resource attributes) |
| `ExtensionProviderServiceLive` | Local singleton |

## ExtensionContext Setup

Factory function building services layer with ExtensionContext:
Expand All @@ -35,21 +51,18 @@ export const buildAllServicesLayer = (context: ExtensionContext) =>
Effect.gen(function* () {
const extensionProvider = yield* ExtensionProviderService;
const api = yield* extensionProvider.getServicesApi;
const extension = vscode.extensions.getExtension(`salesforce.${EXTENSION_NAME}`);
const extensionVersion = extension?.packageJSON?.version ?? 'unknown';
const o11yEndpoint = process.env.O11Y_ENDPOINT ?? extension?.packageJSON?.o11yUploadEndpoint;

// ErrorHandlerService needs ChannelService
const channelLayer = api.services.ChannelServiceLayer(extension?.packageJSON.displayName);
const channelLayer = api.services.ChannelServiceLayer(
context.extension.packageJSON.displayName ?? 'My Extension'
);
const errorHandlerWithChannel = Layer.provide(api.services.ErrorHandlerService.Default, channelLayer);

return Layer.mergeAll(
Layer.succeedContext(api.services.prebuiltServicesDependencies),
ExtensionProviderServiceLive,
errorHandlerWithChannel,
api.services.ExtensionContextServiceLayer(context),
api.services.sdkLayerFor(context)
// ... other services
channelLayer,
errorHandlerWithChannel
api.services.SdkLayerFor(context),
channelLayer
);
}).pipe(Effect.provide(ExtensionProviderServiceLive))
);
Expand Down Expand Up @@ -175,25 +188,18 @@ export const buildAllServicesLayer = (context: ExtensionContext) =>
Effect.gen(function* () {
const extensionProvider = yield* ExtensionProviderService;
const api = yield* extensionProvider.getServicesApi;
const extension = vscode.extensions.getExtension(`salesforce.${EXTENSION_NAME}`);
const extensionVersion = extension?.packageJSON?.version ?? 'unknown';
const o11yEndpoint = process.env.O11Y_ENDPOINT ?? extension?.packageJSON?.o11yUploadEndpoint;

const channelLayer = api.services.ChannelServiceLayer(extension?.packageJSON.displayName);
const channelLayer = api.services.ChannelServiceLayer(
context.extension.packageJSON.displayName ?? 'My Extension'
);
const errorHandlerWithChannel = Layer.provide(api.services.ErrorHandlerService.Default, channelLayer);

return Layer.mergeAll(
// list whatever you need. TS will tell you if there's something missing
Layer.succeedContext(api.services.prebuiltServicesDependencies),
ExtensionProviderServiceLive,
api.services.ConnectionService.Default,
api.services.EditorService.Default,
api.services.MediaService.Default,
errorHandlerWithChannel,
api.services.ExtensionContextServiceLayer(context),
api.services.ProjectService.Default,
api.services.WorkspaceService.Default,
api.services.SdkLayerFor({ extensionName: EXTENSION_NAME, extensionVersion, o11yEndpoint }),
channelLayer,
errorHandlerWithChannel
api.services.SdkLayerFor(context),
channelLayer
);
}).pipe(Effect.provide(ExtensionProviderServiceLive))
);
Expand All @@ -205,7 +211,6 @@ export const activateEffect = Effect.fn(`activation:${EXTENSION_NAME}`)(function
const api = yield* (yield* ExtensionProviderService).getServicesApi;
yield* api.services.ChannelService.appendToChannel('Extension activating');

// useful if registering multiple commands...they all get the layer provided to them
const registerCommand = api.services.registerCommandWithLayer(AllServicesLayer);

yield* registerCommand('sf.my.command', myCommandEffect);
Expand All @@ -216,9 +221,10 @@ export const activateEffect = Effect.fn(`activation:${EXTENSION_NAME}`)(function

## Common Patterns

- Include `ExtensionContextServiceLayer(context)` when you have ExtensionContext
- Use `MediaService.Default` when building UI strings in Effect; use direct `import { ICONS }` when outside Effect
- Provide `ChannelServiceLayer` before `ErrorHandlerService`
- Use `SdkLayerFor` with extension name/version for observability
- Fork watchers with `Effect.forkIn(..., yield* getExtensionScope())` for cleanup on deactivation
- Use `registerCommandWithLayer` for all commands (tracing + error handling)
- Start with `Layer.succeedContext(api.services.prebuiltServicesDependencies)` — don't add individual `*.Default` for services already there
- Only add per-extension layers on top
- `import { ICONS }` outside Effect; `MediaService` inside Effect
- `ChannelServiceLayer` before `ErrorHandlerService`
- Pass `context` to `SdkLayerFor` (extracts name/version from ExtensionContext)
- `Effect.forkIn(..., yield* getExtensionScope())` for watcher cleanup on deactivation
- `registerCommandWithLayer` for all commands (tracing + error handling)
48 changes: 0 additions & 48 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@
"webpack:///salesforcedx-utils-vscode/./*": "${workspaceFolder}/packages/salesforcedx-utils-vscode/*",
"webpack:///salesforcedx-vscode-soql/./*": "${workspaceFolder}/packages/salesforcedx-vscode-soql/*",
"webpack:///salesforcedx-vscode-soql/../salesforcedx-utils-vscode/*": "${workspaceFolder}/packages/salesforcedx-utils-vscode/*",
"webpack:///salesforcedx-sobjects-faux-generator/./*": "${workspaceFolder}/packages/salesforcedx-sobjects-faux-generator/*",
"webpack:///*": "*"
},
"preLaunchTask": "Compile and Bundle"
Expand Down Expand Up @@ -116,7 +115,6 @@
"webpack:///salesforcedx-utils-vscode/./*": "${workspaceFolder}/packages/salesforcedx-utils-vscode/*",
"webpack:///salesforcedx-vscode-soql/./*": "${workspaceFolder}/packages/salesforcedx-vscode-soql/*",
"webpack:///salesforcedx-vscode-soql/../salesforcedx-utils-vscode/*": "${workspaceFolder}/packages/salesforcedx-utils-vscode/*",
"webpack:///salesforcedx-sobjects-faux-generator/./*": "${workspaceFolder}/packages/salesforcedx-sobjects-faux-generator/*",
"webpack:///*": "*"
}
},
Expand All @@ -132,7 +130,6 @@
"outFiles": ["${workspaceFolder}/packages/*/out/src/**/*.js"],
"sourceMapPathOverrides": {
"webpack:///salesforcedx-utils-vscode/./*": "${workspaceFolder}/packages/salesforcedx-utils-vscode/*",
"webpack:///salesforcedx-sobjects-faux-generator/./*": "${workspaceFolder}/packages/salesforcedx-sobjects-faux-generator/*",
"webpack:///*": "*"
},
"preLaunchTask": "Compile and Bundle"
Expand All @@ -149,7 +146,6 @@
"outFiles": ["${workspaceFolder}/packages/*/out/src/**/*.js"],
"sourceMapPathOverrides": {
"webpack:///salesforcedx-utils-vscode/./*": "${workspaceFolder}/packages/salesforcedx-utils-vscode/*",
"webpack:///salesforcedx-sobjects-faux-generator/./*": "${workspaceFolder}/packages/salesforcedx-sobjects-faux-generator/*",
"webpack:///*": "*"
},
"preLaunchTask": "Compile and Bundle"
Expand Down Expand Up @@ -289,40 +285,12 @@
"sourceMapPathOverrides": {
"../../../../test/unit/": "${workspaceFolder}/packages/salesforcedx-apex-debugger/out/test/unit/*",
"webpack:///salesforcedx-utils-vscode/./*": "${workspaceFolder}/packages/salesforcedx-utils-vscode/*",
"webpack:///salesforcedx-sobjects-faux-generator/./*": "${workspaceFolder}/packages/salesforcedx-sobjects-faux-generator/*",
"webpack:///*": "*"
},
"preLaunchTask": "Compile and Bundle",
"internalConsoleOptions": "openOnSessionStart",
"skipFiles": ["<node_internals>/**"] // https://github.com/nodejs/node/issues/15464#issuecomment-332723120
},

{
"name": "Launch Tests - SObject Faux Generator - Unit Tests",
"type": "node",
"request": "launch",
"cwd": "${workspaceFolder}/packages/salesforcedx-sobjects-faux-generator",
"program": "${workspaceFolder}/packages/salesforcedx-sobjects-faux-generator/node_modules/mocha/bin/_mocha",
"args": [
"-u",
"tdd",
"--timeout",
"100000",
"--colors",
"--recursive",
"${workspaceFolder}/packages/salesforcedx-sobjects-faux-generator/out/test/unit"
],
"sourceMaps": true,
"smartStep": true,
"outFiles": ["${workspaceFolder}/packages/*/out/**/*.js"],
"sourceMapPathOverrides": {
"webpack:///salesforcedx-sobjects-faux-generator/../salesforcedx-utils-vscode/*": "${workspaceFolder}/packages/salesforcedx-utils-vscode/*",
"webpack:///salesforcedx-sobjects-faux-generator/./*": "${workspaceFolder}/packages/salesforcedx-sobjects-faux-generator/*",
"webpack:///*": "*"
},
"preLaunchTask": "Compile and Bundle",
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": "Launch Tests - Replay Debugger - Unit Tests",
"type": "node",
Expand All @@ -344,28 +312,12 @@
"sourceMapPathOverrides": {
"../../../../test/unit/": "${workspaceFolder}/packages/salesforcedx-apex-replay-debugger/out/test/unit/*",
"webpack:///salesforcedx-utils-vscode/./*": "${workspaceFolder}/packages/salesforcedx-utils-vscode/*",
"webpack:///salesforcedx-sobjects-faux-generator/./*": "${workspaceFolder}/packages/salesforcedx-sobjects-faux-generator/*",
"webpack:///*": "*"
},
"preLaunchTask": "Compile and Bundle",
"internalConsoleOptions": "openOnSessionStart",
"skipFiles": ["<node_internals>/**"] // https://github.com/nodejs/node/issues/15464#issuecomment-332723120
},
{
"name": "Debug Faux Jest Unit Tests",
"cwd": "${workspaceRoot}/packages/salesforcedx-sobjects-faux-generator",
"type": "node",
"request": "launch",
"runtimeArgs": [
"--inspect-brk",
"${workspaceRoot}/packages/salesforcedx-sobjects-faux-generator/node_modules/.bin/jest",
"--runInBand",
"--coverage",
"false"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"name": "Debug Apex Debug Jest Unit Tests",
"cwd": "${workspaceRoot}/packages/salesforcedx-apex-debugger",
Expand Down
29 changes: 5 additions & 24 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 0 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,6 @@
"./packages/salesforcedx-vscode-i18n:compile",
"./packages/salesforcedx-utils-vscode:compile",
"./packages/soql-common:compile",
"./packages/salesforcedx-sobjects-faux-generator:compile",
"./packages/salesforcedx-apex-debugger:compile",
"./packages/salesforcedx-apex-replay-debugger:compile",
"./packages/effect-ext-utils:compile",
Expand Down Expand Up @@ -200,7 +199,6 @@
"./packages/salesforcedx-vscode-i18n:lint",
"./packages/salesforcedx-utils-vscode:lint",
"./packages/soql-common:lint",
"./packages/salesforcedx-sobjects-faux-generator:lint",
"./packages/salesforcedx-apex-debugger:lint",
"./packages/salesforcedx-apex-replay-debugger:lint",
"./packages/effect-ext-utils:lint",
Expand Down Expand Up @@ -235,7 +233,6 @@
"./packages/salesforcedx-vscode-i18n:test",
"./packages/salesforcedx-utils-vscode:test",
"./packages/soql-common:test",
"./packages/salesforcedx-sobjects-faux-generator:test",
"./packages/salesforcedx-apex-debugger:test",
"./packages/salesforcedx-apex-replay-debugger:test",
"./packages/salesforcedx-lightning-lsp-common:test",
Expand Down
4 changes: 0 additions & 4 deletions packages/salesforcedx-sobjects-faux-generator/README.md

This file was deleted.

This file was deleted.

This file was deleted.

Loading
Loading