@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,192 @@
1
+ /**
2
+ * @module @kb-labs/core/config/api/product-config
3
+ * High-level product configuration resolver with layered merge
4
+ */
5
+ import { promises as fsp } from 'node:fs';
6
+ import path from 'node:path';
7
+ import { readWorkspaceConfig } from './read-config';
8
+ import { layeredMergeWithTrace } from '../merge/layered-merge';
9
+ import { toFsProduct } from '../utils/product-normalize';
10
+ import { computeConfigHash } from '../hash/config-hash';
11
+ import { resolvePreset, getPresetConfigForProduct } from '../preset/resolve-preset';
12
+ import { updateLockfile } from '../lockfile/lockfile';
13
+ import { getProductDefaults } from '@kb-labs/core-profiles';
14
+ /**
15
+ * Get product configuration with layered merge and trace
16
+ */
17
+ export async function getProductConfig(opts, schema, profileInfo) {
18
+ const { cwd, product, cli = {}, writeFinal = false } = opts;
19
+ const fsProduct = toFsProduct(product);
20
+ // Read workspace configuration
21
+ const workspaceConfig = await readWorkspaceConfig(cwd);
22
+ // Build configuration layers
23
+ const layers = [];
24
+ // 1. Runtime defaults
25
+ layers.push({
26
+ label: 'runtime',
27
+ value: getRuntimeDefaults(product),
28
+ source: 'runtime:defaults',
29
+ });
30
+ // 2. Profile defaults
31
+ let profileDefaults = {};
32
+ if (profileInfo) {
33
+ try {
34
+ profileDefaults = await getProductDefaults(profileInfo, toFsProduct(product), schema);
35
+ }
36
+ catch (error) {
37
+ // Profile defaults failed, continue without them
38
+ console.warn('Warning: Could not load profile defaults:', error);
39
+ }
40
+ }
41
+ layers.push({
42
+ label: 'profile',
43
+ value: profileDefaults,
44
+ source: profileInfo
45
+ ? `profile:${profileInfo.name}@${profileInfo.version}`
46
+ : 'profile:none',
47
+ });
48
+ // 3. Preset defaults (resolve org preset if configured)
49
+ let presetConfig = {};
50
+ if (workspaceConfig?.data) {
51
+ const workspaceData = workspaceConfig.data;
52
+ if (workspaceData.$extends) {
53
+ try {
54
+ const preset = await resolvePreset(workspaceData.$extends, cwd);
55
+ presetConfig = getPresetConfigForProduct(preset, product);
56
+ layers.push({
57
+ label: 'preset',
58
+ value: presetConfig,
59
+ source: `preset:${workspaceData.$extends}`,
60
+ });
61
+ }
62
+ catch (error) {
63
+ // Preset resolution failed, continue without preset
64
+ console.warn(`Warning: Could not resolve preset ${workspaceData.$extends}:`, error);
65
+ }
66
+ }
67
+ }
68
+ if (Object.keys(presetConfig).length === 0) {
69
+ layers.push({
70
+ label: 'preset',
71
+ value: {},
72
+ source: 'preset:none',
73
+ });
74
+ }
75
+ // 4. Workspace config
76
+ if (workspaceConfig?.data) {
77
+ const workspaceData = workspaceConfig.data?.products?.[fsProduct] || {};
78
+ layers.push({
79
+ label: 'workspace',
80
+ value: workspaceData,
81
+ source: 'workspace:kb-labs.config',
82
+ });
83
+ }
84
+ // 5. Local config (.kb/<product>/<product>.config.json)
85
+ const localConfigPath = path.join(cwd, '.kb', fsProduct, `${fsProduct}.config.json`);
86
+ try {
87
+ const localConfig = await fsp.readFile(localConfigPath, 'utf-8');
88
+ const localData = JSON.parse(localConfig);
89
+ layers.push({
90
+ label: 'local',
91
+ value: localData,
92
+ source: `local:.kb/${fsProduct}/${fsProduct}.config.json`,
93
+ });
94
+ }
95
+ catch {
96
+ // Local config is optional
97
+ }
98
+ // 6. CLI overrides
99
+ if (Object.keys(cli).length > 0) {
100
+ layers.push({
101
+ label: 'cli',
102
+ value: cli,
103
+ source: 'cli:overrides',
104
+ });
105
+ }
106
+ // Merge all layers
107
+ const { merged, trace } = layeredMergeWithTrace(layers);
108
+ // Validate against schema if provided
109
+ if (schema) {
110
+ // Schema validation will be implemented with AJV
111
+ // For now, we'll skip validation
112
+ }
113
+ // Write final config if requested
114
+ if (writeFinal) {
115
+ await writeFinalConfig(cwd, fsProduct, merged);
116
+ }
117
+ // Update lockfile with config hash
118
+ try {
119
+ const configHash = computeConfigHash(merged);
120
+ const configHashes = {};
121
+ configHashes[product] = configHash;
122
+ await updateLockfile(cwd, {
123
+ configHashes
124
+ });
125
+ }
126
+ catch (error) {
127
+ // Lockfile update is optional, don't fail the config resolution
128
+ console.warn('Warning: Could not update lockfile:', error);
129
+ }
130
+ return {
131
+ config: merged,
132
+ trace,
133
+ };
134
+ }
135
+ /**
136
+ * Explain product configuration (trace only)
137
+ */
138
+ export async function explainProductConfig(opts, schema, profileInfo) {
139
+ const result = await getProductConfig(opts, schema, profileInfo);
140
+ return { trace: result.trace };
141
+ }
142
+ /**
143
+ * Get runtime defaults for a product
144
+ */
145
+ function getRuntimeDefaults(product) {
146
+ const defaults = {
147
+ devlink: {
148
+ watch: true,
149
+ build: true,
150
+ },
151
+ release: {
152
+ version: '1.0.0',
153
+ publish: false,
154
+ },
155
+ aiReview: {
156
+ enabled: true,
157
+ rules: [],
158
+ },
159
+ aiDocs: {
160
+ enabled: true,
161
+ templates: [],
162
+ },
163
+ devkit: {
164
+ sync: true,
165
+ check: true,
166
+ },
167
+ };
168
+ return defaults[product] || {};
169
+ }
170
+ /**
171
+ * Write final configuration to .kb/<product>/<product>.config.json
172
+ */
173
+ async function writeFinalConfig(cwd, fsProduct, config) {
174
+ const configDir = path.join(cwd, '.kb', fsProduct);
175
+ const configPath = path.join(configDir, `${fsProduct}.config.json`);
176
+ // Ensure directory exists
177
+ await fsp.mkdir(configDir, { recursive: true });
178
+ // Write config with schema version
179
+ const finalConfig = {
180
+ $schema: 'https://schemas.kb-labs.dev/config.schema.json',
181
+ schemaVersion: '1.0',
182
+ ...config,
183
+ };
184
+ await fsp.writeFile(configPath, JSON.stringify(finalConfig, null, 2));
185
+ }
186
+ /**
187
+ * Get configuration hash for lockfile
188
+ */
189
+ export function getConfigHash(config) {
190
+ return computeConfigHash(config);
191
+ }
192
+ //# sourceMappingURL=product-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-config.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/api/product-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @module @kb-labs/core/config/api/read-config
3
+ * Enhanced config file reading with YAML support and find-up
4
+ */
5
+ export interface ConfigFileResult {
6
+ data: unknown;
7
+ format: 'json' | 'yaml';
8
+ path: string;
9
+ }
10
+ /**
11
+ * Read config file with format detection and caching
12
+ */
13
+ export declare function readConfigFile(filePath: string): Promise<ConfigFileResult>;
14
+ /**
15
+ * Find git root directory
16
+ */
17
+ export declare function findGitRoot(startDir: string): Promise<string | null>;
18
+ /**
19
+ * Read workspace config with find-up to git root
20
+ */
21
+ export declare function readWorkspaceConfig(cwd: string): Promise<ConfigFileResult | null>;
22
+ //# sourceMappingURL=read-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-config.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/api/read-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+ChF;AAqCD;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiB1E;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CASvF"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * @module @kb-labs/core/config/api/read-config
3
+ * Enhanced config file reading with YAML support and find-up
4
+ */
5
+ import { promises as fsp } from 'node:fs';
6
+ import path from 'node:path';
7
+ import { extname } from 'node:path';
8
+ import YAML from 'yaml';
9
+ import { KbError, ERROR_HINTS } from '../errors/kb-error';
10
+ import { fsCache } from '../cache/fs-cache';
11
+ /**
12
+ * Read config file with format detection and caching
13
+ */
14
+ export async function readConfigFile(filePath) {
15
+ const absPath = path.resolve(filePath);
16
+ // Check cache first
17
+ const cached = await fsCache.get(absPath);
18
+ if (cached !== null) {
19
+ return cached;
20
+ }
21
+ try {
22
+ const raw = await fsp.readFile(absPath, 'utf-8');
23
+ const ext = extname(absPath).toLowerCase();
24
+ let data;
25
+ let format;
26
+ if (ext === '.yaml' || ext === '.yml') {
27
+ data = YAML.parse(raw);
28
+ format = 'yaml';
29
+ }
30
+ else {
31
+ data = JSON.parse(raw);
32
+ format = 'json';
33
+ }
34
+ const result = { data, format, path: absPath };
35
+ // Cache the result
36
+ await fsCache.set(absPath, result);
37
+ return result;
38
+ }
39
+ catch (error) {
40
+ if (error instanceof SyntaxError) {
41
+ throw new KbError('ERR_CONFIG_INVALID', `Failed to parse config file: ${filePath}`, ERROR_HINTS.ERR_CONFIG_INVALID, { filePath, error: error.message });
42
+ }
43
+ throw new KbError('ERR_CONFIG_NOT_FOUND', `Config file not found: ${filePath}`, ERROR_HINTS.ERR_CONFIG_NOT_FOUND, { filePath, error: error instanceof Error ? error.message : String(error) });
44
+ }
45
+ }
46
+ /**
47
+ * Find nearest config file walking up from startDir to git root
48
+ */
49
+ async function findNearestConfig(startDir, filenames = ['kb-labs.config.json', 'kb-labs.config.yaml', 'kb-labs.config.yml']) {
50
+ const start = path.resolve(startDir);
51
+ const tried = [];
52
+ let dir = start;
53
+ while (true) {
54
+ for (const filename of filenames) {
55
+ const candidate = path.join(dir, filename);
56
+ tried.push(candidate);
57
+ try {
58
+ await fsp.access(candidate);
59
+ return { path: candidate, tried };
60
+ }
61
+ catch {
62
+ // Continue to next filename
63
+ }
64
+ }
65
+ const parent = path.dirname(dir);
66
+ if (parent === dir) {
67
+ // Reached filesystem root
68
+ break;
69
+ }
70
+ dir = parent;
71
+ }
72
+ return { path: null, tried };
73
+ }
74
+ /**
75
+ * Find git root directory
76
+ */
77
+ export async function findGitRoot(startDir) {
78
+ let dir = path.resolve(startDir);
79
+ while (true) {
80
+ try {
81
+ await fsp.access(path.join(dir, '.git'));
82
+ return dir;
83
+ }
84
+ catch {
85
+ const parent = path.dirname(dir);
86
+ if (parent === dir) {
87
+ break;
88
+ }
89
+ dir = parent;
90
+ }
91
+ }
92
+ return null;
93
+ }
94
+ /**
95
+ * Read workspace config with find-up to git root
96
+ */
97
+ export async function readWorkspaceConfig(cwd) {
98
+ const filenames = ['kb-labs.config.json', 'kb-labs.config.yaml', 'kb-labs.config.yml'];
99
+ const { path: configPath } = await findNearestConfig(cwd, filenames);
100
+ if (!configPath) {
101
+ return null;
102
+ }
103
+ return readConfigFile(configPath);
104
+ }
105
+ //# sourceMappingURL=read-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-config.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/api/read-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @module @kb-labs/core/config/api/upsert-lockfile
3
+ * Upsert lockfile operations
4
+ */
5
+ import type { UpsertLockfileOptions, InitResult } from '../types/init';
6
+ /**
7
+ * Upsert lockfile with new references
8
+ */
9
+ export declare function upsertLockfile(opts: UpsertLockfileOptions): Promise<InitResult>;
10
+ //# sourceMappingURL=upsert-lockfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upsert-lockfile.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/api/upsert-lockfile.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEvE;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,UAAU,CAAC,CAyDrB"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @module @kb-labs/core/config/api/upsert-lockfile
3
+ * Upsert lockfile operations
4
+ */
5
+ import path from 'node:path';
6
+ import { promises as fs } from 'node:fs';
7
+ import { readLockfile, writeLockfile } from '../lockfile/lockfile';
8
+ import { ensureWithinWorkspace } from '../utils/fs-atomic';
9
+ /**
10
+ * Upsert lockfile with new references
11
+ */
12
+ export async function upsertLockfile(opts) {
13
+ const cwd = path.resolve(opts.cwd);
14
+ const lockfilePath = path.join(cwd, '.kb', 'lock.json');
15
+ const oldLockfilePath = path.join(cwd, '.kb', 'lockfile.json');
16
+ const result = {
17
+ actions: [],
18
+ created: [],
19
+ updated: [],
20
+ skipped: [],
21
+ warnings: [],
22
+ };
23
+ // Ensure we're writing within workspace
24
+ ensureWithinWorkspace(lockfilePath, cwd);
25
+ // Check for deprecated lockfile location
26
+ try {
27
+ await fs.access(oldLockfilePath);
28
+ result.warnings.push('Deprecated lockfile found at .kb/lockfile.json, please migrate to .kb/lock.json');
29
+ }
30
+ catch {
31
+ // No old lockfile, that's fine
32
+ }
33
+ // Read existing lockfile
34
+ const existing = await readLockfile(cwd);
35
+ // Build lockfile data
36
+ const lockfileData = {
37
+ $schema: 'https://schemas.kb-labs.dev/lockfile.schema.json',
38
+ schemaVersion: '1.0',
39
+ orgPreset: opts.presetRef !== undefined ? opts.presetRef || undefined : existing?.orgPreset,
40
+ profile: opts.profileRef !== undefined ? opts.profileRef || undefined : existing?.profile,
41
+ policyBundle: opts.policyBundle !== undefined ? opts.policyBundle || undefined : existing?.policyBundle,
42
+ hashes: existing?.hashes || {},
43
+ generatedAt: new Date().toISOString(),
44
+ };
45
+ if (!existing) {
46
+ // Creating new lockfile
47
+ if (!opts.dryRun) {
48
+ await writeLockfile(cwd, lockfileData);
49
+ }
50
+ result.actions.push({ kind: 'write', path: lockfilePath });
51
+ result.created.push(lockfilePath);
52
+ }
53
+ else {
54
+ // Updating existing lockfile
55
+ if (!opts.dryRun) {
56
+ await writeLockfile(cwd, lockfileData);
57
+ }
58
+ result.actions.push({ kind: 'update', path: lockfilePath });
59
+ result.updated.push(lockfilePath);
60
+ }
61
+ return result;
62
+ }
63
+ //# sourceMappingURL=upsert-lockfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upsert-lockfile.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/api/upsert-lockfile.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAqB,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAG3D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAA2B;IAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IAE/D,MAAM,MAAM,GAAe;QACzB,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;KACb,CAAC;IAEF,wCAAwC;IACxC,qBAAqB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAEzC,yCAAyC;IACzC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAClB,iFAAiF,CAClF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IAED,yBAAyB;IACzB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IAEzC,sBAAsB;IACtB,MAAM,YAAY,GAAiB;QACjC,OAAO,EAAE,kDAAkD;QAC3D,aAAa,EAAE,KAAK;QACpB,SAAS,EAAE,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS;QAC3F,OAAO,EAAE,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO;QACzF,YAAY,EAAE,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,YAAY;QACvG,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,EAAE;QAC9B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC;IAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,wBAAwB;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,aAAa,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,6BAA6B;QAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,aAAa,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @module @kb-labs/core/config/cache/fs-cache
3
+ * LRU cache for filesystem reads with clearCaches() support
4
+ */
5
+ declare class FSCache {
6
+ private cache;
7
+ private keyCache;
8
+ /**
9
+ * Generate cache key from file path, mtime, and size
10
+ */
11
+ private getCacheKey;
12
+ /**
13
+ * Get cached file data if available and not stale
14
+ */
15
+ get(absPath: string): Promise<any | null>;
16
+ /**
17
+ * Cache file data
18
+ */
19
+ set(absPath: string, data: any): Promise<void>;
20
+ /**
21
+ * Clear all caches
22
+ */
23
+ clearCaches(): void;
24
+ /**
25
+ * Get cache statistics
26
+ */
27
+ getStats(): {
28
+ size: number;
29
+ keySize: number;
30
+ };
31
+ }
32
+ declare const fsCache: FSCache;
33
+ export { fsCache, FSCache };
34
+ /**
35
+ * Clear all filesystem caches
36
+ */
37
+ export declare function clearCaches(): void;
38
+ //# sourceMappingURL=fs-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-cache.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/cache/fs-cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8DH,cAAM,OAAO;IACX,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,QAAQ,CAAuC;IAEvD;;OAEG;YACW,WAAW;IAsBzB;;OAEG;IACG,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAiC/C;;OAEG;IACG,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpD;;OAEG;IACH,WAAW,IAAI,IAAI;IAKnB;;OAEG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;CAM9C;AAGD,QAAA,MAAM,OAAO,SAAgB,CAAC;AAE9B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAE5B;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * @module @kb-labs/core/config/cache/fs-cache
3
+ * LRU cache for filesystem reads with clearCaches() support
4
+ */
5
+ import { promises as fsp } from 'node:fs';
6
+ class LRUCache {
7
+ cache = new Map();
8
+ maxSize;
9
+ constructor(maxSize = 100) {
10
+ this.maxSize = maxSize;
11
+ }
12
+ get(key) {
13
+ const value = this.cache.get(key);
14
+ if (value !== undefined) {
15
+ // Move to end (most recently used)
16
+ this.cache.delete(key);
17
+ this.cache.set(key, value);
18
+ }
19
+ return value;
20
+ }
21
+ set(key, value) {
22
+ if (this.cache.has(key)) {
23
+ this.cache.delete(key);
24
+ }
25
+ else if (this.cache.size >= this.maxSize) {
26
+ // Remove least recently used (first item)
27
+ const firstKey = this.cache.keys().next().value;
28
+ if (firstKey !== undefined) {
29
+ this.cache.delete(firstKey);
30
+ }
31
+ }
32
+ this.cache.set(key, value);
33
+ }
34
+ delete(key) {
35
+ return this.cache.delete(key);
36
+ }
37
+ clear() {
38
+ this.cache.clear();
39
+ }
40
+ size() {
41
+ return this.cache.size;
42
+ }
43
+ }
44
+ class FSCache {
45
+ cache = new LRUCache(100);
46
+ keyCache = new LRUCache(100);
47
+ /**
48
+ * Generate cache key from file path, mtime, and size
49
+ */
50
+ async getCacheKey(absPath) {
51
+ const keyStr = `key:${absPath}`;
52
+ let key = this.keyCache.get(keyStr);
53
+ if (!key) {
54
+ try {
55
+ const stats = await fsp.stat(absPath);
56
+ key = {
57
+ absPath,
58
+ mtime: stats.mtime.getTime(),
59
+ size: stats.size,
60
+ };
61
+ this.keyCache.set(keyStr, key);
62
+ }
63
+ catch {
64
+ // File doesn't exist or can't be read
65
+ return { absPath, mtime: 0, size: 0 };
66
+ }
67
+ }
68
+ return key;
69
+ }
70
+ /**
71
+ * Get cached file data if available and not stale
72
+ */
73
+ async get(absPath) {
74
+ const key = await this.getCacheKey(absPath);
75
+ const cacheKey = `${key.absPath}|${key.mtime}|${key.size}`;
76
+ const entry = this.cache.get(cacheKey);
77
+ if (!entry) {
78
+ return null;
79
+ }
80
+ // Check if file has been modified since cache
81
+ try {
82
+ const stats = await fsp.stat(absPath);
83
+ if (stats.mtime.getTime() !== key.mtime || stats.size !== key.size) {
84
+ // File changed, remove from cache and update key cache
85
+ this.cache.delete(cacheKey);
86
+ // Update the key cache with new stats
87
+ const newKey = {
88
+ absPath,
89
+ mtime: stats.mtime.getTime(),
90
+ size: stats.size,
91
+ };
92
+ this.keyCache.set(`key:${absPath}`, newKey);
93
+ return null;
94
+ }
95
+ }
96
+ catch {
97
+ // File no longer exists
98
+ this.cache.delete(cacheKey);
99
+ return null;
100
+ }
101
+ return entry.data;
102
+ }
103
+ /**
104
+ * Cache file data
105
+ */
106
+ async set(absPath, data) {
107
+ const key = await this.getCacheKey(absPath);
108
+ const cacheKey = `${key.absPath}|${key.mtime}|${key.size}`;
109
+ this.cache.set(cacheKey, {
110
+ data,
111
+ mtime: key.mtime,
112
+ size: key.size,
113
+ timestamp: Date.now(),
114
+ });
115
+ }
116
+ /**
117
+ * Clear all caches
118
+ */
119
+ clearCaches() {
120
+ this.cache.clear();
121
+ this.keyCache.clear();
122
+ }
123
+ /**
124
+ * Get cache statistics
125
+ */
126
+ getStats() {
127
+ return {
128
+ size: this.cache.size(),
129
+ keySize: this.keyCache.size(),
130
+ };
131
+ }
132
+ }
133
+ // Singleton instance
134
+ const fsCache = new FSCache();
135
+ export { fsCache, FSCache };
136
+ /**
137
+ * Clear all filesystem caches
138
+ */
139
+ export function clearCaches() {
140
+ fsCache.clearCaches();
141
+ }
142
+ //# sourceMappingURL=fs-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-cache.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/cache/fs-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @module @kb-labs/core/config/errors
3
+ * Standardized error class for KB Labs with exit code mapping
4
+ */
5
+ export declare class KbError extends Error {
6
+ code: string;
7
+ hint?: string | undefined;
8
+ meta?: any | undefined;
9
+ constructor(code: string, message: string, hint?: string | undefined, meta?: any | undefined);
10
+ }
11
+ /**
12
+ * Maps KbError codes to CLI exit codes
13
+ */
14
+ export declare function getExitCode(err: KbError): number;
15
+ /**
16
+ * Error codes with their standard hints
17
+ */
18
+ export declare const ERROR_HINTS: {
19
+ readonly ERR_CONFIG_NOT_FOUND: "Create kb-labs.config.yaml or run: kb init";
20
+ readonly ERR_CONFIG_INVALID: "Check configuration syntax and required fields";
21
+ readonly ERR_CONFIG_EXISTS_CONFLICT: "Use --force to overwrite existing configuration";
22
+ readonly ERR_PATH_OUTSIDE_WORKSPACE: "Check cwd or use a relative path within the workspace";
23
+ readonly ERR_PRESET_NOT_RESOLVED: "Install the required preset package or check network connectivity";
24
+ readonly ERR_PROFILE_INCOMPATIBLE: "Profile version is incompatible with current system";
25
+ readonly ERR_PROFILE_NOT_DEFINED: "Add profiles.default to kb-labs.config.yaml";
26
+ readonly ERR_PROFILE_RESOLVE_FAILED: "pnpm add -D @kb-labs/profile-...";
27
+ readonly ERR_PROFILE_INVALID_FORMAT: "Recreate profile with: kb init profile --scaffold-local-profile";
28
+ readonly ERR_ARTIFACT_LIMIT_EXCEEDED: "Remove or split large artifacts, or reduce artifact count";
29
+ readonly ERR_FORBIDDEN: "Add role in policy.overrides or use preset...";
30
+ };
31
+ export type ErrorCode = keyof typeof ERROR_HINTS;
32
+ //# sourceMappingURL=kb-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kb-error.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/errors/kb-error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,OAAQ,SAAQ,KAAK;IAEvB,IAAI,EAAE,MAAM;IAEZ,IAAI,CAAC,EAAE,MAAM;IACb,IAAI,CAAC,EAAE,GAAG;gBAHV,IAAI,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACR,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,IAAI,CAAC,EAAE,GAAG,YAAA;CAKpB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAOhD;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;CAYd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,WAAW,CAAC"}