@baseworks/cli 0.2.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.
@@ -0,0 +1,41 @@
1
+ import { BaseConfig } from './context.js';
2
+
3
+ /**
4
+ * Typed helpers for reading standard fields from a BaseConfig.
5
+ *
6
+ * Env var names are passed as parameters — this module has no knowledge of
7
+ * project-specific env vars (DTAB_TOKEN, ORBSEAL_TOKEN, etc.).
8
+ *
9
+ * Usage:
10
+ * const cfg = ctx.loadConfig();
11
+ * const token = resolveToken(cfg, { env: 'DTAB_TOKEN' });
12
+ * const apiBase = resolveApiBase(cfg, { env: 'DTAB_API_URL', default: 'https://api.driptab.app' });
13
+ */
14
+
15
+ interface ResolveOptions {
16
+ /** Name of the environment variable to fall back to (e.g. 'DTAB_TOKEN'). */
17
+ env?: string;
18
+ }
19
+ interface ResolveBaseOptions extends ResolveOptions {
20
+ /** Default value if neither config nor env has a value. */
21
+ default?: string;
22
+ }
23
+ /**
24
+ * Read `token` from config, falling back to the named env var.
25
+ * Returns undefined if neither is set.
26
+ */
27
+ declare function resolveToken(cfg: BaseConfig, opts?: ResolveOptions): string | undefined;
28
+ /**
29
+ * Read `apiBase` from config, falling back to the named env var,
30
+ * then to opts.default. Strips trailing slash.
31
+ */
32
+ declare function resolveApiBase(cfg: BaseConfig, opts?: ResolveBaseOptions): string;
33
+ /**
34
+ * Read an arbitrary string field from config by key,
35
+ * falling back to the named env var.
36
+ */
37
+ declare function resolveField(cfg: BaseConfig, key: string, opts?: ResolveOptions & {
38
+ default?: string;
39
+ }): string | undefined;
40
+
41
+ export { type ResolveBaseOptions, type ResolveOptions, resolveApiBase, resolveField, resolveToken };
@@ -0,0 +1,10 @@
1
+ import {
2
+ resolveApiBase,
3
+ resolveField,
4
+ resolveToken
5
+ } from "./chunk-BEHHVEGL.js";
6
+ export {
7
+ resolveApiBase,
8
+ resolveField,
9
+ resolveToken
10
+ };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Generic CLI context manager.
3
+ *
4
+ * Read resolution order (first found wins):
5
+ * 1. {cwd}/.{appName}/config.json — project-local
6
+ * 2. {home}/.{appName}/config.json — global fallback
7
+ *
8
+ * Write always targets {cwd}/.{appName}/config.json — so `dtab login`
9
+ * creates a project-local config wherever you run the command.
10
+ *
11
+ * Usage:
12
+ * const ctx = createContextManager<DriptabContext>('dtab');
13
+ * ctx.setContext({ org: 'acme', project: 'billing' });
14
+ * const { org } = ctx.getContext() ?? {};
15
+ * console.log(ctx.configPath); // shows which file will be written
16
+ */
17
+ interface BaseConfig {
18
+ token?: string;
19
+ apiBase?: string;
20
+ [key: string]: unknown;
21
+ }
22
+ interface ContextManager<TContext extends Record<string, string | undefined>> {
23
+ /** Read the full config file (local first, then global). */
24
+ loadConfig(): BaseConfig & {
25
+ context?: TContext;
26
+ };
27
+ /** Write the full config file to the active path (local if present, else global). */
28
+ saveConfig(cfg: BaseConfig & {
29
+ context?: TContext;
30
+ }): void;
31
+ /** Return the stored context, or undefined if none set. */
32
+ getContext(): TContext | undefined;
33
+ /** Merge partial context into the stored context and persist. */
34
+ setContext(parts: Partial<TContext>): void;
35
+ /** Remove the stored context (keeps token/apiBase). */
36
+ clearContext(): void;
37
+ /**
38
+ * Active config file path — whichever was found (local or global).
39
+ * Recalculated on each access so it reflects the current working directory.
40
+ */
41
+ readonly configPath: string;
42
+ }
43
+ declare function createContextManager<TContext extends Record<string, string | undefined>>(appName: string): ContextManager<TContext>;
44
+
45
+ export { type BaseConfig, type ContextManager, createContextManager };
@@ -0,0 +1,6 @@
1
+ import {
2
+ createContextManager
3
+ } from "./chunk-ZD7NOFZL.js";
4
+ export {
5
+ createContextManager
6
+ };
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Terminal display primitives. Node.js only — TTY-aware ANSI colours.
3
+ */
4
+ declare const clr: {
5
+ reset: string;
6
+ bold: string;
7
+ dim: string;
8
+ green: string;
9
+ yellow: string;
10
+ cyan: string;
11
+ red: string;
12
+ };
13
+ /**
14
+ * Truncate a UUID or long ID to first `n` chars + `…`.
15
+ * Short IDs (no dash at pos 8) are returned as-is.
16
+ */
17
+ declare function truncateId(id: string, n?: number): string;
18
+ /** Colorize a status string for terminal display. */
19
+ declare function statusColor(status: string): string;
20
+ /** Print a dim summary line below a table. */
21
+ declare function summary(text: string): void;
22
+ type OutputFormat = 'table' | 'wide' | 'json' | 'yaml' | 'code';
23
+ interface ColDef<T> {
24
+ key: keyof T;
25
+ label: string;
26
+ fmt?: (value: T[keyof T], row: T) => string;
27
+ /** If true, column is only shown in -o wide mode. */
28
+ wide?: boolean;
29
+ /** @deprecated use wide instead */
30
+ detail?: boolean;
31
+ }
32
+ interface TableOpts {
33
+ /**
34
+ * Message shown when rows is empty. Use a hint to guide the user.
35
+ * Default: "(none)"
36
+ */
37
+ emptyHint?: string;
38
+ }
39
+ declare function table<T extends Record<string, unknown>>(rows: T[], cols: ColDef<T>[], opts?: TableOpts & {
40
+ wide?: boolean;
41
+ }): void;
42
+ declare function kv(pairs: [string, string][]): void;
43
+ declare function success(msg: string): void;
44
+ declare function warn(msg: string): void;
45
+ declare function fatal(msg: string): never;
46
+ declare function prompt(question: string): Promise<string>;
47
+ /**
48
+ * Lookup and print subcommand help, return true if help was printed.
49
+ * Use at the top of each command fn:
50
+ *
51
+ * if (helpFor('account tokens', deps.args, deps.flags, HELP)) return;
52
+ *
53
+ * helpMap keys are subcommand paths WITHOUT the top-level command name,
54
+ * e.g. { 'tokens create': '...', 'tokens list': '...' }
55
+ */
56
+ declare function helpFor(cmdName: string, args: string[], flags: Record<string, string | boolean>, helpMap: Record<string, string>): boolean;
57
+ /**
58
+ * @deprecated Use printOutput instead.
59
+ * Kept for backward compatibility with legacy CliPlugin commands.
60
+ */
61
+ declare function printOrJson<T>(data: T, textFn: () => void, argv?: string[]): void;
62
+ /**
63
+ * Universal output formatter for Commander-based commands.
64
+ *
65
+ * @param data Raw data to output (array or object)
66
+ * @param format Output format from -o/--output option
67
+ * @param renderFn Called for table/wide; receives wide=true for -o wide
68
+ * @param codeKey Key (or fn) used for -o code output. Falls back to short_id → id.
69
+ *
70
+ * Usage:
71
+ * printOutput(plans, opts.output, (wide) => table(plans, cols, { wide }), 'code');
72
+ */
73
+ declare function printOutput<T extends Record<string, unknown>>(data: T | T[], format: string | undefined, renderFn: (wide: boolean) => void, codeKey?: string | ((item: T) => string)): void;
74
+ /**
75
+ * Returns the Commander output option definition string.
76
+ * Use with .addOption() or .option():
77
+ *
78
+ * cmd.option(...outputOption())
79
+ */
80
+ declare function outputOption(): [string, string, string];
81
+
82
+ export { type ColDef, type OutputFormat, type TableOpts, clr, fatal, helpFor, kv, outputOption, printOrJson, printOutput, prompt, statusColor, success, summary, table, truncateId, warn };
@@ -0,0 +1,32 @@
1
+ import {
2
+ clr,
3
+ fatal,
4
+ helpFor,
5
+ kv,
6
+ outputOption,
7
+ printOrJson,
8
+ printOutput,
9
+ prompt,
10
+ statusColor,
11
+ success,
12
+ summary,
13
+ table,
14
+ truncateId,
15
+ warn
16
+ } from "./chunk-C2YZKMJ7.js";
17
+ export {
18
+ clr,
19
+ fatal,
20
+ helpFor,
21
+ kv,
22
+ outputOption,
23
+ printOrJson,
24
+ printOutput,
25
+ prompt,
26
+ statusColor,
27
+ success,
28
+ summary,
29
+ table,
30
+ truncateId,
31
+ warn
32
+ };
package/dist/fmt.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Display formatters for common field types.
3
+ * All return ANSI-colored strings safe to pass to table/kv.
4
+ */
5
+ /**
6
+ * Format a date value for terminal display.
7
+ * Accepts:
8
+ * - Unix ms timestamp (number)
9
+ * - ISO 8601 string
10
+ * - null / undefined → "—"
11
+ */
12
+ declare function fmtDate(val: string | number | null | undefined): string;
13
+ declare function fmtRole(role: string | null | undefined): string;
14
+ declare function fmtStatus(revokedAt: string | null | undefined): string;
15
+ declare function fmtBool(val: boolean | number | null | undefined): string;
16
+ declare function fmtCount(n: number | null | undefined): string;
17
+ declare function fmtId(id: string | null | undefined): string;
18
+
19
+ export { fmtBool, fmtCount, fmtDate, fmtId, fmtRole, fmtStatus };
package/dist/fmt.js ADDED
@@ -0,0 +1,17 @@
1
+ import {
2
+ fmtBool,
3
+ fmtCount,
4
+ fmtDate,
5
+ fmtId,
6
+ fmtRole,
7
+ fmtStatus
8
+ } from "./chunk-HJFKWDPX.js";
9
+ import "./chunk-C2YZKMJ7.js";
10
+ export {
11
+ fmtBool,
12
+ fmtCount,
13
+ fmtDate,
14
+ fmtId,
15
+ fmtRole,
16
+ fmtStatus
17
+ };
@@ -0,0 +1,10 @@
1
+ export { ColDef, OutputFormat, TableOpts, clr, fatal, kv, outputOption, printOrJson, printOutput, prompt, success, table, warn } from './display.js';
2
+ export { fmtBool, fmtCount, fmtDate, fmtId, fmtRole, fmtStatus } from './fmt.js';
3
+ export { TreeNode, tree } from './tree.js';
4
+ export { ParsedArgs, getFlag, isJsonMode, parseFlags } from './args.js';
5
+ export { BaseConfig, ContextManager, createContextManager } from './context.js';
6
+ export { ResolveBaseOptions, ResolveOptions, resolveApiBase, resolveField, resolveToken } from './config-loader.js';
7
+ export { ApiClient, ApiError, createApiClient } from './client.js';
8
+ export { CliRunner, CliRunnerConfig, createCliRunner } from './runner.js';
9
+ export { CliCommand, CliHooks, CliMiddlewareFn, CliPlugin, CommandDeps } from './plugin.js';
10
+ export { confirmDestructive, requiresContext, requiresToken } from './middleware.js';
package/dist/index.js ADDED
@@ -0,0 +1,78 @@
1
+ import {
2
+ createCliRunner
3
+ } from "./chunk-LQJTQ52B.js";
4
+ import {
5
+ confirmDestructive,
6
+ requiresContext,
7
+ requiresToken
8
+ } from "./chunk-TSVJD4R6.js";
9
+ import {
10
+ fmtBool,
11
+ fmtCount,
12
+ fmtDate,
13
+ fmtId,
14
+ fmtRole,
15
+ fmtStatus
16
+ } from "./chunk-HJFKWDPX.js";
17
+ import {
18
+ getFlag,
19
+ isJsonMode,
20
+ parseFlags
21
+ } from "./chunk-H4M2NPA2.js";
22
+ import {
23
+ createContextManager
24
+ } from "./chunk-ZD7NOFZL.js";
25
+ import {
26
+ resolveApiBase,
27
+ resolveField,
28
+ resolveToken
29
+ } from "./chunk-BEHHVEGL.js";
30
+ import {
31
+ tree
32
+ } from "./chunk-5U3CFW6F.js";
33
+ import {
34
+ clr,
35
+ fatal,
36
+ kv,
37
+ outputOption,
38
+ printOrJson,
39
+ printOutput,
40
+ prompt,
41
+ success,
42
+ table,
43
+ warn
44
+ } from "./chunk-C2YZKMJ7.js";
45
+ import {
46
+ createApiClient
47
+ } from "./chunk-XQGLG3X3.js";
48
+ export {
49
+ clr,
50
+ confirmDestructive,
51
+ createApiClient,
52
+ createCliRunner,
53
+ createContextManager,
54
+ fatal,
55
+ fmtBool,
56
+ fmtCount,
57
+ fmtDate,
58
+ fmtId,
59
+ fmtRole,
60
+ fmtStatus,
61
+ getFlag,
62
+ isJsonMode,
63
+ kv,
64
+ outputOption,
65
+ parseFlags,
66
+ printOrJson,
67
+ printOutput,
68
+ prompt,
69
+ requiresContext,
70
+ requiresToken,
71
+ resolveApiBase,
72
+ resolveField,
73
+ resolveToken,
74
+ success,
75
+ table,
76
+ tree,
77
+ warn
78
+ };
@@ -0,0 +1,37 @@
1
+ import { CliMiddlewareFn } from './plugin.js';
2
+ import './client.js';
3
+ import './context.js';
4
+
5
+ /**
6
+ * Built-in CLI middleware.
7
+ *
8
+ * Each function returns a CliMiddlewareFn — pass the result to
9
+ * CliCommand.middleware[], or let the runner apply it via the
10
+ * requiresToken / requiresContext / confirm shorthand properties.
11
+ */
12
+
13
+ /**
14
+ * Ensures deps.token is set before the command runs.
15
+ * The runner pre-populates deps.token from getToken(); this middleware
16
+ * just guards and gives a clear error message if it's missing.
17
+ *
18
+ * Applied automatically when CliCommand.requiresToken !== false.
19
+ */
20
+ declare function requiresToken(): CliMiddlewareFn;
21
+ /**
22
+ * Ensures an active org/project context is set before the command runs.
23
+ * Sets deps.context to the result of ctx.getContext().
24
+ *
25
+ * Applied automatically when CliCommand.requiresContext === true.
26
+ */
27
+ declare function requiresContext(): CliMiddlewareFn;
28
+ /**
29
+ * Prompts the user with a y/N confirmation before continuing.
30
+ * In non-TTY / CI environments (stdin not interactive), auto-aborts
31
+ * unless the --yes / -y flag is present.
32
+ *
33
+ * Applied automatically when CliCommand.confirm is set.
34
+ */
35
+ declare function confirmDestructive(message: string): CliMiddlewareFn;
36
+
37
+ export { confirmDestructive, requiresContext, requiresToken };
@@ -0,0 +1,11 @@
1
+ import {
2
+ confirmDestructive,
3
+ requiresContext,
4
+ requiresToken
5
+ } from "./chunk-TSVJD4R6.js";
6
+ import "./chunk-C2YZKMJ7.js";
7
+ export {
8
+ confirmDestructive,
9
+ requiresContext,
10
+ requiresToken
11
+ };
@@ -0,0 +1,99 @@
1
+ import { ApiClient } from './client.js';
2
+ import { ContextManager } from './context.js';
3
+
4
+ /**
5
+ * CLI plugin system — types.
6
+ *
7
+ * A CliPlugin groups related commands. Each command declares its middleware
8
+ * requirements declaratively; the runner builds and executes the chain.
9
+ *
10
+ * argv → [requiresToken] → [requiresContext] → [confirmDestructive] → [custom…] → fn
11
+ */
12
+
13
+ interface CommandDeps {
14
+ /** Full argv slice (after command name). */
15
+ argv: string[];
16
+ /** Positional args (non-flag). */
17
+ args: string[];
18
+ /** Parsed flags. */
19
+ flags: Record<string, string | boolean>;
20
+ /** Authenticated HTTP client. */
21
+ http: ApiClient;
22
+ /** Config / context manager for this app. */
23
+ ctx: ContextManager<Record<string, string | undefined>>;
24
+ /** Frontend app URL (for browser-based flows like login). */
25
+ appBase: string;
26
+ /**
27
+ * Set by requiresToken middleware.
28
+ * Guaranteed non-null inside commands that declare requiresToken (default).
29
+ */
30
+ token?: string;
31
+ /**
32
+ * Set by requiresContext middleware.
33
+ * Guaranteed non-null inside commands that declare requiresContext: true.
34
+ */
35
+ context?: Record<string, string | undefined>;
36
+ }
37
+ /**
38
+ * A middleware function. Call next() to continue the chain.
39
+ * Throw (or call fatal()) to abort.
40
+ */
41
+ type CliMiddlewareFn = (deps: CommandDeps, next: () => Promise<void>) => Promise<void>;
42
+ interface CliCommand {
43
+ /** The command handler — runs after all middleware. */
44
+ fn: (deps: CommandDeps) => Promise<void> | void;
45
+ /**
46
+ * Ensure a token is present before running.
47
+ * Default: true. Set to false for commands like `login` or `help`.
48
+ */
49
+ requiresToken?: boolean;
50
+ /**
51
+ * Ensure org/project context is set (ctx.getContext() non-null).
52
+ * Default: false.
53
+ */
54
+ requiresContext?: boolean;
55
+ /**
56
+ * Show a "are you sure?" confirmation prompt before running.
57
+ * Supply the message to display. No prompt if undefined.
58
+ */
59
+ confirm?: string;
60
+ /**
61
+ * Additional middleware to run after the built-in guards,
62
+ * in declaration order, before fn.
63
+ */
64
+ middleware?: CliMiddlewareFn[];
65
+ }
66
+ interface CliPlugin {
67
+ /** Map of command name → CliCommand. */
68
+ commands: Record<string, CliCommand>;
69
+ /** Short aliases → canonical command name. */
70
+ aliases?: Record<string, string>;
71
+ /** Help text section contributed by this plugin (shown by dtab --help). */
72
+ helpText?: string;
73
+ /**
74
+ * Per-subcommand help strings, shown when --help appears after a subcommand.
75
+ * Key format: "command sub" e.g. "account tokens create"
76
+ * The runner prints this when deps.flags['help'] is true.
77
+ */
78
+ subHelp?: Record<string, string>;
79
+ }
80
+ interface CliHooks {
81
+ /**
82
+ * Fires before the middleware chain + command fn.
83
+ * Useful for telemetry, logging, debug output.
84
+ */
85
+ beforeCommand?: (name: string, deps: CommandDeps) => Promise<void> | void;
86
+ /**
87
+ * Fires after successful command completion.
88
+ * durationMs = wall-clock time including middleware.
89
+ */
90
+ afterCommand?: (name: string, deps: CommandDeps, durationMs: number) => Promise<void> | void;
91
+ /**
92
+ * Fires when any unhandled error escapes the command fn or its middleware.
93
+ * If you handle the error here, do NOT re-throw — the runner will not fatal().
94
+ * If you don't register this hook, the runner calls fatal(err.message).
95
+ */
96
+ onError?: (name: string, error: Error, deps: CommandDeps) => Promise<void> | void;
97
+ }
98
+
99
+ export type { CliCommand, CliHooks, CliMiddlewareFn, CliPlugin, CommandDeps };
package/dist/plugin.js ADDED
File without changes
@@ -0,0 +1,53 @@
1
+ import { ContextManager } from './context.js';
2
+ import { CliPlugin, CliHooks } from './plugin.js';
3
+ import './client.js';
4
+
5
+ /**
6
+ * CLI runner — plugin registration, middleware chain execution, lifecycle hooks.
7
+ *
8
+ * Usage:
9
+ * const runner = createCliRunner({
10
+ * ctx,
11
+ * appBase: 'https://myapp.com',
12
+ * getToken: () => resolveToken(ctx.loadConfig(), { env: 'MY_TOKEN' }),
13
+ * getApiBase: () => resolveApiBase(ctx.loadConfig(), { env: 'MY_API_URL', default: 'https://api.myapp.com' }),
14
+ * });
15
+ *
16
+ * runner.register(accountCliPlugin({ ... }));
17
+ * runner.register(orgCliPlugin());
18
+ * runner.register(myAppPlugin);
19
+ *
20
+ * runner.hooks({
21
+ * onError: (name, err) => { ... }, // optional telemetry
22
+ * });
23
+ *
24
+ * await runner.run(process.argv.slice(2));
25
+ */
26
+
27
+ interface CliRunnerConfig {
28
+ /** Context manager for this application. */
29
+ ctx: ContextManager<Record<string, string | undefined>>;
30
+ /** Frontend app base URL — used by browser-based flows (e.g. login). */
31
+ appBase: string;
32
+ /**
33
+ * Returns the active API token, or undefined if not set.
34
+ * Called fresh on every request so config changes are picked up immediately.
35
+ */
36
+ getToken: () => string | undefined;
37
+ /**
38
+ * Returns the API base URL.
39
+ * Called fresh on every request.
40
+ */
41
+ getApiBase: () => string;
42
+ }
43
+ interface CliRunner {
44
+ /** Register a plugin — merges its commands and aliases. */
45
+ register(plugin: CliPlugin): void;
46
+ /** Register lifecycle hooks (additive — multiple calls merge). */
47
+ hooks(h: Partial<CliHooks>): void;
48
+ /** Execute the CLI with the given argv (typically process.argv.slice(2)). */
49
+ run(argv: string[]): Promise<void>;
50
+ }
51
+ declare function createCliRunner(config: CliRunnerConfig): CliRunner;
52
+
53
+ export { type CliRunner, type CliRunnerConfig, createCliRunner };
package/dist/runner.js ADDED
@@ -0,0 +1,10 @@
1
+ import {
2
+ createCliRunner
3
+ } from "./chunk-LQJTQ52B.js";
4
+ import "./chunk-TSVJD4R6.js";
5
+ import "./chunk-H4M2NPA2.js";
6
+ import "./chunk-C2YZKMJ7.js";
7
+ import "./chunk-XQGLG3X3.js";
8
+ export {
9
+ createCliRunner
10
+ };
package/dist/tree.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Hierarchical tree display for CLI output.
3
+ *
4
+ * Usage:
5
+ * tree([
6
+ * {
7
+ * label: 'taskflow', badge: '●', meta: 'org',
8
+ * children: [
9
+ * {
10
+ * label: 'platform', meta: 'workspace',
11
+ * children: [
12
+ * { label: 'taskflow', badge: '🌿', meta: 'project · production, staging' },
13
+ * ],
14
+ * },
15
+ * ],
16
+ * },
17
+ * ]);
18
+ */
19
+ interface TreeNode {
20
+ /** Primary label — printed bold. */
21
+ label: string;
22
+ /** Optional badge/icon before the label. */
23
+ badge?: string;
24
+ /** Dimmed metadata shown after the label. */
25
+ meta?: string;
26
+ /** Child nodes. */
27
+ children?: TreeNode[];
28
+ }
29
+ declare function tree(nodes: TreeNode[], prefix?: string): void;
30
+
31
+ export { type TreeNode, tree };
package/dist/tree.js ADDED
@@ -0,0 +1,7 @@
1
+ import {
2
+ tree
3
+ } from "./chunk-5U3CFW6F.js";
4
+ import "./chunk-C2YZKMJ7.js";
5
+ export {
6
+ tree
7
+ };
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@baseworks/cli",
3
+ "version": "0.2.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": "./dist/index.js",
7
+ "./display": "./dist/display.js",
8
+ "./fmt": "./dist/fmt.js",
9
+ "./args": "./dist/args.js",
10
+ "./context": "./dist/context.js",
11
+ "./config-loader": "./dist/config-loader.js",
12
+ "./tree": "./dist/tree.js",
13
+ "./client": "./dist/client.js",
14
+ "./runner": "./dist/runner.js",
15
+ "./middleware": "./dist/middleware.js",
16
+ "./plugin": "./dist/plugin.js",
17
+ "./testing": "./src/testing.ts"
18
+ },
19
+ "files": ["dist", "src"],
20
+ "scripts": {
21
+ "build": "tsup",
22
+ "typecheck": "tsc --noEmit"
23
+ },
24
+ "dependencies": {
25
+ "@baseworks/core": "^0.2.0"
26
+ },
27
+ "devDependencies": {
28
+ "@baseworks/tsconfig": "workspace:*",
29
+ "@types/node": "^25.9.1",
30
+ "msw": "^2.14.6",
31
+ "tsup": "^8.5.1",
32
+ "typescript": "^5.6.0"
33
+ }
34
+ }