@kb-labs/devkit 1.0.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 (295) hide show
  1. package/.cursorrules +32 -0
  2. package/.github/CODEOWNERS +2 -0
  3. package/.github/actions/setup-node-pnpm/action.yml +47 -0
  4. package/.github/workflow-templates/ci.yml +13 -0
  5. package/.github/workflow-templates/drift-check.yml +10 -0
  6. package/.github/workflow-templates/profiles-validate.yml +16 -0
  7. package/.github/workflow-templates/release.yml +8 -0
  8. package/.github/workflows/ci-reusable.yml +131 -0
  9. package/.github/workflows/drift-check-reusable.yml +23 -0
  10. package/.github/workflows/fixtures.yml +74 -0
  11. package/.github/workflows/profiles-validate-reusable.yml +67 -0
  12. package/.github/workflows/release-reusable.yml +50 -0
  13. package/.vscode/settings.json +23 -0
  14. package/AGENTS.md +130 -0
  15. package/LICENSE +21 -0
  16. package/README.md +1542 -0
  17. package/agents/devkit-maintainer/context.globs +15 -0
  18. package/agents/devkit-maintainer/permissions.yml +17 -0
  19. package/agents/devkit-maintainer/prompt.md +28 -0
  20. package/agents/devkit-maintainer/runbook.md +31 -0
  21. package/agents/docs-crafter/prompt.md +24 -0
  22. package/agents/docs-crafter/runbook.md +18 -0
  23. package/agents/release-manager/context.globs +7 -0
  24. package/agents/release-manager/prompt.md +27 -0
  25. package/agents/release-manager/runbook.md +17 -0
  26. package/agents/test-generator/context.globs +7 -0
  27. package/agents/test-generator/prompt.md +27 -0
  28. package/agents/test-generator/runbook.md +18 -0
  29. package/bin/devkit-architecture.mjs +1225 -0
  30. package/bin/devkit-build-order.mjs +500 -0
  31. package/bin/devkit-check-build-readiness.mjs +222 -0
  32. package/bin/devkit-check-commands.mjs +394 -0
  33. package/bin/devkit-check-configs.mjs +461 -0
  34. package/bin/devkit-check-deprecated.mjs +532 -0
  35. package/bin/devkit-check-duplicates.mjs +431 -0
  36. package/bin/devkit-check-exports.mjs +561 -0
  37. package/bin/devkit-check-imports.mjs +712 -0
  38. package/bin/devkit-check-paths.mjs +670 -0
  39. package/bin/devkit-check-scripts.mjs +335 -0
  40. package/bin/devkit-check-structure.mjs +495 -0
  41. package/bin/devkit-check-types.mjs +450 -0
  42. package/bin/devkit-ci.mjs +261 -0
  43. package/bin/devkit-core-gate.mjs +225 -0
  44. package/bin/devkit-fix-deps.mjs +1169 -0
  45. package/bin/devkit-freshness.mjs +199 -0
  46. package/bin/devkit-health.mjs +489 -0
  47. package/bin/devkit-migrate-configs.mjs +370 -0
  48. package/bin/devkit-paths.mjs +192 -0
  49. package/bin/devkit-stats.mjs +453 -0
  50. package/bin/devkit-sync.mjs +12 -0
  51. package/bin/devkit-tsup-external.mjs +148 -0
  52. package/bin/devkit-types-audit.mjs +615 -0
  53. package/bin/devkit-types-order.mjs +637 -0
  54. package/bin/devkit-validate-naming.mjs +203 -0
  55. package/bin/devkit-visualize.mjs +452 -0
  56. package/bin/kb-devkit-qa-history.mjs +453 -0
  57. package/bin/kb-devkit-qa.mjs +915 -0
  58. package/eslint/node.js +134 -0
  59. package/eslint/react.js +260 -0
  60. package/package.json +186 -0
  61. package/prettier/index.json +10 -0
  62. package/sync/index.mjs +693 -0
  63. package/templates/configs/README.md +306 -0
  64. package/templates/configs/eslint.config.js +27 -0
  65. package/templates/configs/package.json.bin +25 -0
  66. package/templates/configs/package.json.lib +30 -0
  67. package/templates/configs/tsconfig.build.json +15 -0
  68. package/templates/configs/tsconfig.json +9 -0
  69. package/templates/configs/tsup.config.bin.ts +34 -0
  70. package/templates/configs/tsup.config.cli.ts +41 -0
  71. package/templates/configs/tsup.config.dual.ts +46 -0
  72. package/templates/configs/tsup.config.ts +36 -0
  73. package/templates/package-json/README.md +290 -0
  74. package/templates/package-json/package.json.bin.template +40 -0
  75. package/templates/package-json/package.json.template +45 -0
  76. package/tsconfig/base.json +21 -0
  77. package/tsconfig/cli.json +12 -0
  78. package/tsconfig/dist/__tests__/cache.spec.d.ts +6 -0
  79. package/tsconfig/dist/__tests__/cache.spec.d.ts.map +1 -0
  80. package/tsconfig/dist/__tests__/cache.spec.js +85 -0
  81. package/tsconfig/dist/__tests__/cache.spec.js.map +1 -0
  82. package/tsconfig/dist/__tests__/fs-atomic.spec.d.ts +6 -0
  83. package/tsconfig/dist/__tests__/fs-atomic.spec.d.ts.map +1 -0
  84. package/tsconfig/dist/__tests__/fs-atomic.spec.js +153 -0
  85. package/tsconfig/dist/__tests__/fs-atomic.spec.js.map +1 -0
  86. package/tsconfig/dist/__tests__/init-workspace.spec.d.ts +6 -0
  87. package/tsconfig/dist/__tests__/init-workspace.spec.d.ts.map +1 -0
  88. package/tsconfig/dist/__tests__/init-workspace.spec.js +99 -0
  89. package/tsconfig/dist/__tests__/init-workspace.spec.js.map +1 -0
  90. package/tsconfig/dist/__tests__/kb-error.spec.d.ts +6 -0
  91. package/tsconfig/dist/__tests__/kb-error.spec.d.ts.map +1 -0
  92. package/tsconfig/dist/__tests__/kb-error.spec.js +190 -0
  93. package/tsconfig/dist/__tests__/kb-error.spec.js.map +1 -0
  94. package/tsconfig/dist/__tests__/preset-lockfile.spec.d.ts +6 -0
  95. package/tsconfig/dist/__tests__/preset-lockfile.spec.d.ts.map +1 -0
  96. package/tsconfig/dist/__tests__/preset-lockfile.spec.js +142 -0
  97. package/tsconfig/dist/__tests__/preset-lockfile.spec.js.map +1 -0
  98. package/tsconfig/dist/__tests__/product-config-profiles.spec.d.ts +6 -0
  99. package/tsconfig/dist/__tests__/product-config-profiles.spec.d.ts.map +1 -0
  100. package/tsconfig/dist/__tests__/product-config-profiles.spec.js +100 -0
  101. package/tsconfig/dist/__tests__/product-config-profiles.spec.js.map +1 -0
  102. package/tsconfig/dist/__tests__/product-config.spec.d.ts +6 -0
  103. package/tsconfig/dist/__tests__/product-config.spec.d.ts.map +1 -0
  104. package/tsconfig/dist/__tests__/product-config.spec.js +298 -0
  105. package/tsconfig/dist/__tests__/product-config.spec.js.map +1 -0
  106. package/tsconfig/dist/__tests__/runtime.spec.d.ts +2 -0
  107. package/tsconfig/dist/__tests__/runtime.spec.d.ts.map +1 -0
  108. package/tsconfig/dist/__tests__/runtime.spec.js +127 -0
  109. package/tsconfig/dist/__tests__/runtime.spec.js.map +1 -0
  110. package/tsconfig/dist/__tests__/upsert-lockfile.spec.d.ts +6 -0
  111. package/tsconfig/dist/__tests__/upsert-lockfile.spec.d.ts.map +1 -0
  112. package/tsconfig/dist/__tests__/upsert-lockfile.spec.js +251 -0
  113. package/tsconfig/dist/__tests__/upsert-lockfile.spec.js.map +1 -0
  114. package/tsconfig/dist/__tests__/validate-config.spec.d.ts +2 -0
  115. package/tsconfig/dist/__tests__/validate-config.spec.d.ts.map +1 -0
  116. package/tsconfig/dist/__tests__/validate-config.spec.js +14 -0
  117. package/tsconfig/dist/__tests__/validate-config.spec.js.map +1 -0
  118. package/tsconfig/dist/api/init-workspace.d.ts +10 -0
  119. package/tsconfig/dist/api/init-workspace.d.ts.map +1 -0
  120. package/tsconfig/dist/api/init-workspace.js +191 -0
  121. package/tsconfig/dist/api/init-workspace.js.map +1 -0
  122. package/tsconfig/dist/api/product-config.d.ts +21 -0
  123. package/tsconfig/dist/api/product-config.d.ts.map +1 -0
  124. package/tsconfig/dist/api/product-config.js +192 -0
  125. package/tsconfig/dist/api/product-config.js.map +1 -0
  126. package/tsconfig/dist/api/read-config.d.ts +22 -0
  127. package/tsconfig/dist/api/read-config.d.ts.map +1 -0
  128. package/tsconfig/dist/api/read-config.js +105 -0
  129. package/tsconfig/dist/api/read-config.js.map +1 -0
  130. package/tsconfig/dist/api/upsert-lockfile.d.ts +10 -0
  131. package/tsconfig/dist/api/upsert-lockfile.d.ts.map +1 -0
  132. package/tsconfig/dist/api/upsert-lockfile.js +63 -0
  133. package/tsconfig/dist/api/upsert-lockfile.js.map +1 -0
  134. package/tsconfig/dist/cache/fs-cache.d.ts +38 -0
  135. package/tsconfig/dist/cache/fs-cache.d.ts.map +1 -0
  136. package/tsconfig/dist/cache/fs-cache.js +142 -0
  137. package/tsconfig/dist/cache/fs-cache.js.map +1 -0
  138. package/tsconfig/dist/errors/kb-error.d.ts +32 -0
  139. package/tsconfig/dist/errors/kb-error.d.ts.map +1 -0
  140. package/tsconfig/dist/errors/kb-error.js +54 -0
  141. package/tsconfig/dist/errors/kb-error.js.map +1 -0
  142. package/tsconfig/dist/fs/__tests__/fs.spec.d.ts +2 -0
  143. package/tsconfig/dist/fs/__tests__/fs.spec.d.ts.map +1 -0
  144. package/tsconfig/dist/fs/__tests__/fs.spec.js +22 -0
  145. package/tsconfig/dist/fs/__tests__/fs.spec.js.map +1 -0
  146. package/tsconfig/dist/fs/fs.d.ts +6 -0
  147. package/tsconfig/dist/fs/fs.d.ts.map +1 -0
  148. package/tsconfig/dist/fs/fs.js +12 -0
  149. package/tsconfig/dist/fs/fs.js.map +1 -0
  150. package/tsconfig/dist/fs/index.d.ts +2 -0
  151. package/tsconfig/dist/fs/index.d.ts.map +1 -0
  152. package/tsconfig/dist/fs/index.js +2 -0
  153. package/tsconfig/dist/fs/index.js.map +1 -0
  154. package/tsconfig/dist/hash/config-hash.d.ts +17 -0
  155. package/tsconfig/dist/hash/config-hash.d.ts.map +1 -0
  156. package/tsconfig/dist/hash/config-hash.js +55 -0
  157. package/tsconfig/dist/hash/config-hash.js.map +1 -0
  158. package/tsconfig/dist/index.d.ts +5 -0
  159. package/tsconfig/dist/index.d.ts.map +1 -0
  160. package/tsconfig/dist/index.js +5 -0
  161. package/tsconfig/dist/index.js.map +1 -0
  162. package/tsconfig/dist/lockfile/lockfile.d.ts +54 -0
  163. package/tsconfig/dist/lockfile/lockfile.d.ts.map +1 -0
  164. package/tsconfig/dist/lockfile/lockfile.js +141 -0
  165. package/tsconfig/dist/lockfile/lockfile.js.map +1 -0
  166. package/tsconfig/dist/logging/__tests__/logger.spec.d.ts +2 -0
  167. package/tsconfig/dist/logging/__tests__/logger.spec.d.ts.map +1 -0
  168. package/tsconfig/dist/logging/__tests__/logger.spec.js +65 -0
  169. package/tsconfig/dist/logging/__tests__/logger.spec.js.map +1 -0
  170. package/tsconfig/dist/logging/__tests__/redaction.spec.d.ts +2 -0
  171. package/tsconfig/dist/logging/__tests__/redaction.spec.d.ts.map +1 -0
  172. package/tsconfig/dist/logging/__tests__/redaction.spec.js +34 -0
  173. package/tsconfig/dist/logging/__tests__/redaction.spec.js.map +1 -0
  174. package/tsconfig/dist/logging/__tests__/sinks-and-env.spec.d.ts +2 -0
  175. package/tsconfig/dist/logging/__tests__/sinks-and-env.spec.d.ts.map +1 -0
  176. package/tsconfig/dist/logging/__tests__/sinks-and-env.spec.js +90 -0
  177. package/tsconfig/dist/logging/__tests__/sinks-and-env.spec.js.map +1 -0
  178. package/tsconfig/dist/logging/index.d.ts +6 -0
  179. package/tsconfig/dist/logging/index.d.ts.map +1 -0
  180. package/tsconfig/dist/logging/index.js +6 -0
  181. package/tsconfig/dist/logging/index.js.map +1 -0
  182. package/tsconfig/dist/logging/logger.d.ts +9 -0
  183. package/tsconfig/dist/logging/logger.d.ts.map +1 -0
  184. package/tsconfig/dist/logging/logger.js +101 -0
  185. package/tsconfig/dist/logging/logger.js.map +1 -0
  186. package/tsconfig/dist/logging/redaction.d.ts +7 -0
  187. package/tsconfig/dist/logging/redaction.d.ts.map +1 -0
  188. package/tsconfig/dist/logging/redaction.js +23 -0
  189. package/tsconfig/dist/logging/redaction.js.map +1 -0
  190. package/tsconfig/dist/logging/sinks/json.d.ts +4 -0
  191. package/tsconfig/dist/logging/sinks/json.d.ts.map +1 -0
  192. package/tsconfig/dist/logging/sinks/json.js +23 -0
  193. package/tsconfig/dist/logging/sinks/json.js.map +1 -0
  194. package/tsconfig/dist/logging/sinks/stdout.d.ts +3 -0
  195. package/tsconfig/dist/logging/sinks/stdout.d.ts.map +1 -0
  196. package/tsconfig/dist/logging/sinks/stdout.js +24 -0
  197. package/tsconfig/dist/logging/sinks/stdout.js.map +1 -0
  198. package/tsconfig/dist/logging/types/index.d.ts +2 -0
  199. package/tsconfig/dist/logging/types/index.d.ts.map +1 -0
  200. package/tsconfig/dist/logging/types/index.js +2 -0
  201. package/tsconfig/dist/logging/types/index.js.map +1 -0
  202. package/tsconfig/dist/logging/types/types.d.ts +37 -0
  203. package/tsconfig/dist/logging/types/types.d.ts.map +1 -0
  204. package/tsconfig/dist/logging/types/types.js +2 -0
  205. package/tsconfig/dist/logging/types/types.js.map +1 -0
  206. package/tsconfig/dist/merge/layered-merge.d.ts +16 -0
  207. package/tsconfig/dist/merge/layered-merge.d.ts.map +1 -0
  208. package/tsconfig/dist/merge/layered-merge.js +97 -0
  209. package/tsconfig/dist/merge/layered-merge.js.map +1 -0
  210. package/tsconfig/dist/preset/resolve-preset.d.ts +29 -0
  211. package/tsconfig/dist/preset/resolve-preset.d.ts.map +1 -0
  212. package/tsconfig/dist/preset/resolve-preset.js +104 -0
  213. package/tsconfig/dist/preset/resolve-preset.js.map +1 -0
  214. package/tsconfig/dist/repo/__tests__/repo.spec.d.ts +2 -0
  215. package/tsconfig/dist/repo/__tests__/repo.spec.d.ts.map +1 -0
  216. package/tsconfig/dist/repo/__tests__/repo.spec.js +25 -0
  217. package/tsconfig/dist/repo/__tests__/repo.spec.js.map +1 -0
  218. package/tsconfig/dist/repo/index.d.ts +2 -0
  219. package/tsconfig/dist/repo/index.d.ts.map +1 -0
  220. package/tsconfig/dist/repo/index.js +2 -0
  221. package/tsconfig/dist/repo/index.js.map +1 -0
  222. package/tsconfig/dist/repo/repo.d.ts +6 -0
  223. package/tsconfig/dist/repo/repo.d.ts.map +1 -0
  224. package/tsconfig/dist/repo/repo.js +25 -0
  225. package/tsconfig/dist/repo/repo.js.map +1 -0
  226. package/tsconfig/dist/runtime/index.d.ts +2 -0
  227. package/tsconfig/dist/runtime/index.d.ts.map +1 -0
  228. package/tsconfig/dist/runtime/index.js +2 -0
  229. package/tsconfig/dist/runtime/index.js.map +1 -0
  230. package/tsconfig/dist/runtime/runtime.d.ts +46 -0
  231. package/tsconfig/dist/runtime/runtime.d.ts.map +1 -0
  232. package/tsconfig/dist/runtime/runtime.js +126 -0
  233. package/tsconfig/dist/runtime/runtime.js.map +1 -0
  234. package/tsconfig/dist/tsconfig.tools.tsbuildinfo +1 -0
  235. package/tsconfig/dist/tsconfig.tsbuildinfo +1 -0
  236. package/tsconfig/dist/types/index.d.ts +2 -0
  237. package/tsconfig/dist/types/index.d.ts.map +1 -0
  238. package/tsconfig/dist/types/index.js +2 -0
  239. package/tsconfig/dist/types/index.js.map +1 -0
  240. package/tsconfig/dist/types/init.d.ts +34 -0
  241. package/tsconfig/dist/types/init.d.ts.map +1 -0
  242. package/tsconfig/dist/types/init.js +6 -0
  243. package/tsconfig/dist/types/init.js.map +1 -0
  244. package/tsconfig/dist/types/preset.d.ts +27 -0
  245. package/tsconfig/dist/types/preset.d.ts.map +1 -0
  246. package/tsconfig/dist/types/preset.js +6 -0
  247. package/tsconfig/dist/types/preset.js.map +1 -0
  248. package/tsconfig/dist/types/types.d.ts +6 -0
  249. package/tsconfig/dist/types/types.d.ts.map +1 -0
  250. package/tsconfig/dist/types/types.js +2 -0
  251. package/tsconfig/dist/types/types.js.map +1 -0
  252. package/tsconfig/dist/utils/__tests__/env.spec.d.ts +2 -0
  253. package/tsconfig/dist/utils/__tests__/env.spec.d.ts.map +1 -0
  254. package/tsconfig/dist/utils/__tests__/env.spec.js +33 -0
  255. package/tsconfig/dist/utils/__tests__/env.spec.js.map +1 -0
  256. package/tsconfig/dist/utils/env.d.ts +7 -0
  257. package/tsconfig/dist/utils/env.d.ts.map +1 -0
  258. package/tsconfig/dist/utils/env.js +25 -0
  259. package/tsconfig/dist/utils/env.js.map +1 -0
  260. package/tsconfig/dist/utils/fs-atomic.d.ts +15 -0
  261. package/tsconfig/dist/utils/fs-atomic.d.ts.map +1 -0
  262. package/tsconfig/dist/utils/fs-atomic.js +45 -0
  263. package/tsconfig/dist/utils/fs-atomic.js.map +1 -0
  264. package/tsconfig/dist/utils/index.d.ts +3 -0
  265. package/tsconfig/dist/utils/index.d.ts.map +1 -0
  266. package/tsconfig/dist/utils/index.js +3 -0
  267. package/tsconfig/dist/utils/index.js.map +1 -0
  268. package/tsconfig/dist/utils/paths.d.ts +21 -0
  269. package/tsconfig/dist/utils/paths.d.ts.map +1 -0
  270. package/tsconfig/dist/utils/paths.js +32 -0
  271. package/tsconfig/dist/utils/paths.js.map +1 -0
  272. package/tsconfig/dist/utils/product-normalize.d.ts +27 -0
  273. package/tsconfig/dist/utils/product-normalize.d.ts.map +1 -0
  274. package/tsconfig/dist/utils/product-normalize.js +45 -0
  275. package/tsconfig/dist/utils/product-normalize.js.map +1 -0
  276. package/tsconfig/dist/validation/validate-config.d.ts +7 -0
  277. package/tsconfig/dist/validation/validate-config.d.ts.map +1 -0
  278. package/tsconfig/dist/validation/validate-config.js +22 -0
  279. package/tsconfig/dist/validation/validate-config.js.map +1 -0
  280. package/tsconfig/lib.json +13 -0
  281. package/tsconfig/node.json +12 -0
  282. package/tsconfig/react-app.json +8 -0
  283. package/tsconfig/react-lib.json +8 -0
  284. package/tsconfig/test.json +15 -0
  285. package/tsup/bin.js +172 -0
  286. package/tsup/dual.js +155 -0
  287. package/tsup/external-sync.mjs +41 -0
  288. package/tsup/external.mjs +109 -0
  289. package/tsup/node.js +65 -0
  290. package/tsup/react-lib.js +18 -0
  291. package/tsup/sdk.js +118 -0
  292. package/vite/react-app.js +50 -0
  293. package/vitest/node.js +37 -0
  294. package/vitest/react.js +39 -0
  295. package/vitest/vitest-setup.ts +9 -0
@@ -0,0 +1,104 @@
1
+ /**
2
+ * @module @kb-labs/core/config/preset/resolve-preset
3
+ * Org preset resolution with offline-first npm package loading
4
+ */
5
+ import { promises as fsp } from 'node:fs';
6
+ import path from 'node:path';
7
+ import { KbError, ERROR_HINTS } from '../errors/kb-error';
8
+ import { toFsProduct } from '../utils/product-normalize';
9
+ /**
10
+ * Resolve org preset package (offline-first)
11
+ */
12
+ export async function resolvePreset(presetRef, cwd) {
13
+ // Parse preset reference (e.g., "@kb-labs/org-preset@1.3.2")
14
+ const [name, version] = parsePresetRef(presetRef);
15
+ // Try local node_modules first (offline-first)
16
+ const localPath = path.join(cwd, 'node_modules', name);
17
+ try {
18
+ const presetInfo = await loadPresetFromPath(localPath, name, version);
19
+ if (presetInfo) {
20
+ return presetInfo;
21
+ }
22
+ }
23
+ catch {
24
+ // Local preset not found, continue to network resolution
25
+ }
26
+ // Try network resolution (this would be implemented with npm/pnpm APIs)
27
+ // For now, we'll throw an error if local resolution fails
28
+ throw new KbError('ERR_PRESET_NOT_RESOLVED', `Preset not found: ${presetRef}`, ERROR_HINTS.ERR_PRESET_NOT_RESOLVED, { presetRef, cwd });
29
+ }
30
+ /**
31
+ * Parse preset reference into name and version
32
+ */
33
+ function parsePresetRef(presetRef) {
34
+ const atIndex = presetRef.lastIndexOf('@');
35
+ if (atIndex === -1) {
36
+ throw new KbError('ERR_PRESET_REF_INVALID', `Invalid preset reference: ${presetRef}`, 'Preset references must include version (e.g., @kb-labs/org-preset@1.3.2)', { presetRef });
37
+ }
38
+ const name = presetRef.substring(0, atIndex);
39
+ const version = presetRef.substring(atIndex + 1);
40
+ if (!name || !version) {
41
+ throw new KbError('ERR_PRESET_REF_INVALID', `Invalid preset reference: ${presetRef}`, 'Preset references must include both name and version', { presetRef });
42
+ }
43
+ return [name, version];
44
+ }
45
+ /**
46
+ * Load preset from local path
47
+ */
48
+ async function loadPresetFromPath(presetPath, name, version) {
49
+ try {
50
+ // Check if preset directory exists
51
+ await fsp.access(presetPath);
52
+ // Load package.json to verify version
53
+ const packageJsonPath = path.join(presetPath, 'package.json');
54
+ const packageJson = JSON.parse(await fsp.readFile(packageJsonPath, 'utf-8'));
55
+ // Verify version matches (supports semver ranges)
56
+ if (!versionMatches(packageJson.version, version)) {
57
+ return null;
58
+ }
59
+ // Load preset config
60
+ const configPath = path.join(presetPath, 'config.defaults.json');
61
+ const config = JSON.parse(await fsp.readFile(configPath, 'utf-8'));
62
+ return {
63
+ name,
64
+ version: packageJson.version,
65
+ path: presetPath,
66
+ config,
67
+ };
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ }
73
+ /**
74
+ * Check if version matches (simple semver range support)
75
+ */
76
+ function versionMatches(actualVersion, requiredVersion) {
77
+ // Simple exact match for now
78
+ // TODO: Implement proper semver range matching
79
+ if (requiredVersion.startsWith('^')) {
80
+ const major = requiredVersion.substring(1).split('.')[0];
81
+ const actualMajor = actualVersion.split('.')[0];
82
+ return major === actualMajor;
83
+ }
84
+ return actualVersion === requiredVersion;
85
+ }
86
+ /**
87
+ * Get preset config for a specific product
88
+ */
89
+ export function getPresetConfigForProduct(preset, product) {
90
+ const fsProduct = toFsProduct(product);
91
+ return preset.config.products?.[fsProduct] || {};
92
+ }
93
+ /**
94
+ * Get preset metadata
95
+ */
96
+ export function getPresetMetadata(preset) {
97
+ return {
98
+ name: preset.name,
99
+ version: preset.version,
100
+ path: preset.path,
101
+ products: Object.keys(preset.config.products || {}),
102
+ };
103
+ }
104
+ //# sourceMappingURL=resolve-preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-preset.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/preset/resolve-preset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=repo.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.spec.d.ts","sourceRoot":"","sources":["../../../../../kb-labs-core/packages/sys/src/repo/__tests__/repo.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { promises as fsp } from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { findRepoRoot } from '../repo';
6
+ async function mkd(prefix = 'kb-core-sys-repo-') {
7
+ return await fsp.mkdtemp(path.join(os.tmpdir(), prefix));
8
+ }
9
+ describe('findRepoRoot', () => {
10
+ it('finds directory containing any marker (e.g., .git) when called from subdir', async () => {
11
+ const root = await mkd();
12
+ const sub = path.join(root, 'a/b/c');
13
+ await fsp.mkdir(sub, { recursive: true });
14
+ await fsp.mkdir(path.join(root, '.git'));
15
+ const found = await findRepoRoot(sub);
16
+ expect(found).toBe(root);
17
+ });
18
+ it('falls back to FS root if no marker is found up the tree', async () => {
19
+ const start = await mkd();
20
+ const found = await findRepoRoot(start);
21
+ // Implementation returns FS root when no markers are found
22
+ expect(found).toBe(path.parse(start).root);
23
+ });
24
+ });
25
+ //# sourceMappingURL=repo.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.spec.js","sourceRoot":"","sources":["../../../../../kb-labs-core/packages/sys/src/repo/__tests__/repo.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEtC,KAAK,UAAU,GAAG,CAAC,MAAM,GAAG,mBAAmB;IAC7C,OAAO,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,IAAI,GAAG,MAAM,GAAG,EAAE,CAAA;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACpC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;QAExC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAA;QACrC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,KAAK,GAAG,MAAM,GAAG,EAAE,CAAA;QACzB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,CAAA;QACvC,2DAA2D;QAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './repo';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/sys/src/repo/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './repo';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/sys/src/repo/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @module @kb-labs/core/sys/repo
3
+ * Repository root discovery. Pure infrastructure, no domain keys.
4
+ */
5
+ export declare function findRepoRoot(startDir?: string): Promise<string>;
6
+ //# sourceMappingURL=repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/sys/src/repo/repo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,wBAAsB,YAAY,CAAC,QAAQ,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU5E"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @module @kb-labs/core/sys/repo
3
+ * Repository root discovery. Pure infrastructure, no domain keys.
4
+ */
5
+ import path from "node:path";
6
+ import { promises as fsp } from "node:fs";
7
+ const markers = [".git", "pnpm-workspace.yaml", "package.json"];
8
+ export async function findRepoRoot(startDir = process.cwd()) {
9
+ let dir = path.resolve(startDir);
10
+ while (true) {
11
+ for (const m of markers) {
12
+ try {
13
+ await fsp.access(path.join(dir, m));
14
+ return dir;
15
+ }
16
+ catch { /* continue */ }
17
+ }
18
+ const parent = path.dirname(dir);
19
+ if (parent === dir) {
20
+ return dir;
21
+ } // FS root as fallback
22
+ dir = parent;
23
+ }
24
+ }
25
+ //# sourceMappingURL=repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/sys/src/repo/repo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,qBAAqB,EAAE,cAAc,CAAC,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;IACvD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,IAAI,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC;gBAAC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;gBAAC,OAAO,GAAG,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YAAA,OAAO,GAAG,CAAC;QAAA,CAAC,CAAC,sBAAsB;QACxD,GAAG,GAAG,MAAM,CAAC;IACjB,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './runtime';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/runtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './runtime';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/runtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @module @kb-labs/core/config/runtime
3
+ * Infrastructure-only config pipeline (no domain keys).
4
+ * Provides: nearest config discovery, safe JSON read with diagnostics,
5
+ * deep merge that ignores `undefined`, and a generic resolver (defaults→file→env→cli).
6
+ */
7
+ import type { Diagnostic, FindNearestConfigOpts, JsonReadResult, ProfilesConfig, KBConfig } from "../types";
8
+ /** Find nearest config file walking up from startDir until stopDir or FS root. */
9
+ export declare function findNearestConfig(opts: FindNearestConfigOpts): Promise<{
10
+ path: string | null;
11
+ tried: string[];
12
+ }>;
13
+ /** Read JSON with explicit diagnostics (no silent nulls). */
14
+ export declare function readJsonWithDiagnostics<T = unknown>(p: string): Promise<JsonReadResult<T>>;
15
+ /** Shallow pick of defined fields only. */
16
+ export declare function pickDefined<T extends Record<string, any>>(obj: T | undefined): Partial<T>;
17
+ /** Deep merge (objects/arrays), ignoring `undefined` on the overlay. */
18
+ export declare function mergeDefined<T>(base: T, over?: Partial<T>): T;
19
+ declare const SYSTEM_DEFAULTS: {
20
+ readonly profiles: {
21
+ readonly rootDir: ".kb/profiles";
22
+ readonly defaultName: "default";
23
+ readonly strict: true;
24
+ };
25
+ };
26
+ export interface ResolveConfigArgs<TConfig, _TEnvMap = unknown> {
27
+ defaults: TConfig;
28
+ fileConfig?: Partial<TConfig>;
29
+ envMapper?: (env: NodeJS.ProcessEnv) => Partial<TConfig> | undefined;
30
+ cliOverrides?: Partial<TConfig>;
31
+ validate?: (cfg: TConfig) => {
32
+ ok: boolean;
33
+ diagnostics?: Diagnostic[];
34
+ };
35
+ }
36
+ /**
37
+ * Generic resolver: defaults → fileConfig → envMapper(process.env) → cliOverrides.
38
+ * No domain keys inside; mapping/validation provided by the product/shared layer.
39
+ */
40
+ export declare function resolveConfig<TConfig>(args: ResolveConfigArgs<TConfig>): {
41
+ value: TConfig;
42
+ diagnostics: Diagnostic[];
43
+ };
44
+ export { SYSTEM_DEFAULTS };
45
+ export type { ProfilesConfig, KBConfig };
46
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/runtime/runtime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,qBAAqB,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE5G,kFAAkF;AAClF,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsBtH;AAED,6DAA6D;AAC7D,wBAAsB,uBAAuB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAehG;AAED,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAOzF;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAqB7D;AAMD,QAAA,MAAM,eAAe;;;;;;CAEX,CAAC;AAEX,MAAM,WAAW,iBAAiB,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO;IAC1D,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IACrE,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;CAC5E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,UAAU,EAAE,CAAA;CAAE,CAuBtH;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * @module @kb-labs/core/config/runtime
3
+ * Infrastructure-only config pipeline (no domain keys).
4
+ * Provides: nearest config discovery, safe JSON read with diagnostics,
5
+ * deep merge that ignores `undefined`, and a generic resolver (defaults→file→env→cli).
6
+ */
7
+ import { promises as fsp } from "node:fs";
8
+ import path from "node:path";
9
+ /** Find nearest config file walking up from startDir until stopDir or FS root. */
10
+ export async function findNearestConfig(opts) {
11
+ const start = path.resolve(opts.startDir ?? process.cwd());
12
+ const stop = opts.stopDir ? path.resolve(opts.stopDir) : null;
13
+ const tried = [];
14
+ let dir = start;
15
+ while (true) {
16
+ for (const name of opts.filenames) {
17
+ const candidate = path.join(dir, name);
18
+ tried.push(candidate);
19
+ try {
20
+ await fsp.access(candidate);
21
+ return { path: candidate, tried };
22
+ }
23
+ catch { /* continue */ }
24
+ }
25
+ const parent = path.dirname(dir);
26
+ if (parent === dir) {
27
+ break;
28
+ }
29
+ if (stop && (dir === stop || parent === stop)) {
30
+ break;
31
+ }
32
+ dir = parent;
33
+ }
34
+ return { path: null, tried };
35
+ }
36
+ /** Read JSON with explicit diagnostics (no silent nulls). */
37
+ export async function readJsonWithDiagnostics(p) {
38
+ const diagnostics = [];
39
+ try {
40
+ const raw = await fsp.readFile(p, "utf8");
41
+ try {
42
+ const data = JSON.parse(raw);
43
+ return { ok: true, data, diagnostics };
44
+ }
45
+ catch (e) {
46
+ diagnostics.push({ level: "error", code: "JSON_PARSE_FAILED", message: `Failed to parse JSON: ${p}`, detail: String(e) });
47
+ return { ok: false, diagnostics };
48
+ }
49
+ }
50
+ catch (e) {
51
+ diagnostics.push({ level: "error", code: "FILE_READ_FAILED", message: `Failed to read file: ${p}`, detail: String(e) });
52
+ return { ok: false, diagnostics };
53
+ }
54
+ }
55
+ /** Shallow pick of defined fields only. */
56
+ export function pickDefined(obj) {
57
+ if (!obj) {
58
+ return {};
59
+ }
60
+ const out = {};
61
+ for (const [k, v] of Object.entries(obj)) {
62
+ if (v !== undefined) {
63
+ out[k] = v;
64
+ }
65
+ }
66
+ return out;
67
+ }
68
+ /** Deep merge (objects/arrays), ignoring `undefined` on the overlay. */
69
+ export function mergeDefined(base, over) {
70
+ if (!over) {
71
+ return base;
72
+ }
73
+ if (Array.isArray(base) && Array.isArray(over)) {
74
+ return [...base, ...over.filter(v => v !== undefined)];
75
+ }
76
+ if (isPlainObject(base) && isPlainObject(over)) {
77
+ const out = { ...base };
78
+ for (const [k, v] of Object.entries(over)) {
79
+ if (v === undefined) {
80
+ continue;
81
+ }
82
+ if (isPlainObject(base[k]) && isPlainObject(v)) {
83
+ out[k] = mergeDefined(base[k], v);
84
+ }
85
+ else if (Array.isArray(base[k]) && Array.isArray(v)) {
86
+ out[k] = mergeDefined(base[k], v);
87
+ }
88
+ else {
89
+ out[k] = v;
90
+ }
91
+ }
92
+ return out;
93
+ }
94
+ // Different types → overlay wins if defined
95
+ return over ?? base;
96
+ }
97
+ function isPlainObject(v) {
98
+ return typeof v === "object" && v !== null && Object.getPrototypeOf(v) === Object.prototype;
99
+ }
100
+ const SYSTEM_DEFAULTS = {
101
+ profiles: { rootDir: '.kb/profiles', defaultName: 'default', strict: true }
102
+ };
103
+ /**
104
+ * Generic resolver: defaults → fileConfig → envMapper(process.env) → cliOverrides.
105
+ * No domain keys inside; mapping/validation provided by the product/shared layer.
106
+ */
107
+ export function resolveConfig(args) {
108
+ const diagnostics = [];
109
+ const envPart = args.envMapper?.(process.env) ?? {};
110
+ const merged = mergeDefined(mergeDefined(mergeDefined(mergeDefined(structuredClone(SYSTEM_DEFAULTS), structuredClone(args.defaults)), args.fileConfig), envPart), args.cliOverrides);
111
+ if (args.validate) {
112
+ const res = args.validate(merged);
113
+ if (!res.ok) {
114
+ diagnostics.push({ level: "error", code: "CONFIG_VALIDATION_FAILED", message: "Configuration did not pass validation." });
115
+ if (res.diagnostics) {
116
+ diagnostics.push(...res.diagnostics);
117
+ }
118
+ }
119
+ else if (res.diagnostics?.length) {
120
+ diagnostics.push(...res.diagnostics);
121
+ }
122
+ }
123
+ return { value: merged, diagnostics };
124
+ }
125
+ export { SYSTEM_DEFAULTS };
126
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/runtime/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"root":["../../../kb-labs-sdk/tsup.config.ts","../../../kb-labs-sdk/vitest.config.ts","../../../kb-labs-sdk/packages/sdk/tsup.config.ts","../../../kb-labs-sdk/packages/sdk/dist/index.d.ts","../../../kb-labs-sdk/packages/sdk/dist/testing/index.d.ts","../../../kb-labs-sdk/packages/sdk/src/index.ts","../../../kb-labs-sdk/packages/sdk/src/__tests__/exports.snapshot.test.ts","../../../kb-labs-sdk/packages/sdk/src/command/index.ts","../../../kb-labs-sdk/packages/sdk/src/manifest/index.ts","../../../kb-labs-sdk/packages/sdk/src/test/create-test-context.ts","../../../kb-labs-sdk/packages/sdk/src/test/index.ts","../../../kb-labs-sdk/packages/sdk/src/testing/index.ts","../../../kb-labs-sdk/packages/sdk/src/utils/index.ts","../../../kb-labs-sdk/eslint.config.js","../../../kb-labs-sdk/packages/sdk/eslint.config.js","../../../kb-labs-sdk/packages/sdk/dist/index.js","../../../kb-labs-sdk/packages/sdk/dist/testing/index.js","../../../kb-labs-sdk/packages/sdk/tsup.config.bundled_x0ijv4r35mr.mjs","../../../kb-labs-sdk/scripts/devkit-sync.mjs"],"errors":true,"version":"5.9.3"}
@@ -0,0 +1 @@
1
+ {"fileNames":[],"fileInfos":[],"root":[],"options":{"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":99,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"outDir":"./","skipLibCheck":true,"sourceMap":true,"strict":true,"target":9},"errors":true,"version":"5.9.3"}
@@ -0,0 +1,2 @@
1
+ export * from "./types";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/sys/src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from "./types";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/sys/src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @module @kb-labs/core/config/types/init
3
+ * Types for init operations
4
+ */
5
+ import type { ProductId } from './types';
6
+ export interface InitWorkspaceOptions {
7
+ cwd: string;
8
+ format?: 'yaml' | 'json';
9
+ presetRef?: string | null;
10
+ profiles?: Record<string, string>;
11
+ products?: ProductId[];
12
+ dryRun?: boolean;
13
+ force?: boolean;
14
+ }
15
+ export interface InitAction {
16
+ kind: 'write' | 'append' | 'update' | 'skip' | 'conflict';
17
+ path: string;
18
+ previewDiff?: string;
19
+ }
20
+ export interface InitResult {
21
+ actions: InitAction[];
22
+ created: string[];
23
+ updated: string[];
24
+ skipped: string[];
25
+ warnings: string[];
26
+ }
27
+ export interface UpsertLockfileOptions {
28
+ cwd: string;
29
+ presetRef?: string | null;
30
+ profileRef?: string | null;
31
+ policyBundle?: string | null;
32
+ dryRun?: boolean;
33
+ }
34
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/types/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @module @kb-labs/core/config/types/init
3
+ * Types for init operations
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/types/init.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @module @kb-labs/core/config/types/preset
3
+ * Preset-related types
4
+ */
5
+ export interface PresetConfig {
6
+ products: Record<string, any>;
7
+ metadata?: {
8
+ name: string;
9
+ version: string;
10
+ description?: string;
11
+ };
12
+ }
13
+ export interface PresetResolutionOptions {
14
+ cwd: string;
15
+ presetRef: string;
16
+ offline?: boolean;
17
+ }
18
+ export interface PresetResolutionResult {
19
+ preset: {
20
+ name: string;
21
+ version: string;
22
+ path: string;
23
+ config: PresetConfig;
24
+ };
25
+ resolvedAt: string;
26
+ }
27
+ //# sourceMappingURL=preset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/types/preset.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,YAAY,CAAC;KACtB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @module @kb-labs/core/config/types/preset
3
+ * Preset-related types
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/types/preset.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,6 @@
1
+ export interface FindNearestConfigOpts {
2
+ startDir?: string;
3
+ stopDir?: string;
4
+ filenames: string[];
5
+ }
6
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/sys/src/types/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/sys/src/types/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=env.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.spec.d.ts","sourceRoot":"","sources":["../../../../../kb-labs-core/packages/config/src/utils/__tests__/env.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { toBool, toInt } from '../env';
3
+ describe('toBool', () => {
4
+ it('parses truthy values', () => {
5
+ for (const v of ['1', 'true', 'yes', 'on', ' TRUE ', 'Yes']) {
6
+ expect(toBool(v)).toBe(true);
7
+ }
8
+ });
9
+ it('parses falsy values', () => {
10
+ for (const v of ['0', 'false', 'no', 'off', ' False ']) {
11
+ expect(toBool(v)).toBe(false);
12
+ }
13
+ });
14
+ it('returns undefined for unknown or undefined', () => {
15
+ expect(toBool('maybe')).toBeUndefined();
16
+ expect(toBool(undefined)).toBeUndefined();
17
+ expect(toBool('')).toBeUndefined();
18
+ });
19
+ });
20
+ describe('toInt', () => {
21
+ it('parses valid integers', () => {
22
+ expect(toInt('0')).toBe(0);
23
+ expect(toInt('42')).toBe(42);
24
+ expect(toInt(' 7 ')).toBe(7);
25
+ });
26
+ it('returns undefined for invalid numbers or undefined', () => {
27
+ expect(toInt('abc')).toBeUndefined();
28
+ expect(toInt('NaN')).toBeUndefined();
29
+ expect(toInt(undefined)).toBeUndefined();
30
+ expect(toInt('')).toBe(0); // Number('') === 0 → considered valid
31
+ });
32
+ });
33
+ //# sourceMappingURL=env.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.spec.js","sourceRoot":"","sources":["../../../../../kb-labs-core/packages/config/src/utils/__tests__/env.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEtC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,EAAC,MAAM,EAAC,KAAK,EAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,SAAS,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;QACvC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;QACzC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC5B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;QACpC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;QACpC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;QACxC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,CAAC,sCAAsC;IAClE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @module @kb-labs/core/utils/env
3
+ * Small helpers to convert ENV strings to typed values.
4
+ */
5
+ export declare function toBool(v: string | undefined): boolean | undefined;
6
+ export declare function toInt(v: string | undefined): number | undefined;
7
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/utils/env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAMjE;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI/D"}