macalbert/envilder/sdk-implementation-guide
Claude Code and agent skill by macalbert/envilder
- community
Checking that the SKILL.md file is still in the repository.
Operational guide for implementing a new Envilder runtime SDK. Covers folder structure, API surface (Tier 1 + Tier 2), provider contract, naming conventions, sync/async model, internal vs public separation, vanity imports, and testing skeleton. Use when creating Go, Java, PHP, Rust, or any future SDK.
Install
npx vskill@latest install macalbert/envilder/sdk-implementation-guideSKILL.md
SDK Implementation Guide
Step-by-step guide for building a new Envilder runtime SDK. Complements ADR-0003 (architecture pattern) and ADR-0005 (integration tiers). For website wiring and publishing, see the sdk-release-checklist skill.
When to Use
- Implementing a new runtime SDK (Go, Java, PHP, Rust, etc.)
- Reviewing an SDK PR for pattern compliance
- Onboarding a contributor to SDK development
Prerequisites
Before starting, read:
1. Folder Structure
Tests mirror the structure under tests/sdks/{runtime}/.
Note: This is the logical structure. Each runtime adapts to its ownconventions (e.g., Node.js usessrc/subfolder, Python uses package nameas root directory).
2. Mandatory API Surface
Tier 1: Static Facade (one-liner)
Tier 2: Fluent Builder
Environment Routing (both tiers)
3. Provider Contract
| Aspect | Decision | |
|---|---|---|
| Missing secrets | Return null/None/nil (Option<T> in Rust) or omit from result collection: never throw | |
| Validation | Opt-in validateSecrets() post-resolution | |
| Cross-provider validation | profile + Azure → error; vaultUrl + AWS → error | |
| Options override config | Runtime EnvilderOptions > $config from map file | |
| Pull-only | SDKs do not support push mode |
Sync vs Async per Runtime
| Runtime | Model | Rationale | |
|---|---|---|---|
| .NET | Both (sync + async methods) | IConfigurationBuilder needs sync | |
| Python | Sync only | boto3 is natively synchronous | |
| Node.js | Async only | AWS SDK v3 is async, natural fit | |
| Go | Sync (with context.Context and goroutines for batch) | Idiomatic Go | |
| Java/Kotlin | Both (sync + async/CompletableFuture) | Spring uses both patterns | |
| PHP | Sync only | PHP is single-threaded by default | |
| Rust | Async (tokio) | AWS SDK for Rust is async |
Batch vs Individual
| Runtime | Strategy | Rationale | |
|---|---|---|---|
| Node.js | Batch (GetParameters, max 10) | Avoids waterfall awaits | |
| .NET | Individual (GetParameter) | Simpler error handling per secret | |
| Python | Individual (get_parameter) | Matches boto3 API | |
| Go | Batch preferred | Reduce round trips | |
| Java | Batch preferred | AWS SDK supports batch | |
| PHP | Individual | Simpler for first iteration | |
| Rust | Batch preferred | Async batch is natural |
4. Internal vs Public Separation
The SecretProviderFactory is always internal (not part of public API):
| Runtime | Mechanism | |
|---|---|---|
| .NET | internal keyword + InternalsVisibleTo for tests | |
| Python | _ prefix (_SecretProviderFactory) + __all__ whitelist | |
| Node.js | Not re-exported from barrel index.ts | |
| Go | Unexported (secretProviderFactory, lowercase) | |
| Java/Kotlin | Package-private or internal (Kotlin) | |
| PHP | Prefixed _ or #[Internal] attribute / @internal docblock | |
| Rust | pub(crate) visibility |
5. Naming Conventions
Package/Module Names
| Runtime | Package name | Import | |
|---|---|---|---|
| .NET | Envilder (NuGet) | using Envilder; | |
| Python | envilder (PyPI) | from envilder import Envilder | |
| Node.js | @envilder/sdk (npm) | import { Envilder } from '@envilder/sdk' | |
| Go | envilder.com/go (vanity) | import "envilder.com/go" | |
| Java/Kotlin | com.envilder:envilder (Maven) | import com.envilder.Envilder; | |
| PHP | envilder/envilder (Packagist) | use Envilder\Envilder; | |
| Rust | envilder (crates.io) | use envilder::Envilder; |
Class/Struct Naming
- Facade class is always
Envilder(consistent cross-SDK brand) - Client class is always
EnvilderClient - Provider interface:
ISecretProvider(or language equivalent: Protocol, trait, interface)
6. Vanity Imports (Go)
Go module path is envilder.com/go. This requires a vanity import HTML at https://envilder.com/go?go-get=1:
Serve from the Envilder website (src/website/public/go/index.html).
7. Testing Skeleton
Every SDK must have:
- [ ] Unit tests for
MapFileParser - [ ] Unit tests for
EnvilderClient(mockISecretProvider) - [ ] Unit tests for
Envilderfacade (mock client/provider) - [ ] Unit tests for
SecretValidation - [ ] Unit tests for cross-provider validation
- [ ] Acceptance tests with LocalStack (AWS SSM)
- [ ] Acceptance tests with LocalStack for Azure (Azure Key Vault)
Follow sdk-acceptance-testing skill for container wrapper patterns.
8. Implementation Order (per SDK)
- Domain types (
MapFileConfig,EnvilderOptions,SecretProviderType,ISecretProvider) MapFileParser+ testsEnvilderClient+ testsAwsSsmSecretProvider+ acceptance testsAzureKeyVaultSecretProvider+ acceptance testsEnvilderfacade (Tier 1 + Tier 2) + testsSecretValidation+ tests- Cross-provider validation + tests
- README, changelog, website wiring (→
sdk-release-checklistskill)
9. Checklist Before Submitting PR
- [ ] All unit tests pass
- [ ] All acceptance tests pass (Docker required)
- [ ]
SecretProviderFactoryis not publicly exported - [ ] Tier 1 (
load) and Tier 2 (fromMapFile().inject()) work end-to-end - [ ] Missing secrets silently omitted (no exceptions from provider)
- [ ]
validateSecrets()throws on empty/missing values - [ ] Cross-provider errors: profile+Azure→error, vaultUrl+AWS→error
- [ ] Options override
$configvalues - [ ] Environment routing works
- [ ] Follows language-idiomatic conventions (naming, async model, visibility)
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryChecking.github/skills/sdk-implementation-guide/SKILL.md
Popularity
- Repository stars
- 135
- Repository forks
- 4
- 7-day trend score
- 25
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/macalbert/envilder/sdk-implementation-guide)