@kb-labs/shared 1.1.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 (232) hide show
  1. package/.cursorrules +32 -0
  2. package/.github/workflows/ci.yml +13 -0
  3. package/.github/workflows/deploy.yml +28 -0
  4. package/.github/workflows/docker-build.yml +25 -0
  5. package/.github/workflows/drift-check.yml +10 -0
  6. package/.github/workflows/profiles-validate.yml +16 -0
  7. package/.github/workflows/release.yml +8 -0
  8. package/.kb/devkit/agents/devkit-maintainer/context.globs +15 -0
  9. package/.kb/devkit/agents/devkit-maintainer/permissions.yml +17 -0
  10. package/.kb/devkit/agents/devkit-maintainer/prompt.md +28 -0
  11. package/.kb/devkit/agents/devkit-maintainer/runbook.md +31 -0
  12. package/.kb/devkit/agents/docs-crafter/prompt.md +24 -0
  13. package/.kb/devkit/agents/docs-crafter/runbook.md +18 -0
  14. package/.kb/devkit/agents/release-manager/context.globs +7 -0
  15. package/.kb/devkit/agents/release-manager/prompt.md +27 -0
  16. package/.kb/devkit/agents/release-manager/runbook.md +17 -0
  17. package/.kb/devkit/agents/test-generator/context.globs +7 -0
  18. package/.kb/devkit/agents/test-generator/prompt.md +27 -0
  19. package/.kb/devkit/agents/test-generator/runbook.md +18 -0
  20. package/.vscode/settings.json +23 -0
  21. package/CHANGELOG.md +33 -0
  22. package/CONTRIBUTING.md +117 -0
  23. package/LICENSE +21 -0
  24. package/README.md +306 -0
  25. package/docs/DECLARATIVE-FLAGS-AND-ENV.md +622 -0
  26. package/docs/DOCUMENTATION.md +70 -0
  27. package/docs/adr/0000-template.md +52 -0
  28. package/docs/adr/0001-architecture-and-repository-layout.md +31 -0
  29. package/docs/adr/0002-plugins-and-extensibility.md +44 -0
  30. package/docs/adr/0003-package-and-module-boundaries.md +35 -0
  31. package/docs/adr/0004-versioning-and-release-policy.md +36 -0
  32. package/docs/adr/0005-reactive-loader-pattern.md +179 -0
  33. package/docs/adr/0006-declarative-flags-and-env-systems.md +376 -0
  34. package/eslint.config.js +27 -0
  35. package/kb-labs.config.json +5 -0
  36. package/package.json +88 -0
  37. package/package.json.bin +25 -0
  38. package/package.json.lib +30 -0
  39. package/packages/shared-cli-ui/CHANGELOG.md +20 -0
  40. package/packages/shared-cli-ui/README.md +342 -0
  41. package/packages/shared-cli-ui/docs/ARCHITECTURE.md +105 -0
  42. package/packages/shared-cli-ui/eslint.config.js +27 -0
  43. package/packages/shared-cli-ui/package.json +72 -0
  44. package/packages/shared-cli-ui/src/__tests__/artifacts-display.spec.ts +89 -0
  45. package/packages/shared-cli-ui/src/__tests__/format.spec.ts +44 -0
  46. package/packages/shared-cli-ui/src/__tests__/loader-json-mode.test.ts +119 -0
  47. package/packages/shared-cli-ui/src/artifacts-display.ts +266 -0
  48. package/packages/shared-cli-ui/src/cli-auto-discovery.ts +120 -0
  49. package/packages/shared-cli-ui/src/colors.ts +142 -0
  50. package/packages/shared-cli-ui/src/command-discovery.ts +72 -0
  51. package/packages/shared-cli-ui/src/command-output.ts +153 -0
  52. package/packages/shared-cli-ui/src/command-result.ts +267 -0
  53. package/packages/shared-cli-ui/src/command-runner.ts +310 -0
  54. package/packages/shared-cli-ui/src/command-suggestions.ts +204 -0
  55. package/packages/shared-cli-ui/src/debug/components/output.ts +141 -0
  56. package/packages/shared-cli-ui/src/debug/components/trace.ts +101 -0
  57. package/packages/shared-cli-ui/src/debug/components/tree.ts +88 -0
  58. package/packages/shared-cli-ui/src/debug/formatters/ai.ts +17 -0
  59. package/packages/shared-cli-ui/src/debug/formatters/human.ts +98 -0
  60. package/packages/shared-cli-ui/src/debug/formatters/timeline.ts +94 -0
  61. package/packages/shared-cli-ui/src/debug/index.ts +56 -0
  62. package/packages/shared-cli-ui/src/debug/types.ts +57 -0
  63. package/packages/shared-cli-ui/src/debug/utilities.ts +203 -0
  64. package/packages/shared-cli-ui/src/dynamic-command-discovery.ts +131 -0
  65. package/packages/shared-cli-ui/src/format.ts +412 -0
  66. package/packages/shared-cli-ui/src/index.ts +34 -0
  67. package/packages/shared-cli-ui/src/loader.ts +196 -0
  68. package/packages/shared-cli-ui/src/manifest-parser.ts +151 -0
  69. package/packages/shared-cli-ui/src/modern-format.ts +271 -0
  70. package/packages/shared-cli-ui/src/multi-cli-suggestions.ts +159 -0
  71. package/packages/shared-cli-ui/src/table.ts +134 -0
  72. package/packages/shared-cli-ui/src/timing-tracker.ts +68 -0
  73. package/packages/shared-cli-ui/src/utils/context.ts +12 -0
  74. package/packages/shared-cli-ui/src/utils/env.ts +164 -0
  75. package/packages/shared-cli-ui/src/utils/flags.ts +269 -0
  76. package/packages/shared-cli-ui/src/utils/path.ts +8 -0
  77. package/packages/shared-cli-ui/tsconfig.build.json +15 -0
  78. package/packages/shared-cli-ui/tsconfig.json +9 -0
  79. package/packages/shared-cli-ui/tsup.config.ts +11 -0
  80. package/packages/shared-cli-ui/vitest.config.ts +15 -0
  81. package/packages/shared-command-kit/CHANGELOG.md +20 -0
  82. package/packages/shared-command-kit/LICENSE +22 -0
  83. package/packages/shared-command-kit/README.md +1030 -0
  84. package/packages/shared-command-kit/docs/HIGH-LEVEL-API.md +89 -0
  85. package/packages/shared-command-kit/docs/LOW-LEVEL-API.md +105 -0
  86. package/packages/shared-command-kit/docs/MIGRATION-GUIDE.md +135 -0
  87. package/packages/shared-command-kit/eslint.config.js +27 -0
  88. package/packages/shared-command-kit/eslint.config.ts +14 -0
  89. package/packages/shared-command-kit/package.json +76 -0
  90. package/packages/shared-command-kit/prettierrc.json +5 -0
  91. package/packages/shared-command-kit/src/__tests__/define-command.spec.ts +294 -0
  92. package/packages/shared-command-kit/src/__tests__/define-route.test.ts +285 -0
  93. package/packages/shared-command-kit/src/__tests__/define-system-command.spec.ts +508 -0
  94. package/packages/shared-command-kit/src/__tests__/define-webhook.test.ts +156 -0
  95. package/packages/shared-command-kit/src/__tests__/define-websocket.test.ts +316 -0
  96. package/packages/shared-command-kit/src/__tests__/errors.spec.ts +45 -0
  97. package/packages/shared-command-kit/src/__tests__/flags.spec.ts +353 -0
  98. package/packages/shared-command-kit/src/__tests__/platform-api.test.ts +135 -0
  99. package/packages/shared-command-kit/src/__tests__/plugin-context-v3.snapshot.spec.ts +240 -0
  100. package/packages/shared-command-kit/src/__tests__/ws-types.test.ts +359 -0
  101. package/packages/shared-command-kit/src/analytics/index.ts +6 -0
  102. package/packages/shared-command-kit/src/analytics/with-analytics.ts +195 -0
  103. package/packages/shared-command-kit/src/define-action.ts +100 -0
  104. package/packages/shared-command-kit/src/define-command.ts +113 -0
  105. package/packages/shared-command-kit/src/define-route.ts +113 -0
  106. package/packages/shared-command-kit/src/define-system-command.ts +362 -0
  107. package/packages/shared-command-kit/src/define-webhook.ts +115 -0
  108. package/packages/shared-command-kit/src/define-websocket.ts +308 -0
  109. package/packages/shared-command-kit/src/errors/factory.ts +282 -0
  110. package/packages/shared-command-kit/src/errors/format-validation.ts +144 -0
  111. package/packages/shared-command-kit/src/errors/format.ts +92 -0
  112. package/packages/shared-command-kit/src/errors/index.ts +9 -0
  113. package/packages/shared-command-kit/src/errors/types.ts +32 -0
  114. package/packages/shared-command-kit/src/flags/define.ts +92 -0
  115. package/packages/shared-command-kit/src/flags/index.ts +9 -0
  116. package/packages/shared-command-kit/src/flags/types.ts +153 -0
  117. package/packages/shared-command-kit/src/flags/validate.ts +358 -0
  118. package/packages/shared-command-kit/src/helpers/context.ts +8 -0
  119. package/packages/shared-command-kit/src/helpers/flags.ts +84 -0
  120. package/packages/shared-command-kit/src/helpers/index.ts +42 -0
  121. package/packages/shared-command-kit/src/helpers/patterns.ts +464 -0
  122. package/packages/shared-command-kit/src/helpers/platform.ts +335 -0
  123. package/packages/shared-command-kit/src/helpers/use-analytics.ts +95 -0
  124. package/packages/shared-command-kit/src/helpers/use-cache.ts +97 -0
  125. package/packages/shared-command-kit/src/helpers/use-config.ts +99 -0
  126. package/packages/shared-command-kit/src/helpers/use-embeddings.ts +49 -0
  127. package/packages/shared-command-kit/src/helpers/use-llm.ts +316 -0
  128. package/packages/shared-command-kit/src/helpers/use-logger.ts +77 -0
  129. package/packages/shared-command-kit/src/helpers/use-platform.ts +111 -0
  130. package/packages/shared-command-kit/src/helpers/use-resource-broker.ts +106 -0
  131. package/packages/shared-command-kit/src/helpers/use-storage.ts +71 -0
  132. package/packages/shared-command-kit/src/helpers/use-vector-store.ts +49 -0
  133. package/packages/shared-command-kit/src/helpers/validation.ts +398 -0
  134. package/packages/shared-command-kit/src/index.ts +410 -0
  135. package/packages/shared-command-kit/src/jobs.ts +132 -0
  136. package/packages/shared-command-kit/src/lifecycle/define-handlers.ts +366 -0
  137. package/packages/shared-command-kit/src/lifecycle/index.ts +6 -0
  138. package/packages/shared-command-kit/src/manifest.ts +127 -0
  139. package/packages/shared-command-kit/src/rest/define-handler.ts +187 -0
  140. package/packages/shared-command-kit/src/rest/index.ts +11 -0
  141. package/packages/shared-command-kit/src/studio/index.ts +12 -0
  142. package/packages/shared-command-kit/src/validation/index.ts +6 -0
  143. package/packages/shared-command-kit/src/validation/schema-builders.ts +409 -0
  144. package/packages/shared-command-kit/src/ws-types.ts +106 -0
  145. package/packages/shared-command-kit/tsconfig.build.json +15 -0
  146. package/packages/shared-command-kit/tsconfig.json +9 -0
  147. package/packages/shared-command-kit/tsup.config.ts +30 -0
  148. package/packages/shared-command-kit/vitest.config.ts +4 -0
  149. package/packages/shared-http/package.json +67 -0
  150. package/packages/shared-http/src/__tests__/log-correlation.test.ts +81 -0
  151. package/packages/shared-http/src/__tests__/operation-metrics-tracker.test.ts +55 -0
  152. package/packages/shared-http/src/http-observability-collector.ts +363 -0
  153. package/packages/shared-http/src/index.ts +36 -0
  154. package/packages/shared-http/src/log-correlation.ts +89 -0
  155. package/packages/shared-http/src/operation-metrics-tracker.ts +107 -0
  156. package/packages/shared-http/src/register-openapi.ts +108 -0
  157. package/packages/shared-http/src/resolve-schema-ref.ts +75 -0
  158. package/packages/shared-http/src/schemas.ts +29 -0
  159. package/packages/shared-http/src/service-observability.ts +63 -0
  160. package/packages/shared-http/tsconfig.build.json +15 -0
  161. package/packages/shared-http/tsconfig.json +9 -0
  162. package/packages/shared-http/tsup.config.ts +23 -0
  163. package/packages/shared-http/vitest.config.ts +13 -0
  164. package/packages/shared-perm-presets/CHANGELOG.md +20 -0
  165. package/packages/shared-perm-presets/README.md +78 -0
  166. package/packages/shared-perm-presets/eslint.config.js +27 -0
  167. package/packages/shared-perm-presets/package.json +45 -0
  168. package/packages/shared-perm-presets/src/__tests__/combine.test.ts +403 -0
  169. package/packages/shared-perm-presets/src/__tests__/presets.test.ts +205 -0
  170. package/packages/shared-perm-presets/src/combine.ts +278 -0
  171. package/packages/shared-perm-presets/src/index.ts +18 -0
  172. package/packages/shared-perm-presets/src/presets/ci-environment.ts +34 -0
  173. package/packages/shared-perm-presets/src/presets/full-env.ts +16 -0
  174. package/packages/shared-perm-presets/src/presets/git-workflow.ts +40 -0
  175. package/packages/shared-perm-presets/src/presets/index.ts +8 -0
  176. package/packages/shared-perm-presets/src/presets/kb-platform.ts +30 -0
  177. package/packages/shared-perm-presets/src/presets/llm-access.ts +29 -0
  178. package/packages/shared-perm-presets/src/presets/minimal.ts +21 -0
  179. package/packages/shared-perm-presets/src/presets/npm-publish.ts +48 -0
  180. package/packages/shared-perm-presets/src/presets/vector-store.ts +40 -0
  181. package/packages/shared-perm-presets/src/types.ts +192 -0
  182. package/packages/shared-perm-presets/tsconfig.build.json +15 -0
  183. package/packages/shared-perm-presets/tsconfig.json +9 -0
  184. package/packages/shared-perm-presets/tsup.config.ts +8 -0
  185. package/packages/shared-perm-presets/vitest.config.ts +9 -0
  186. package/packages/shared-testing/CHANGELOG.md +20 -0
  187. package/packages/shared-testing/README.md +430 -0
  188. package/packages/shared-testing/package.json +51 -0
  189. package/packages/shared-testing/src/__tests__/create-test-context.test.ts +199 -0
  190. package/packages/shared-testing/src/__tests__/mock-cache.test.ts +174 -0
  191. package/packages/shared-testing/src/__tests__/mock-llm.test.ts +212 -0
  192. package/packages/shared-testing/src/__tests__/setup-platform.test.ts +90 -0
  193. package/packages/shared-testing/src/__tests__/test-command.test.ts +557 -0
  194. package/packages/shared-testing/src/create-test-context.ts +550 -0
  195. package/packages/shared-testing/src/index.ts +77 -0
  196. package/packages/shared-testing/src/mock-cache.ts +179 -0
  197. package/packages/shared-testing/src/mock-llm.ts +319 -0
  198. package/packages/shared-testing/src/mock-logger.ts +97 -0
  199. package/packages/shared-testing/src/mock-storage.ts +108 -0
  200. package/packages/shared-testing/src/setup-platform.ts +101 -0
  201. package/packages/shared-testing/src/test-command.ts +288 -0
  202. package/packages/shared-testing/tsconfig.build.json +15 -0
  203. package/packages/shared-testing/tsconfig.json +9 -0
  204. package/packages/shared-testing/tsup.config.ts +20 -0
  205. package/packages/shared-testing/vitest.config.ts +3 -0
  206. package/packages/shared-tool-kit/CHANGELOG.md +20 -0
  207. package/packages/shared-tool-kit/package.json +47 -0
  208. package/packages/shared-tool-kit/src/__tests__/factory.test.ts +103 -0
  209. package/packages/shared-tool-kit/src/__tests__/mock-tool.test.ts +95 -0
  210. package/packages/shared-tool-kit/src/factory.ts +126 -0
  211. package/packages/shared-tool-kit/src/index.ts +32 -0
  212. package/packages/shared-tool-kit/src/testing/index.ts +84 -0
  213. package/packages/shared-tool-kit/tsconfig.build.json +15 -0
  214. package/packages/shared-tool-kit/tsconfig.json +9 -0
  215. package/packages/shared-tool-kit/tsup.config.ts +21 -0
  216. package/pnpm-workspace.yaml +11070 -0
  217. package/prettierrc.json +1 -0
  218. package/scripts/devkit-sync.mjs +37 -0
  219. package/scripts/hooks/post-push +9 -0
  220. package/scripts/hooks/pre-commit +9 -0
  221. package/scripts/hooks/pre-push +9 -0
  222. package/tsconfig.base.json +9 -0
  223. package/tsconfig.build.json +15 -0
  224. package/tsconfig.json +9 -0
  225. package/tsconfig.paths.json +50 -0
  226. package/tsconfig.tools.json +18 -0
  227. package/tsup.config.bin.ts +34 -0
  228. package/tsup.config.cli.ts +41 -0
  229. package/tsup.config.dual.ts +46 -0
  230. package/tsup.config.ts +36 -0
  231. package/tsup.external.json +104 -0
  232. package/vitest.config.ts +48 -0
@@ -0,0 +1,89 @@
1
+ # High-level API
2
+
3
+ Complete wrapper for building commands with zero boilerplate.
4
+
5
+ ## defineCommand
6
+
7
+ The `defineCommand` function handles all boilerplate automatically:
8
+
9
+ - Flag validation
10
+ - Logging
11
+ - Analytics
12
+ - Error handling
13
+ - Output formatting
14
+ - Timing tracking
15
+
16
+ ### Basic Example
17
+
18
+ ```typescript
19
+ import { defineCommand } from '@kb-labs/cli-command-kit';
20
+
21
+ export const myCommand = defineCommand({
22
+ name: 'my-command',
23
+ flags: {
24
+ scope: { type: 'string', required: true },
25
+ 'dry-run': { type: 'boolean', default: false },
26
+ },
27
+ async handler(ctx, argv, flags) {
28
+ ctx.logger?.info('Command started', { scope: flags.scope });
29
+ ctx.tracker.checkpoint('start');
30
+
31
+ // Business logic
32
+
33
+ return { ok: true };
34
+ },
35
+ });
36
+ ```
37
+
38
+ ### With Analytics
39
+
40
+ ```typescript
41
+ export const myCommand = defineCommand({
42
+ name: 'my-command',
43
+ flags: { /* ... */ },
44
+ analytics: {
45
+ startEvent: 'MY_COMMAND_STARTED',
46
+ finishEvent: 'MY_COMMAND_FINISHED',
47
+ includeFlags: true,
48
+ },
49
+ async handler(ctx, argv, flags) {
50
+ // Analytics events are sent automatically
51
+ return { ok: true };
52
+ },
53
+ });
54
+ ```
55
+
56
+ ### With Custom Formatter
57
+
58
+ ```typescript
59
+ export const myCommand = defineCommand({
60
+ name: 'my-command',
61
+ flags: { /* ... */ },
62
+ async handler(ctx, argv, flags) {
63
+ return { ok: true, data: 'result' };
64
+ },
65
+ formatter(result, ctx, flags) {
66
+ if (flags.json) {
67
+ ctx.output?.json(result);
68
+ } else {
69
+ ctx.output?.write(`✓ Success: ${result.data}`);
70
+ }
71
+ },
72
+ });
73
+ ```
74
+
75
+ ## Enhanced Context
76
+
77
+ The handler receives an enhanced context with:
78
+
79
+ - `ctx.tracker` - TimingTracker instance
80
+ - All original `ctx` properties (logger, output, etc.)
81
+
82
+ ## Return Values
83
+
84
+ Handler can return:
85
+
86
+ - `number` - Exit code (0 = success, non-zero = error)
87
+ - `{ ok: boolean, ... }` - Result object (ok: true = success, ok: false = error)
88
+ - Defaults to `{ ok: true }` if nothing returned
89
+
@@ -0,0 +1,105 @@
1
+ # Low-level API
2
+
3
+ Atomic utilities for building commands manually.
4
+
5
+ ## Flag Validation
6
+
7
+ ### defineFlags
8
+
9
+ Define a flag schema with automatic type inference.
10
+
11
+ ```typescript
12
+ import { defineFlags } from '@kb-labs/cli-command-kit/flags';
13
+
14
+ const schema = defineFlags({
15
+ scope: {
16
+ type: 'string',
17
+ required: true,
18
+ pattern: /^[@a-z0-9-/]+$/i,
19
+ },
20
+ 'dry-run': {
21
+ type: 'boolean',
22
+ default: false,
23
+ },
24
+ });
25
+
26
+ type Flags = typeof schema.infer;
27
+ ```
28
+
29
+ ### validateFlags
30
+
31
+ Validate flags against schema.
32
+
33
+ ```typescript
34
+ import { validateFlags } from '@kb-labs/cli-command-kit/flags';
35
+
36
+ const flags = await validateFlags(rawFlags, schema);
37
+ ```
38
+
39
+ ### validateFlagsSafe
40
+
41
+ Safe version that doesn't throw.
42
+
43
+ ```typescript
44
+ import { validateFlagsSafe } from '@kb-labs/cli-command-kit/flags';
45
+
46
+ const result = await validateFlagsSafe(rawFlags, schema);
47
+ if (!result.success) {
48
+ // Handle errors
49
+ }
50
+ ```
51
+
52
+ ## Analytics
53
+
54
+ ### trackCommand
55
+
56
+ Wrapper around analytics SDK.
57
+
58
+ ```typescript
59
+ import { trackCommand } from '@kb-labs/cli-command-kit/analytics';
60
+
61
+ const { emit, scope } = trackCommand(ctx.analytics, {
62
+ command: 'my-command',
63
+ startEvent: 'MY_COMMAND_STARTED',
64
+ finishEvent: 'MY_COMMAND_FINISHED',
65
+ });
66
+
67
+ return await scope(async () => {
68
+ await emit('started', { flags });
69
+ // business logic
70
+ await emit('finished', { result: 'success' });
71
+ });
72
+ ```
73
+
74
+ ## Error Formatting
75
+
76
+ ### formatError
77
+
78
+ Format errors for display.
79
+
80
+ ```typescript
81
+ import { formatError } from '@kb-labs/cli-command-kit/errors';
82
+
83
+ const formatted = formatError(error, {
84
+ jsonMode: Boolean(flags.json),
85
+ showStack: Boolean(flags.debug),
86
+ timingMs: tracker.total(),
87
+ });
88
+ ```
89
+
90
+ ## Timing
91
+
92
+ ### TimingTracker
93
+
94
+ Re-exported from `@kb-labs/shared-cli-ui`.
95
+
96
+ ```typescript
97
+ import { TimingTracker } from '@kb-labs/cli-command-kit/helpers';
98
+
99
+ const tracker = new TimingTracker();
100
+ tracker.checkpoint('start');
101
+ // ...
102
+ tracker.checkpoint('complete');
103
+ const total = tracker.total();
104
+ ```
105
+
@@ -0,0 +1,135 @@
1
+ # Migration Guide
2
+
3
+ Guide for migrating existing commands to use Command Kit.
4
+
5
+ ## Low-level Migration
6
+
7
+ ### Before
8
+
9
+ ```typescript
10
+ export async function myHandler(
11
+ ctx: CliContext,
12
+ argv: string[],
13
+ rawFlags: Record<string, unknown>
14
+ ) {
15
+ const jsonMode = !!rawFlags.json;
16
+ const scope = rawFlags.scope as string;
17
+
18
+ if (!scope) {
19
+ ctx.output?.error('--scope is required');
20
+ return 1;
21
+ }
22
+
23
+ // business logic
24
+ }
25
+ ```
26
+
27
+ ### After
28
+
29
+ ```typescript
30
+ import { defineFlags, validateFlags } from '@kb-labs/cli-command-kit/flags';
31
+ import { TimingTracker } from '@kb-labs/cli-command-kit/helpers';
32
+ import { trackCommand } from '@kb-labs/cli-command-kit/analytics';
33
+ import { formatError } from '@kb-labs/cli-command-kit/errors';
34
+
35
+ const schema = defineFlags({
36
+ scope: { type: 'string', required: true },
37
+ json: { type: 'boolean', default: false },
38
+ });
39
+
40
+ export async function myHandler(
41
+ ctx: CliContext,
42
+ argv: string[],
43
+ rawFlags: Record<string, unknown>
44
+ ) {
45
+ const tracker = new TimingTracker();
46
+
47
+ try {
48
+ const flags = await validateFlags(rawFlags, schema);
49
+
50
+ const { emit, scope } = trackCommand(ctx.analytics, {
51
+ command: 'my-command',
52
+ startEvent: 'MY_COMMAND_STARTED',
53
+ finishEvent: 'MY_COMMAND_FINISHED',
54
+ });
55
+
56
+ return await scope(async () => {
57
+ await emit('started', { scope: flags.scope });
58
+
59
+ // business logic
60
+
61
+ await emit('finished', { result: 'success' });
62
+ return 0;
63
+ });
64
+ } catch (error) {
65
+ const formatted = formatError(error, { jsonMode: Boolean(rawFlags.json) });
66
+ if (rawFlags.json) {
67
+ ctx.output?.json(formatted.json);
68
+ } else {
69
+ ctx.output?.error(formatted.message);
70
+ }
71
+ return 1;
72
+ }
73
+ }
74
+ ```
75
+
76
+ ## High-level Migration
77
+
78
+ ### Before
79
+
80
+ ```typescript
81
+ export const run: Command = {
82
+ name: 'release:run',
83
+ category: 'release',
84
+ describe: 'Execute release process',
85
+ async run(ctx, argv, flags) {
86
+ const jsonMode = !!flags.json;
87
+ // ... lots of boilerplate
88
+ },
89
+ };
90
+
91
+ export async function runCommand(ctx, argv, flags) {
92
+ return run.run(ctx, argv, flags);
93
+ }
94
+ ```
95
+
96
+ ### After
97
+
98
+ ```typescript
99
+ import { defineCommand } from '@kb-labs/cli-command-kit';
100
+
101
+ export const runCommand = defineCommand({
102
+ name: 'release:run',
103
+ flags: {
104
+ scope: { type: 'string' },
105
+ 'dry-run': { type: 'boolean', default: false },
106
+ json: { type: 'boolean', default: false },
107
+ },
108
+ analytics: {
109
+ startEvent: 'RELEASE_RUN_STARTED',
110
+ finishEvent: 'RELEASE_RUN_FINISHED',
111
+ },
112
+ async handler(ctx, argv, flags) {
113
+ // flags are typed and validated automatically
114
+ // ctx.tracker is available
115
+ // analytics is handled automatically
116
+
117
+ ctx.logger?.info('Release started', { scope: flags.scope });
118
+ ctx.tracker.checkpoint('planning');
119
+
120
+ // business logic
121
+
122
+ return { ok: true, published: 5 };
123
+ },
124
+ });
125
+ ```
126
+
127
+ ## Key Changes
128
+
129
+ 1. **Remove Command object wrapper** - Export function directly
130
+ 2. **Use defineFlags** - Get type-safe flags
131
+ 3. **Use defineCommand** - Get all boilerplate handled automatically
132
+ 4. **Remove manual validation** - Handled by kit
133
+ 5. **Remove manual analytics** - Handled by kit
134
+ 6. **Remove manual error handling** - Handled by kit
135
+
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Standard ESLint configuration template
3
+ *
4
+ * This is the canonical template for all @kb-labs packages.
5
+ * DO NOT modify this file locally - it is synced from @kb-labs/devkit
6
+ *
7
+ * Customization guidelines:
8
+ * - DevKit preset already includes all standard ignores
9
+ * - Only add project-specific ignores if absolutely necessary
10
+ * - Document why custom ignores are needed
11
+ *
12
+ * @see https://github.com/kb-labs/devkit#eslint-configuration
13
+ */
14
+ import nodePreset from '@kb-labs/devkit/eslint/node.js';
15
+
16
+ export default [
17
+ ...nodePreset,
18
+
19
+ // OPTIONAL: Add project-specific ignores only if needed
20
+ // DevKit preset already ignores: dist/, coverage/, node_modules/, *.d.ts, scripts/, etc.
21
+ // {
22
+ // ignores: [
23
+ // // Add ONLY project-specific patterns here
24
+ // // Example: '**/*.generated.ts',
25
+ // ]
26
+ // }
27
+ ];
@@ -0,0 +1,14 @@
1
+ import preset from '@kb-labs/devkit/eslint/node';
2
+
3
+ export default [
4
+ ...preset,
5
+ {
6
+ languageOptions: {
7
+ parserOptions: {
8
+ projectService: true,
9
+ allowDefaultProject: true,
10
+ },
11
+ },
12
+ },
13
+ ];
14
+
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@kb-labs/shared-command-kit",
3
+ "version": "1.1.0",
4
+ "type": "module",
5
+ "description": "Command Kit for KB Labs CLI - utilities and high-level API for building commands",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./flags": {
14
+ "import": "./dist/flags/index.js",
15
+ "types": "./dist/flags/index.d.ts"
16
+ },
17
+ "./analytics": {
18
+ "import": "./dist/analytics/index.js",
19
+ "types": "./dist/analytics/index.d.ts"
20
+ },
21
+ "./errors": {
22
+ "import": "./dist/errors/index.js",
23
+ "types": "./dist/errors/index.d.ts"
24
+ },
25
+ "./helpers": {
26
+ "import": "./dist/helpers/index.js",
27
+ "types": "./dist/helpers/index.d.ts"
28
+ },
29
+ "./studio": {
30
+ "import": "./dist/studio/index.js",
31
+ "types": "./dist/studio/index.d.ts"
32
+ }
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "README.md",
37
+ "LICENSE"
38
+ ],
39
+ "sideEffects": false,
40
+ "scripts": {
41
+ "clean": "rimraf dist",
42
+ "build": "tsup --config tsup.config.ts",
43
+ "dev": "tsup --config tsup.config.ts --watch",
44
+ "lint": "eslint src",
45
+ "lint:fix": "eslint src --fix",
46
+ "type-check": "tsc --noEmit",
47
+ "test": "vitest run --passWithNoTests",
48
+ "test:watch": "vitest"
49
+ },
50
+ "dependencies": {
51
+ "@kb-labs/core-platform": "link:../../../kb-labs-core/packages/core-platform",
52
+ "@kb-labs/core-resource-broker": "link:../../../kb-labs-core/packages/core-resource-broker",
53
+ "@kb-labs/core-runtime": "link:../../../kb-labs-core/packages/core-runtime",
54
+ "@kb-labs/plugin-contracts": "link:../../../../infra/kb-labs-plugin/packages/plugin-contracts",
55
+ "@kb-labs/plugin-runtime": "link:../../../../infra/kb-labs-plugin/packages/plugin-runtime",
56
+ "@kb-labs/shared-cli-ui": "workspace:*",
57
+ "zod": "^3.23.8",
58
+ "glob": "^11.0.0"
59
+ },
60
+ "devDependencies": {
61
+ "@kb-labs/devkit": "link:../../../../infra/kb-labs-devkit",
62
+ "@types/node": "^24.3.3",
63
+ "rimraf": "^6.0.1",
64
+ "tsup": "^8.5.0",
65
+ "typescript": "^5.6.3",
66
+ "vitest": "^3.2.4"
67
+ },
68
+ "engines": {
69
+ "node": ">=20.0.0",
70
+ "pnpm": ">=9.0.0"
71
+ },
72
+ "packageManager": "pnpm@9.11.0",
73
+ "publishConfig": {
74
+ "access": "public"
75
+ }
76
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/prettierrc",
3
+ "extends": "@kb-labs/devkit/prettier/index.json"
4
+ }
5
+