@outfitter/presets 0.2.0 → 0.3.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 (74) hide show
  1. package/README.md +30 -0
  2. package/dist/index.js +1 -1
  3. package/package.json +25 -24
  4. package/presets/_base/AGENTS.md.template +3 -0
  5. package/presets/_base/CLAUDE.md.template +35 -0
  6. package/presets/_examples/cli-todo/src/program.ts.template +202 -0
  7. package/presets/_examples/mcp-files/src/mcp.ts.template +181 -0
  8. package/presets/basic/.lefthook.yml.template +2 -2
  9. package/presets/basic/README.md.template +22 -0
  10. package/presets/basic/package.json.template +41 -37
  11. package/presets/basic/src/index.test.ts.template +26 -0
  12. package/presets/basic/src/index.ts.template +32 -15
  13. package/presets/basic/tsconfig.json.template +28 -29
  14. package/presets/cli/.lefthook.yml.template +2 -2
  15. package/presets/cli/CLAUDE.md.template +60 -0
  16. package/presets/cli/README.md.template +5 -1
  17. package/presets/cli/package.json.template +47 -44
  18. package/presets/cli/src/commands/hello.ts.template +26 -0
  19. package/presets/cli/src/index.test.ts.template +38 -0
  20. package/presets/cli/src/index.ts.template +2 -0
  21. package/presets/cli/src/program.ts.template +17 -19
  22. package/presets/cli/src/types.ts.template +13 -0
  23. package/presets/cli/tsconfig.json.template +29 -29
  24. package/presets/daemon/.lefthook.yml.template +2 -2
  25. package/presets/daemon/CLAUDE.md.template +53 -0
  26. package/presets/daemon/README.md.template +6 -7
  27. package/presets/daemon/package.json.template +50 -47
  28. package/presets/daemon/src/cli.ts.template +73 -66
  29. package/presets/daemon/src/daemon-main.ts.template +56 -55
  30. package/presets/daemon/src/daemon.ts.template +7 -3
  31. package/presets/daemon/src/index.test.ts.template +9 -0
  32. package/presets/daemon/tsconfig.json.template +21 -21
  33. package/presets/full-stack/CLAUDE.md.template +66 -0
  34. package/presets/full-stack/apps/cli/package.json.template +34 -33
  35. package/presets/full-stack/apps/cli/src/cli.ts.template +16 -15
  36. package/presets/full-stack/apps/cli/src/index.test.ts.template +12 -11
  37. package/presets/full-stack/apps/cli/tsconfig.json.template +32 -32
  38. package/presets/full-stack/apps/mcp/package.json.template +35 -34
  39. package/presets/full-stack/apps/mcp/src/index.test.ts.template +12 -11
  40. package/presets/full-stack/apps/mcp/src/mcp.ts.template +10 -10
  41. package/presets/full-stack/apps/mcp/src/server.ts.template +3 -2
  42. package/presets/full-stack/apps/mcp/tsconfig.json.template +32 -32
  43. package/presets/full-stack/package.json.template +20 -14
  44. package/presets/full-stack/packages/core/package.json.template +31 -30
  45. package/presets/full-stack/packages/core/src/handlers.ts.template +29 -24
  46. package/presets/full-stack/packages/core/src/index.test.ts.template +23 -21
  47. package/presets/full-stack/packages/core/src/types.ts.template +11 -8
  48. package/presets/full-stack/packages/core/tsconfig.json.template +29 -29
  49. package/presets/library/CLAUDE.md.template +68 -0
  50. package/presets/library/bunup.config.ts.template +16 -16
  51. package/presets/library/package.json.template +51 -50
  52. package/presets/library/src/handlers.ts.template +51 -27
  53. package/presets/library/src/index.test.ts.template +40 -29
  54. package/presets/library/src/types.ts.template +14 -8
  55. package/presets/library/tsconfig.json.template +29 -29
  56. package/presets/mcp/.lefthook.yml.template +2 -2
  57. package/presets/mcp/CLAUDE.md.template +97 -0
  58. package/presets/mcp/README.md.template +12 -9
  59. package/presets/mcp/package.json.template +48 -44
  60. package/presets/mcp/src/index.test.ts.template +49 -0
  61. package/presets/mcp/src/index.ts.template +2 -0
  62. package/presets/mcp/src/mcp.ts.template +16 -16
  63. package/presets/mcp/src/server.ts.template +8 -1
  64. package/presets/mcp/src/tools/hello.ts.template +48 -0
  65. package/presets/mcp/tsconfig.json.template +21 -21
  66. package/presets/minimal/.lefthook.yml.template +2 -2
  67. package/presets/minimal/README.md.template +22 -0
  68. package/presets/minimal/package.json.template +47 -44
  69. package/presets/minimal/src/index.test.ts.template +19 -0
  70. package/presets/minimal/src/index.ts.template +10 -15
  71. package/presets/minimal/tsconfig.json.template +28 -29
  72. package/presets/cli/biome.json.template +0 -4
  73. package/presets/daemon/biome.json.template +0 -4
  74. package/presets/mcp/biome.json.template +0 -4
package/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # @outfitter/presets
2
+
3
+ Scaffold presets and shared dependency versions for Outfitter projects.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ bun add -d @outfitter/presets
9
+ ```
10
+
11
+ ## Overview
12
+
13
+ This package provides:
14
+
15
+ - **Scaffold presets** -- Template configurations used by `outfitter add` to generate project boilerplate
16
+ - **Shared dependency versions** -- Catalog-resolved dependency versions ensuring consistency across Outfitter projects
17
+
18
+ ## Usage
19
+
20
+ Presets are consumed by the `outfitter` CLI during scaffolding:
21
+
22
+ ```bash
23
+ npx outfitter add <preset-name>
24
+ ```
25
+
26
+ For programmatic access to preset metadata:
27
+
28
+ ```typescript
29
+ import { presets } from "@outfitter/presets";
30
+ ```
package/dist/index.js CHANGED
@@ -22,7 +22,7 @@ function listPresets() {
22
22
  return readdirSync(presetsDir, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => ({
23
23
  name: entry.name,
24
24
  path: join(presetsDir, entry.name)
25
- })).sort((a, b) => a.name.localeCompare(b.name));
25
+ })).toSorted((a, b) => a.name.localeCompare(b.name));
26
26
  }
27
27
  function getPresetPath(presetName) {
28
28
  const presetsDir = getPresetsDir();
package/package.json CHANGED
@@ -1,12 +1,25 @@
1
1
  {
2
2
  "name": "@outfitter/presets",
3
+ "version": "0.3.0",
3
4
  "description": "Scaffold presets and shared dependency versions for Outfitter projects",
4
- "version": "0.2.0",
5
- "type": "module",
5
+ "keywords": [
6
+ "outfitter",
7
+ "presets",
8
+ "scaffolding",
9
+ "templates",
10
+ "versions"
11
+ ],
12
+ "license": "MIT",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/outfitter-dev/outfitter.git",
16
+ "directory": "packages/presets"
17
+ },
6
18
  "files": [
7
19
  "dist",
8
20
  "presets"
9
21
  ],
22
+ "type": "module",
10
23
  "module": "./dist/index.js",
11
24
  "types": "./dist/index.d.ts",
12
25
  "exports": {
@@ -18,8 +31,14 @@
18
31
  },
19
32
  "./package.json": "./package.json"
20
33
  },
34
+ "scripts": {
35
+ "build": "cd ../.. && bash ./scripts/run-bunup-with-lock.sh bunup --filter @outfitter/presets",
36
+ "clean": "rm -rf dist .turbo",
37
+ "test": "bun test",
38
+ "typecheck": "tsc --noEmit",
39
+ "prepublishOnly": "bun ../../scripts/check-publish-manifest.ts"
40
+ },
21
41
  "dependencies": {
22
- "@biomejs/biome": "2.4.4",
23
42
  "@clack/prompts": "^1.0.1",
24
43
  "@logtape/logtape": "^2.0.0",
25
44
  "@modelcontextprotocol/sdk": "^1.12.1",
@@ -28,6 +47,8 @@
28
47
  "bunup": "^0.16.29",
29
48
  "commander": "^14.0.2",
30
49
  "lefthook": "^2.1.1",
50
+ "oxfmt": "0.35.0",
51
+ "oxlint": "1.50.0",
31
52
  "smol-toml": "^1.6.0",
32
53
  "ultracite": "7.2.3",
33
54
  "yaml": "^2.8.2",
@@ -38,26 +59,6 @@
38
59
  "typescript": "^5.9.3"
39
60
  },
40
61
  "engines": {
41
- "bun": ">=1.3.9"
42
- },
43
- "keywords": [
44
- "outfitter",
45
- "presets",
46
- "scaffolding",
47
- "templates",
48
- "versions"
49
- ],
50
- "license": "MIT",
51
- "repository": {
52
- "type": "git",
53
- "url": "https://github.com/outfitter-dev/stack.git",
54
- "directory": "packages/presets"
55
- },
56
- "scripts": {
57
- "build": "cd ../.. && bunup --filter @outfitter/presets",
58
- "clean": "rm -rf dist .turbo",
59
- "test": "bun test",
60
- "typecheck": "tsc --noEmit",
61
- "prepublishOnly": "bun ../../scripts/check-publish-manifest.ts"
62
+ "bun": ">=1.3.10"
62
63
  }
63
64
  }
@@ -0,0 +1,3 @@
1
+ # AGENTS.md
2
+
3
+ @CLAUDE.md
@@ -0,0 +1,35 @@
1
+ # CLAUDE.md
2
+
3
+ Bun-first TypeScript project. Tests before code. Result types, not exceptions.
4
+
5
+ ## Commands
6
+
7
+ ```bash
8
+ bun run build # Build the project
9
+ bun run dev # Watch mode (auto-restart on changes)
10
+ bun run test # Run tests
11
+ bun run typecheck # TypeScript validation
12
+ bun run check # Lint + format check
13
+ bun run lint:fix # Auto-fix lint issues
14
+ bun run format # Auto-fix formatting
15
+ bun run verify:ci # Full CI validation (typecheck + check + build + test)
16
+ ```
17
+
18
+ ## Architecture
19
+
20
+ Single-package TypeScript project built with Bun.
21
+
22
+ Handlers are pure functions returning `Result<T, E>`. Write the handler once, test it directly.
23
+
24
+ ## Development Principles
25
+
26
+ - **TDD-First** — Write the test before the code (Red / Green / Refactor)
27
+ - **Result Types** — Handlers return `Result<T, E>`, not exceptions
28
+ - **Bun-First** — Use Bun-native APIs before npm packages
29
+ - **Strict TypeScript** — No `any`, no `as` casts; narrow instead of assert
30
+
31
+ ## Testing
32
+
33
+ - Runner: Bun test runner
34
+ - Files: `src/*.test.ts`
35
+ - Run: `bun test` or `bun run test`
@@ -0,0 +1,202 @@
1
+ /**
2
+ * {{projectName}} - CLI program definition
3
+ *
4
+ * Demonstrates the v0.5 builder pattern:
5
+ * - `.input(schema)` for Zod-to-Commander auto-derived flags
6
+ * - `runHandler()` for the full lifecycle bridge
7
+ * - `contextFactory` + `hints` passed in one canonical place
8
+ */
9
+
10
+ import { command, createCLI } from "@outfitter/cli/command";
11
+ import { runHandler } from "@outfitter/cli/envelope";
12
+ import type { CLIHint } from "@outfitter/contracts";
13
+ import { Result } from "@outfitter/contracts";
14
+ import { createLogger } from "@outfitter/logging";
15
+ import { z } from "zod";
16
+
17
+ const logger = createLogger({ name: "{{binName}}" });
18
+
19
+ // =============================================================================
20
+ // Domain Types
21
+ // =============================================================================
22
+
23
+ interface Todo {
24
+ readonly id: number;
25
+ readonly title: string;
26
+ readonly done: boolean;
27
+ }
28
+
29
+ /** In-memory store (replace with file/DB in a real app). */
30
+ const store: Todo[] = [];
31
+ let nextId = 1;
32
+
33
+ // =============================================================================
34
+ // Context
35
+ // =============================================================================
36
+
37
+ /**
38
+ * Shared context constructed once per command invocation.
39
+ * The `.context()` builder method calls this factory with the validated input.
40
+ */
41
+ interface TodoContext {
42
+ readonly count: number;
43
+ readonly pendingCount: number;
44
+ }
45
+
46
+ async function buildTodoContext(): Promise<TodoContext> {
47
+ return {
48
+ count: store.length,
49
+ pendingCount: store.filter((t) => !t.done).length,
50
+ };
51
+ }
52
+
53
+ // =============================================================================
54
+ // Schemas
55
+ // =============================================================================
56
+
57
+ const addInputSchema = z.object({
58
+ title: z.string().describe("Title of the todo item"),
59
+ });
60
+
61
+ const completeInputSchema = z.object({
62
+ id: z.number().describe("ID of the todo to complete"),
63
+ });
64
+
65
+ const listInputSchema = z.object({
66
+ all: z.boolean().default(false).describe("Show completed todos too"),
67
+ });
68
+
69
+ // =============================================================================
70
+ // Hint Functions
71
+ // =============================================================================
72
+
73
+ function addHints(
74
+ _result: unknown,
75
+ _input: z.infer<typeof addInputSchema>
76
+ ): CLIHint[] {
77
+ return [
78
+ { description: "List your todos", command: "{{binName}} list" },
79
+ {
80
+ description: "Add another todo",
81
+ command: `{{binName}} add --title "next task"`,
82
+ },
83
+ ];
84
+ }
85
+
86
+ function completeHints(
87
+ _result: unknown,
88
+ _input: z.infer<typeof completeInputSchema>
89
+ ): CLIHint[] {
90
+ return [
91
+ { description: "List remaining todos", command: "{{binName}} list" },
92
+ {
93
+ description: "Show all including completed",
94
+ command: "{{binName}} list --all",
95
+ },
96
+ ];
97
+ }
98
+
99
+ // =============================================================================
100
+ // CLI Program
101
+ // =============================================================================
102
+
103
+ export const program = createCLI({
104
+ name: "{{binName}}",
105
+ version: "{{version}}",
106
+ description: "{{description}}",
107
+ });
108
+
109
+ /**
110
+ * `add` — Create a new todo item.
111
+ *
112
+ * Uses `.input()` to auto-derive `--title` from the Zod schema and
113
+ * `runHandler()` to provide context + hints in one place.
114
+ */
115
+ program.register(
116
+ command("add")
117
+ .description("Add a new todo item")
118
+ .input(addInputSchema)
119
+ .action(async ({ input }) => {
120
+ await runHandler({
121
+ command: "add",
122
+ input,
123
+ format: "json",
124
+ contextFactory: buildTodoContext,
125
+ hints: addHints,
126
+ handler: async (inp, context) => {
127
+ const todo: Todo = { id: nextId++, title: inp.title, done: false };
128
+ store.push(todo);
129
+ logger.info(`Added todo #${todo.id}: ${todo.title}`);
130
+ return Result.ok({
131
+ id: todo.id,
132
+ title: todo.title,
133
+ pending: context.pendingCount + 1,
134
+ });
135
+ },
136
+ });
137
+ })
138
+ );
139
+
140
+ /**
141
+ * `list` — Show current todo items.
142
+ *
143
+ * Uses `.input()` with a boolean flag auto-derived from the schema.
144
+ */
145
+ program.register(
146
+ command("list")
147
+ .description("List todo items")
148
+ .input(listInputSchema)
149
+ .action(async ({ input }) => {
150
+ await runHandler({
151
+ command: "list",
152
+ input,
153
+ format: "json",
154
+ contextFactory: buildTodoContext,
155
+ handler: async (inp, context) => {
156
+ const items = inp.all ? store : store.filter((t) => !t.done);
157
+ return Result.ok({
158
+ items: items.map((t) => ({
159
+ id: t.id,
160
+ title: t.title,
161
+ done: t.done,
162
+ })),
163
+ total: context.count,
164
+ pending: context.pendingCount,
165
+ });
166
+ },
167
+ });
168
+ })
169
+ );
170
+
171
+ /**
172
+ * `complete` — Mark a todo as done.
173
+ *
174
+ * Uses `.input()` with a number flag and delegates hints/error handling
175
+ * through `runHandler()`.
176
+ */
177
+ program.register(
178
+ command("complete")
179
+ .description("Mark a todo as completed")
180
+ .input(completeInputSchema)
181
+ .action(async ({ input }) => {
182
+ await runHandler({
183
+ command: "complete",
184
+ input,
185
+ format: "json",
186
+ contextFactory: buildTodoContext,
187
+ hints: completeHints,
188
+ onError: () => [
189
+ { description: "List available todos", command: "{{binName}} list" },
190
+ ],
191
+ handler: async (inp) => {
192
+ const todo = store.find((t) => t.id === inp.id);
193
+ if (!todo) {
194
+ return Result.err(new Error(`Todo #${inp.id} not found`));
195
+ }
196
+ (todo as { done: boolean }).done = true;
197
+ logger.info(`Completed todo #${todo.id}: ${todo.title}`);
198
+ return Result.ok({ id: todo.id, title: todo.title, done: true });
199
+ },
200
+ });
201
+ })
202
+ );
@@ -0,0 +1,181 @@
1
+ /**
2
+ * {{projectName}} - MCP server definition
3
+ *
4
+ * Demonstrates v0.5 MCP patterns:
5
+ * - `defineResource()` for static resources
6
+ * - `defineResourceTemplate()` with Zod schema validation for parameterized resources
7
+ * - `defineTool()` for file operations with Result patterns
8
+ */
9
+
10
+ import { Result } from "@outfitter/contracts";
11
+ import {
12
+ createMcpServer,
13
+ connectStdio,
14
+ defineResource,
15
+ defineResourceTemplate,
16
+ defineTool,
17
+ } from "@outfitter/mcp";
18
+ import { z } from "zod";
19
+
20
+ // =============================================================================
21
+ // In-memory file store (replace with real filesystem in production)
22
+ // =============================================================================
23
+
24
+ const files = new Map<string, string>([
25
+ ["README.md", "# {{projectName}}\n\nWelcome to the project."],
26
+ [
27
+ "config.json",
28
+ JSON.stringify({ name: "{{binName}}", version: "{{version}}" }, null, 2),
29
+ ],
30
+ ]);
31
+
32
+ // =============================================================================
33
+ // Resources — Static
34
+ // =============================================================================
35
+
36
+ /**
37
+ * List all known files as a static resource.
38
+ * Clients can read this resource to discover available files.
39
+ */
40
+ const fileListResource = defineResource({
41
+ uri: "files:///index",
42
+ name: "File Index",
43
+ description: "List of all available files in the workspace",
44
+ mimeType: "application/json",
45
+ handler: async (_uri, ctx) => {
46
+ ctx.logger.info("Listing files", { count: files.size });
47
+ const listing = [...files.keys()].map((name) => ({
48
+ name,
49
+ size: files.get(name)?.length ?? 0,
50
+ }));
51
+ return Result.ok([{ uri: _uri, text: JSON.stringify(listing, null, 2) }]);
52
+ },
53
+ });
54
+
55
+ // =============================================================================
56
+ // Resources — Parameterized (Templates)
57
+ // =============================================================================
58
+
59
+ /**
60
+ * Read a file by name using a URI template.
61
+ * Uses `defineResourceTemplate()` with Zod schema validation
62
+ * for the `filename` parameter.
63
+ */
64
+ const fileContentTemplate = defineResourceTemplate({
65
+ uriTemplate: "files:///{filename}",
66
+ name: "File Content",
67
+ description: "Read the content of a specific file",
68
+ mimeType: "text/plain",
69
+ paramSchema: z.object({
70
+ filename: z.string().describe("Name of the file to read"),
71
+ }),
72
+ handler: async (uri, params, ctx) => {
73
+ const { filename } = params as { filename: string };
74
+ ctx.logger.info("Reading file", { filename });
75
+
76
+ const content = files.get(filename);
77
+ if (content === undefined) {
78
+ return Result.err(new Error(`File not found: ${filename}`));
79
+ }
80
+
81
+ return Result.ok([{ uri, text: content }]);
82
+ },
83
+ });
84
+
85
+ // =============================================================================
86
+ // Tools — File Operations
87
+ // =============================================================================
88
+
89
+ /**
90
+ * Write content to a file.
91
+ * Demonstrates `defineTool()` with a Zod input schema and Result return.
92
+ */
93
+ const writeFileTool = defineTool({
94
+ name: "write_file",
95
+ description: "Write content to a file (creates or overwrites)",
96
+ inputSchema: z.object({
97
+ filename: z.string().describe("Name of the file to write"),
98
+ content: z.string().describe("Content to write to the file"),
99
+ }),
100
+ handler: async (input, ctx) => {
101
+ ctx.logger.info("Writing file", { filename: input.filename });
102
+ const existed = files.has(input.filename);
103
+ files.set(input.filename, input.content);
104
+ return Result.ok({
105
+ filename: input.filename,
106
+ action: existed ? "updated" : "created",
107
+ size: input.content.length,
108
+ });
109
+ },
110
+ });
111
+
112
+ /**
113
+ * Delete a file.
114
+ * Shows error handling with Result.err for missing files.
115
+ */
116
+ const deleteFileTool = defineTool({
117
+ name: "delete_file",
118
+ description: "Delete a file from the workspace",
119
+ inputSchema: z.object({
120
+ filename: z.string().describe("Name of the file to delete"),
121
+ }),
122
+ handler: async (input, ctx) => {
123
+ ctx.logger.info("Deleting file", { filename: input.filename });
124
+ if (!files.has(input.filename)) {
125
+ return Result.err(new Error(`File not found: ${input.filename}`));
126
+ }
127
+ files.delete(input.filename);
128
+ return Result.ok({ filename: input.filename, deleted: true });
129
+ },
130
+ });
131
+
132
+ /**
133
+ * Search files by content pattern.
134
+ * Demonstrates a read-only tool that queries the file store.
135
+ */
136
+ const searchFilesTool = defineTool({
137
+ name: "search_files",
138
+ description: "Search for files containing a text pattern",
139
+ inputSchema: z.object({
140
+ pattern: z.string().describe("Text pattern to search for"),
141
+ }),
142
+ handler: async (input, ctx) => {
143
+ ctx.logger.info("Searching files", { pattern: input.pattern });
144
+ const matches: Array<{ filename: string; lineCount: number }> = [];
145
+ for (const [name, content] of files) {
146
+ if (content.includes(input.pattern)) {
147
+ matches.push({ filename: name, lineCount: content.split("\n").length });
148
+ }
149
+ }
150
+ return Result.ok({
151
+ pattern: input.pattern,
152
+ matches,
153
+ total: matches.length,
154
+ });
155
+ },
156
+ });
157
+
158
+ // =============================================================================
159
+ // Server Setup
160
+ // =============================================================================
161
+
162
+ const server = createMcpServer({
163
+ name: "{{binName}}",
164
+ version: "{{version}}",
165
+ });
166
+
167
+ // Register resources
168
+ server.registerResource(fileListResource);
169
+ server.registerResourceTemplate(fileContentTemplate);
170
+
171
+ // Register tools
172
+ server.registerTool(writeFileTool);
173
+ server.registerTool(deleteFileTool);
174
+ server.registerTool(searchFilesTool);
175
+
176
+ export { server };
177
+
178
+ /** Start the MCP server over stdio transport. */
179
+ export async function startServer(): Promise<void> {
180
+ await connectStdio(server);
181
+ }
@@ -6,12 +6,12 @@ pre-commit:
6
6
  commands:
7
7
  format:
8
8
  glob: "*.{js,ts,tsx,json,md}"
9
- run: bunx biome format --no-errors-on-unmatched {staged_files}
9
+ run: bunx oxfmt --write {staged_files}
10
10
  stage_fixed: true
11
11
 
12
12
  lint:
13
13
  glob: "*.{js,ts,tsx}"
14
- run: bunx biome lint --no-errors-on-unmatched {staged_files}
14
+ run: bunx oxlint {staged_files}
15
15
 
16
16
  typecheck:
17
17
  glob: "*.{ts,tsx}"
@@ -0,0 +1,22 @@
1
+ # {{projectName}}
2
+
3
+ {{description}}
4
+
5
+ ## Getting Started
6
+
7
+ ```bash
8
+ bun install
9
+ bun run dev
10
+ ```
11
+
12
+ ## Development
13
+
14
+ ```bash
15
+ bun test # Run tests
16
+ bun run build # Build for production
17
+ bun run typecheck # Type checking
18
+ ```
19
+
20
+ ## License
21
+
22
+ MIT
@@ -1,39 +1,43 @@
1
1
  {
2
- "name": "{{packageName}}",
3
- "version": "{{version}}",
4
- "description": "{{description}}",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
8
- "files": [
9
- "dist"
10
- ],
11
- "exports": {
12
- ".": {
13
- "import": {
14
- "types": "./dist/index.d.ts",
15
- "default": "./dist/index.js"
16
- }
17
- }
18
- },
19
- "scripts": {
20
- "build": "bun build ./src/index.ts --outdir=dist --format=esm",
21
- "dev": "bun run --watch src/index.ts",
22
- "test": "bun test",
23
- "test:watch": "bun test --watch",
24
- "typecheck": "tsc --noEmit",
25
- "check": "ultracite check",
26
- "verify:ci": "bun run typecheck && bun run check && bun run build && bun run test",
27
- "lint": "biome check .",
28
- "lint:fix": "biome check . --write",
29
- "format": "biome format --write .",
30
- "clean:artifacts": "rm -rf dist .turbo",
31
- "clean": "rm -rf dist"
32
- },
33
- "devDependencies": {},
34
- "engines": {
35
- "bun": ">=1.3.9"
36
- },
37
- "keywords": [],
38
- "license": "MIT"
2
+ "name": "{{packageName}}",
3
+ "version": "{{version}}",
4
+ "description": "{{description}}",
5
+ "keywords": [],
6
+ "license": "MIT",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "type": "module",
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "import": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ }
19
+ }
20
+ },
21
+ "scripts": {
22
+ "build": "bun build ./src/index.ts --outdir=dist --format=esm && tsc --emitDeclarationOnly",
23
+ "dev": "bun run --watch src/index.ts",
24
+ "test": "bun test",
25
+ "test:watch": "bun test --watch",
26
+ "typecheck": "tsc --noEmit",
27
+ "check": "ultracite check",
28
+ "verify:ci": "bun run typecheck && bun run check && bun run build && bun run test",
29
+ "lint": "oxlint .",
30
+ "lint:fix": "oxlint --fix .",
31
+ "format": "oxfmt --write .",
32
+ "clean:artifacts": "rm -rf dist .turbo",
33
+ "clean": "rm -rf dist"
34
+ },
35
+ "dependencies": {
36
+ "@outfitter/contracts": "workspace:*",
37
+ "zod": "catalog:"
38
+ },
39
+ "devDependencies": {},
40
+ "engines": {
41
+ "bun": ">=1.3.10"
42
+ }
39
43
  }