@jaypie/mcp 0.3.2 → 0.4.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.
Files changed (79) hide show
  1. package/dist/createMcpServer.d.ts +7 -1
  2. package/dist/index.js +26 -3135
  3. package/dist/index.js.map +1 -1
  4. package/dist/suite.d.ts +1 -0
  5. package/dist/suite.js +2442 -0
  6. package/dist/suite.js.map +1 -0
  7. package/package.json +8 -3
  8. package/release-notes/constructs/1.2.17.md +11 -0
  9. package/release-notes/fabric/0.1.2.md +11 -0
  10. package/release-notes/fabric/0.1.3.md +25 -0
  11. package/release-notes/fabric/0.1.4.md +42 -0
  12. package/release-notes/mcp/0.3.3.md +12 -0
  13. package/release-notes/mcp/0.3.4.md +36 -0
  14. package/release-notes/mcp/0.4.0.md +27 -0
  15. package/release-notes/testkit/1.2.15.md +23 -0
  16. package/skills/agents.md +25 -0
  17. package/skills/aws.md +107 -0
  18. package/skills/cdk.md +141 -0
  19. package/skills/cicd.md +152 -0
  20. package/skills/datadog.md +129 -0
  21. package/skills/debugging.md +148 -0
  22. package/skills/dns.md +134 -0
  23. package/skills/dynamodb.md +140 -0
  24. package/skills/errors.md +142 -0
  25. package/skills/fabric.md +191 -0
  26. package/skills/index.md +7 -0
  27. package/skills/jaypie.md +100 -0
  28. package/skills/legacy.md +97 -0
  29. package/skills/logs.md +160 -0
  30. package/skills/mocks.md +174 -0
  31. package/skills/models.md +195 -0
  32. package/skills/releasenotes.md +94 -0
  33. package/skills/secrets.md +155 -0
  34. package/skills/services.md +175 -0
  35. package/skills/style.md +190 -0
  36. package/skills/tests.md +209 -0
  37. package/skills/tools.md +127 -0
  38. package/skills/topics.md +116 -0
  39. package/skills/variables.md +146 -0
  40. package/skills/writing.md +153 -0
  41. package/prompts/Branch_Management.md +0 -34
  42. package/prompts/Development_Process.md +0 -89
  43. package/prompts/Jaypie_Agent_Rules.md +0 -110
  44. package/prompts/Jaypie_Auth0_Express_Mongoose.md +0 -736
  45. package/prompts/Jaypie_Browser_and_Frontend_Web_Packages.md +0 -18
  46. package/prompts/Jaypie_CDK_Constructs_and_Patterns.md +0 -430
  47. package/prompts/Jaypie_CICD_with_GitHub_Actions.md +0 -371
  48. package/prompts/Jaypie_Commander_CLI_Package.md +0 -166
  49. package/prompts/Jaypie_Core_Errors_and_Logging.md +0 -39
  50. package/prompts/Jaypie_DynamoDB_Package.md +0 -774
  51. package/prompts/Jaypie_Eslint_NPM_Package.md +0 -78
  52. package/prompts/Jaypie_Express_Package.md +0 -630
  53. package/prompts/Jaypie_Fabric_Commander.md +0 -411
  54. package/prompts/Jaypie_Fabric_LLM.md +0 -312
  55. package/prompts/Jaypie_Fabric_Lambda.md +0 -308
  56. package/prompts/Jaypie_Fabric_MCP.md +0 -316
  57. package/prompts/Jaypie_Fabric_Package.md +0 -513
  58. package/prompts/Jaypie_Fabricator.md +0 -617
  59. package/prompts/Jaypie_Ideal_Project_Structure.md +0 -78
  60. package/prompts/Jaypie_Init_CICD_with_GitHub_Actions.md +0 -1186
  61. package/prompts/Jaypie_Init_Express_on_Lambda.md +0 -115
  62. package/prompts/Jaypie_Init_Jaypie_CDK_Package.md +0 -35
  63. package/prompts/Jaypie_Init_Lambda_Package.md +0 -505
  64. package/prompts/Jaypie_Init_Monorepo_Project.md +0 -44
  65. package/prompts/Jaypie_Init_Project_Subpackage.md +0 -65
  66. package/prompts/Jaypie_Legacy_Patterns.md +0 -15
  67. package/prompts/Jaypie_Llm_Calls.md +0 -449
  68. package/prompts/Jaypie_Llm_Tools.md +0 -155
  69. package/prompts/Jaypie_MCP_Package.md +0 -281
  70. package/prompts/Jaypie_Mocks_and_Testkit.md +0 -137
  71. package/prompts/Jaypie_Repokit.md +0 -103
  72. package/prompts/Jaypie_Scrub.md +0 -177
  73. package/prompts/Jaypie_Streaming.md +0 -467
  74. package/prompts/Templates_CDK_Subpackage.md +0 -115
  75. package/prompts/Templates_Express_Subpackage.md +0 -187
  76. package/prompts/Templates_Project_Monorepo.md +0 -326
  77. package/prompts/Templates_Project_Subpackage.md +0 -93
  78. package/prompts/Write_Efficient_Prompt_Guides.md +0 -48
  79. package/prompts/Write_and_Maintain_Engaging_Readme.md +0 -67
@@ -0,0 +1,190 @@
1
+ ---
2
+ description: Code style conventions and patterns
3
+ related: errors, tests
4
+ ---
5
+
6
+ # Code Style
7
+
8
+ Jaypie coding conventions and patterns.
9
+
10
+ ## General Rules
11
+
12
+ ### TypeScript Everywhere
13
+
14
+ Use TypeScript for all code:
15
+
16
+ ```typescript
17
+ // GOOD
18
+ function greet(name: string): string {
19
+ return `Hello, ${name}!`;
20
+ }
21
+
22
+ // BAD
23
+ function greet(name) {
24
+ return `Hello, ${name}!`;
25
+ }
26
+ ```
27
+
28
+ ### ESM Over CommonJS
29
+
30
+ Use ES modules:
31
+
32
+ ```typescript
33
+ // GOOD
34
+ import { log } from "jaypie";
35
+ export function myFunction() {}
36
+
37
+ // BAD
38
+ const { log } = require("jaypie");
39
+ module.exports = { myFunction };
40
+ ```
41
+
42
+ ### Alphabetize Everything
43
+
44
+ Alphabetize imports, object keys, exports:
45
+
46
+ ```typescript
47
+ // GOOD
48
+ import { ConfigurationError, log, NotFoundError } from "jaypie";
49
+
50
+ const config = {
51
+ apiKey: "...",
52
+ baseUrl: "...",
53
+ timeout: 5000,
54
+ };
55
+
56
+ // BAD
57
+ import { NotFoundError, log, ConfigurationError } from "jaypie";
58
+ ```
59
+
60
+ ## Function Signatures
61
+
62
+ ### Object Parameters
63
+
64
+ Use destructured objects for multiple parameters:
65
+
66
+ ```typescript
67
+ // GOOD
68
+ function createUser({ email, name, role }: CreateUserInput) {}
69
+
70
+ // GOOD (single required + optional config)
71
+ function fetchData(url: string, { timeout, retries }: FetchOptions = {}) {}
72
+
73
+ // BAD (multiple positional parameters)
74
+ function createUser(email: string, name: string, role: string) {}
75
+ ```
76
+
77
+ ### Allow Zero Arguments
78
+
79
+ Functions with optional config should allow no arguments:
80
+
81
+ ```typescript
82
+ // GOOD
83
+ function initialize(options: InitOptions = {}) {
84
+ const { timeout = 5000, retries = 3 } = options;
85
+ }
86
+
87
+ // Call with or without args
88
+ initialize();
89
+ initialize({ timeout: 10000 });
90
+ ```
91
+
92
+ ## Constants
93
+
94
+ ### File-Level Constants
95
+
96
+ Use SCREAMING_SNAKE_CASE for constants:
97
+
98
+ ```typescript
99
+ const DEFAULT_TIMEOUT = 5000;
100
+ const DATADOG_SITE = "datadoghq.com";
101
+ const HTTP_STATUS = {
102
+ OK: 200,
103
+ NOT_FOUND: 404,
104
+ } as const;
105
+ ```
106
+
107
+ ### Magic Numbers
108
+
109
+ Never use magic numbers inline:
110
+
111
+ ```typescript
112
+ // BAD
113
+ if (retries > 3) { ... }
114
+ await sleep(5000);
115
+
116
+ // GOOD
117
+ const MAX_RETRIES = 3;
118
+ const RETRY_DELAY_MS = 5000;
119
+
120
+ if (retries > MAX_RETRIES) { ... }
121
+ await sleep(RETRY_DELAY_MS);
122
+ ```
123
+
124
+ ## Error Handling
125
+
126
+ ### Never Vanilla Error
127
+
128
+ ```typescript
129
+ // BAD
130
+ throw new Error("Missing config");
131
+
132
+ // GOOD
133
+ import { ConfigurationError } from "jaypie";
134
+ throw new ConfigurationError("Missing config");
135
+ ```
136
+
137
+ ### Error Context
138
+
139
+ Include relevant context:
140
+
141
+ ```typescript
142
+ throw new NotFoundError("User not found", {
143
+ context: { userId, searchedAt: new Date() }
144
+ });
145
+ ```
146
+
147
+ ## Avoid Over-Engineering
148
+
149
+ ### No Premature Abstraction
150
+
151
+ ```typescript
152
+ // BAD - Unnecessary abstraction for one use
153
+ const formatName = (name) => name.toUpperCase();
154
+ const processUser = (user) => ({ ...user, name: formatName(user.name) });
155
+
156
+ // GOOD - Simple and direct
157
+ const processUser = (user) => ({ ...user, name: user.name.toUpperCase() });
158
+ ```
159
+
160
+ ### Minimal Changes
161
+
162
+ Only modify what's requested:
163
+
164
+ - Bug fix? Fix the bug, nothing else.
165
+ - Add feature? Add only that feature.
166
+ - Don't add docstrings to unchanged code.
167
+ - Don't refactor surrounding code.
168
+
169
+ ## Naming Conventions
170
+
171
+ | Type | Convention | Example |
172
+ |------|-----------|---------|
173
+ | Functions | camelCase | `getUser`, `createOrder` |
174
+ | Classes | PascalCase | `UserService`, `OrderModel` |
175
+ | Constants | SCREAMING_SNAKE | `MAX_RETRIES`, `API_URL` |
176
+ | Files | kebab-case | `user-service.ts`, `order-model.ts` |
177
+ | Types/Interfaces | PascalCase | `UserInput`, `IUserService` |
178
+
179
+ ## Lint Rules
180
+
181
+ Use `@jaypie/eslint`:
182
+
183
+ ```javascript
184
+ // eslint.config.mjs
185
+ import jaypie from "@jaypie/eslint";
186
+ export default [...jaypie];
187
+ ```
188
+
189
+ Always run `npm run format` before committing.
190
+
@@ -0,0 +1,209 @@
1
+ ---
2
+ description: Testing patterns with Vitest
3
+ related: mocks, errors
4
+ ---
5
+
6
+ # Testing Patterns
7
+
8
+ Jaypie uses Vitest for testing with specific patterns and mocks.
9
+
10
+ ## Setup
11
+
12
+ ### vitest.config.ts
13
+
14
+ ```typescript
15
+ import { defineConfig } from "vitest/config";
16
+
17
+ export default defineConfig({
18
+ test: {
19
+ coverage: {
20
+ reporter: ["text", "json", "html"],
21
+ },
22
+ globals: true,
23
+ setupFiles: ["./vitest.setup.ts"],
24
+ },
25
+ });
26
+ ```
27
+
28
+ ### vitest.setup.ts
29
+
30
+ ```typescript
31
+ import { vi } from "vitest";
32
+
33
+ vi.mock("jaypie", async () => {
34
+ const { mockJaypie } = await import("@jaypie/testkit");
35
+ return mockJaypie(vi);
36
+ });
37
+ ```
38
+
39
+ ## Test Structure
40
+
41
+ ### File Organization
42
+
43
+ ```
44
+ src/
45
+ ├── services/
46
+ │ └── user.ts
47
+ └── __tests__/
48
+ └── user.spec.ts
49
+
50
+ # Or co-located:
51
+ src/
52
+ └── services/
53
+ ├── user.ts
54
+ └── user.spec.ts
55
+ ```
56
+
57
+ ### Test File Pattern
58
+
59
+ ```typescript
60
+ import { describe, expect, it, vi, beforeEach } from "vitest";
61
+
62
+ describe("UserService", () => {
63
+ describe("getUser", () => {
64
+ it("returns user when found", async () => {
65
+ // Arrange
66
+ const mockUser = { id: "123", name: "John" };
67
+ vi.mocked(User.findById).mockResolvedValue(mockUser);
68
+
69
+ // Act
70
+ const result = await getUser("123");
71
+
72
+ // Assert
73
+ expect(result).toEqual(mockUser);
74
+ });
75
+ });
76
+ });
77
+ ```
78
+
79
+ ## Running Tests
80
+
81
+ ```bash
82
+ # Run all tests (non-watch mode)
83
+ npm test
84
+
85
+ # Run specific package
86
+ npm test -w packages/my-package
87
+
88
+ # Watch mode (development)
89
+ npx vitest
90
+
91
+ # With coverage
92
+ npm test -- --coverage
93
+ ```
94
+
95
+ **Important**: Always use `npm test` or `vitest run`, not bare `vitest` which runs in watch mode.
96
+
97
+ ## Mocking
98
+
99
+ ### Module Mocks
100
+
101
+ ```typescript
102
+ vi.mock("./user-service.js", () => ({
103
+ getUser: vi.fn(),
104
+ createUser: vi.fn(),
105
+ }));
106
+
107
+ // Access mocked functions
108
+ import { getUser } from "./user-service.js";
109
+
110
+ vi.mocked(getUser).mockResolvedValue({ id: "123" });
111
+ ```
112
+
113
+ ### Jaypie Mocks
114
+
115
+ ```typescript
116
+ import { log, getSecret } from "jaypie";
117
+
118
+ it("logs the operation", async () => {
119
+ await myFunction();
120
+ expect(log.info).toHaveBeenCalledWith("Operation started");
121
+ });
122
+
123
+ it("uses secrets", async () => {
124
+ vi.mocked(getSecret).mockResolvedValue("test-key");
125
+ await myFunction();
126
+ expect(getSecret).toHaveBeenCalledWith("api-key");
127
+ });
128
+ ```
129
+
130
+ ## Testing Errors
131
+
132
+ ```typescript
133
+ import { NotFoundError } from "jaypie";
134
+
135
+ it("throws NotFoundError when user missing", async () => {
136
+ vi.mocked(User.findById).mockResolvedValue(null);
137
+
138
+ await expect(getUser("invalid")).rejects.toThrow(NotFoundError);
139
+ });
140
+
141
+ it("includes error context", async () => {
142
+ vi.mocked(User.findById).mockResolvedValue(null);
143
+
144
+ try {
145
+ await getUser("invalid");
146
+ expect.fail("Should have thrown");
147
+ } catch (error) {
148
+ expect(error.context.userId).toBe("invalid");
149
+ }
150
+ });
151
+ ```
152
+
153
+ ## Async Testing
154
+
155
+ ```typescript
156
+ it("handles async operations", async () => {
157
+ const result = await asyncFunction();
158
+ expect(result).toBeDefined();
159
+ });
160
+
161
+ it("handles promises", () => {
162
+ return expect(asyncFunction()).resolves.toBeDefined();
163
+ });
164
+
165
+ it("handles rejections", () => {
166
+ return expect(failingFunction()).rejects.toThrow();
167
+ });
168
+ ```
169
+
170
+ ## Before/After Hooks
171
+
172
+ ```typescript
173
+ describe("UserService", () => {
174
+ beforeEach(() => {
175
+ vi.clearAllMocks();
176
+ });
177
+
178
+ afterEach(() => {
179
+ vi.resetAllMocks();
180
+ });
181
+
182
+ beforeAll(async () => {
183
+ // One-time setup
184
+ });
185
+
186
+ afterAll(async () => {
187
+ // One-time cleanup
188
+ });
189
+ });
190
+ ```
191
+
192
+ ## Snapshot Testing
193
+
194
+ ```typescript
195
+ it("renders expected output", () => {
196
+ const result = buildConfig({ env: "production" });
197
+ expect(result).toMatchSnapshot();
198
+ });
199
+ ```
200
+
201
+ ## Test Coverage
202
+
203
+ Aim for meaningful coverage, not 100%:
204
+
205
+ - Test business logic thoroughly
206
+ - Test error paths
207
+ - Skip trivial getters/setters
208
+ - Skip generated code
209
+
@@ -0,0 +1,127 @@
1
+ ---
2
+ description: Available MCP tools reference
3
+ related: aws, datadog, debugging
4
+ ---
5
+
6
+ # MCP Tools Reference
7
+
8
+ Tools available through the Jaypie MCP server.
9
+
10
+ ## Documentation Tools
11
+
12
+ | Tool | Description |
13
+ |------|-------------|
14
+ | `skill` | Access Jaypie skill documentation |
15
+ | `list_prompts` | List prompt files (deprecated, use skill) |
16
+ | `read_prompt` | Read prompt file (deprecated, use skill) |
17
+ | `version` | Get MCP server version |
18
+ | `list_release_notes` | List package release notes |
19
+ | `read_release_note` | Read specific release note |
20
+
21
+ ### Using Skills
22
+
23
+ ```
24
+ skill("index") # List all skills
25
+ skill("jaypie") # Jaypie overview
26
+ skill("tests") # Testing patterns
27
+ ```
28
+
29
+ ## AWS Tools
30
+
31
+ | Tool | Description |
32
+ |------|-------------|
33
+ | `aws_list_profiles` | List AWS profiles from ~/.aws |
34
+ | `aws_lambda_list_functions` | List Lambda functions |
35
+ | `aws_lambda_get_function` | Get Lambda function details |
36
+ | `aws_logs_filter_log_events` | Search CloudWatch Logs |
37
+ | `aws_s3_list_objects` | List S3 bucket objects |
38
+ | `aws_cloudformation_describe_stack` | Get CloudFormation stack details |
39
+
40
+ ### DynamoDB
41
+
42
+ | Tool | Description |
43
+ |------|-------------|
44
+ | `aws_dynamodb_describe_table` | Get table metadata |
45
+ | `aws_dynamodb_query` | Query by partition key |
46
+ | `aws_dynamodb_scan` | Full table scan |
47
+ | `aws_dynamodb_get_item` | Get single item |
48
+
49
+ ### SQS
50
+
51
+ | Tool | Description |
52
+ |------|-------------|
53
+ | `aws_sqs_list_queues` | List SQS queues |
54
+ | `aws_sqs_get_queue_attributes` | Get queue attributes |
55
+ | `aws_sqs_receive_message` | Peek at messages |
56
+ | `aws_sqs_purge_queue` | Delete all messages |
57
+
58
+ ### Step Functions
59
+
60
+ | Tool | Description |
61
+ |------|-------------|
62
+ | `aws_stepfunctions_list_executions` | List state machine executions |
63
+ | `aws_stepfunctions_stop_execution` | Stop running execution |
64
+
65
+ ## Datadog Tools
66
+
67
+ | Tool | Description |
68
+ |------|-------------|
69
+ | `datadog_logs` | Search log entries |
70
+ | `datadog_log_analytics` | Aggregate logs with groupBy |
71
+ | `datadog_monitors` | List and check monitors |
72
+ | `datadog_synthetics` | List synthetic tests |
73
+ | `datadog_metrics` | Query timeseries metrics |
74
+ | `datadog_rum` | Search RUM events |
75
+
76
+ ## LLM Tools
77
+
78
+ | Tool | Description |
79
+ |------|-------------|
80
+ | `llm_debug_call` | Debug LLM API call |
81
+ | `llm_list_providers` | List available LLM providers |
82
+
83
+ ## Environment Variables
84
+
85
+ ### AWS Tools
86
+ - `AWS_PROFILE` - Default profile
87
+ - `AWS_REGION` - Default region
88
+
89
+ ### Datadog Tools
90
+ - `DATADOG_API_KEY` or `DD_API_KEY` - API key
91
+ - `DATADOG_APP_KEY` or `DD_APP_KEY` - App key
92
+ - `DD_ENV` - Default environment filter
93
+ - `DD_SERVICE` - Default service filter
94
+ - `DD_SOURCE` - Default log source
95
+
96
+ ## Common Patterns
97
+
98
+ ### Debug Lambda Issues
99
+
100
+ ```
101
+ # Check function config
102
+ aws_lambda_get_function --functionName "my-function"
103
+
104
+ # Search recent logs
105
+ aws_logs_filter_log_events --logGroupName "/aws/lambda/my-function" --filterPattern "ERROR"
106
+
107
+ # Or via Datadog
108
+ datadog_logs --query "service:my-function status:error" --from "now-1h"
109
+ ```
110
+
111
+ ### Check Queue Health
112
+
113
+ ```
114
+ # Get queue depth
115
+ aws_sqs_get_queue_attributes --queueUrl "https://..."
116
+
117
+ # Peek at messages
118
+ aws_sqs_receive_message --queueUrl "https://..." --maxNumberOfMessages 5
119
+ ```
120
+
121
+ ### Monitor Status
122
+
123
+ ```
124
+ # Check alerting monitors
125
+ datadog_monitors --status '["Alert", "Warn"]'
126
+ ```
127
+
@@ -0,0 +1,116 @@
1
+ ---
2
+ description: Topic index and cross-reference
3
+ ---
4
+
5
+ # Topic Index
6
+
7
+ Quick reference for finding the right skill for your task.
8
+
9
+ ## By Task
10
+
11
+ ### Starting a New Project
12
+ - `skill("jaypie")` - Jaypie overview
13
+ - `skill("style")` - Code conventions
14
+ - `skill("cdk")` - Infrastructure setup
15
+
16
+ ### Writing Code
17
+ - `skill("style")` - Code style
18
+ - `skill("errors")` - Error handling
19
+ - `skill("services")` - Service patterns
20
+ - `skill("models")` - Data models
21
+
22
+ ### Testing
23
+ - `skill("tests")` - Vitest patterns
24
+ - `skill("mocks")` - @jaypie/testkit mocks
25
+
26
+ ### Deploying
27
+ - `skill("cdk")` - CDK constructs
28
+ - `skill("cicd")` - GitHub Actions
29
+ - `skill("variables")` - Environment config
30
+
31
+ ### Debugging
32
+ - `skill("debugging")` - Debug techniques
33
+ - `skill("logs")` - Log searching
34
+ - `skill("datadog")` - Observability tools
35
+
36
+ ### AWS Integration
37
+ - `skill("aws")` - AWS tools overview
38
+ - `skill("dynamodb")` - DynamoDB patterns
39
+ - `skill("secrets")` - Secret management
40
+
41
+ ## By Package
42
+
43
+ ### jaypie (main package)
44
+ - `skill("jaypie")` - Overview
45
+ - `skill("errors")` - Error types
46
+ - `skill("logs")` - Logging
47
+ - `skill("secrets")` - Secret access
48
+
49
+ ### @jaypie/constructs
50
+ - `skill("cdk")` - CDK constructs
51
+
52
+ ### @jaypie/testkit
53
+ - `skill("mocks")` - Mock patterns
54
+ - `skill("tests")` - Test patterns
55
+
56
+ ### @jaypie/fabric
57
+ - `skill("fabric")` - Service patterns
58
+ - `skill("services")` - Service layer
59
+
60
+ ### Legacy Packages
61
+ - `skill("legacy")` - Deprecated patterns
62
+
63
+ ## By Concept
64
+
65
+ ### Error Handling
66
+ - `skill("errors")` - Error types and usage
67
+
68
+ ### Environment Configuration
69
+ - `skill("variables")` - Environment variables
70
+ - `skill("secrets")` - Secret management
71
+
72
+ ### Infrastructure
73
+ - `skill("cdk")` - CDK constructs
74
+ - `skill("aws")` - AWS integration
75
+ - `skill("dns")` - Domain configuration
76
+
77
+ ### Observability
78
+ - `skill("logs")` - Logging patterns
79
+ - `skill("datadog")` - Datadog integration
80
+ - `skill("debugging")` - Debug techniques
81
+
82
+ ### Data
83
+ - `skill("models")` - Data models and types
84
+ - `skill("dynamodb")` - DynamoDB patterns
85
+
86
+ ## Quick Answers
87
+
88
+ ### "How do I throw an error?"
89
+ ```typescript
90
+ import { NotFoundError } from "jaypie";
91
+ throw new NotFoundError("Item not found");
92
+ ```
93
+ See: `skill("errors")`
94
+
95
+ ### "How do I mock Jaypie in tests?"
96
+ ```typescript
97
+ vi.mock("jaypie", async () => {
98
+ const { mockJaypie } = await import("@jaypie/testkit");
99
+ return mockJaypie(vi);
100
+ });
101
+ ```
102
+ See: `skill("mocks")`
103
+
104
+ ### "How do I get a secret?"
105
+ ```typescript
106
+ import { getSecret } from "jaypie";
107
+ const apiKey = await getSecret("my-api-key");
108
+ ```
109
+ See: `skill("secrets")`
110
+
111
+ ### "How do I log with context?"
112
+ ```typescript
113
+ import { log } from "jaypie";
114
+ log.info("Operation completed", { userId, duration });
115
+ ```
116
+ See: `skill("logs")`