@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,6 @@
1
+ /**
2
+ * @module @kb-labs/core/config/__tests__/product-config.spec.ts
3
+ * Tests for product configuration system
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=product-config.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-config.spec.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/__tests__/product-config.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,298 @@
1
+ /**
2
+ * @module @kb-labs/core/config/__tests__/product-config.spec.ts
3
+ * Tests for product configuration system
4
+ */
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import { promises as fsp } from 'node:fs';
7
+ import path from 'node:path';
8
+ import { tmpdir } from 'node:os';
9
+ import { getProductConfig, explainProductConfig } from '../api/product-config';
10
+ import { clearCaches } from '../cache/fs-cache';
11
+ import { toFsProduct, toConfigProduct } from '../utils/product-normalize';
12
+ import { KbError } from '../errors/kb-error';
13
+ describe('Product Configuration', () => {
14
+ let testDir;
15
+ beforeEach(async () => {
16
+ testDir = path.join(tmpdir(), `kb-labs-config-test-${Date.now()}`);
17
+ await fsp.mkdir(testDir, { recursive: true });
18
+ clearCaches();
19
+ });
20
+ afterEach(async () => {
21
+ await fsp.rm(testDir, { recursive: true, force: true });
22
+ clearCaches();
23
+ });
24
+ describe('Product Normalization', () => {
25
+ it('should convert ProductId to filesystem format', () => {
26
+ expect(toFsProduct('aiReview')).toBe('ai-review');
27
+ expect(toFsProduct('aiDocs')).toBe('ai-docs');
28
+ expect(toFsProduct('devlink')).toBe('devlink');
29
+ expect(toFsProduct('release')).toBe('release');
30
+ expect(toFsProduct('devkit')).toBe('devkit');
31
+ });
32
+ it('should convert filesystem format to ProductId', () => {
33
+ expect(toConfigProduct('ai-review')).toBe('aiReview');
34
+ expect(toConfigProduct('ai-docs')).toBe('aiDocs');
35
+ expect(toConfigProduct('devlink')).toBe('devlink');
36
+ expect(toConfigProduct('release')).toBe('release');
37
+ expect(toConfigProduct('devkit')).toBe('devkit');
38
+ });
39
+ });
40
+ describe('getProductConfig', () => {
41
+ it('should return runtime defaults when no config files exist', async () => {
42
+ const result = await getProductConfig({
43
+ cwd: testDir,
44
+ product: 'aiReview',
45
+ }, null);
46
+ expect(result.config).toMatchObject({
47
+ enabled: true,
48
+ rules: [],
49
+ });
50
+ expect(result.trace.length).toBeGreaterThan(0);
51
+ expect(result.trace[0]?.layer).toBe('runtime');
52
+ });
53
+ it('should merge workspace config', async () => {
54
+ // Create workspace config
55
+ const workspaceConfig = {
56
+ schemaVersion: '1.0',
57
+ products: {
58
+ 'ai-review': {
59
+ enabled: false,
60
+ customSetting: 'test',
61
+ },
62
+ },
63
+ };
64
+ await fsp.writeFile(path.join(testDir, 'kb-labs.config.json'), JSON.stringify(workspaceConfig, null, 2));
65
+ const result = await getProductConfig({
66
+ cwd: testDir,
67
+ product: 'aiReview',
68
+ }, null);
69
+ expect(result.config).toMatchObject({
70
+ enabled: false,
71
+ customSetting: 'test',
72
+ });
73
+ expect(result.trace.length).toBeGreaterThan(1);
74
+ expect(result.trace.some(t => t.layer === 'workspace')).toBe(true);
75
+ });
76
+ it('should merge local config', async () => {
77
+ // Create local config directory
78
+ const localConfigDir = path.join(testDir, '.kb', 'ai-review');
79
+ await fsp.mkdir(localConfigDir, { recursive: true });
80
+ const localConfig = {
81
+ $schema: 'https://schemas.kb-labs.dev/config.schema.json',
82
+ schemaVersion: '1.0',
83
+ enabled: false,
84
+ localSetting: 'local-value',
85
+ };
86
+ await fsp.writeFile(path.join(localConfigDir, 'ai-review.config.json'), JSON.stringify(localConfig, null, 2));
87
+ const result = await getProductConfig({
88
+ cwd: testDir,
89
+ product: 'aiReview',
90
+ }, null);
91
+ expect(result.config).toMatchObject({
92
+ enabled: false,
93
+ localSetting: 'local-value',
94
+ });
95
+ expect(result.trace.length).toBeGreaterThan(1);
96
+ expect(result.trace.some(t => t.layer === 'local')).toBe(true);
97
+ });
98
+ it('should merge CLI overrides', async () => {
99
+ const result = await getProductConfig({
100
+ cwd: testDir,
101
+ product: 'aiReview',
102
+ cli: {
103
+ enabled: false,
104
+ debug: true,
105
+ },
106
+ }, null);
107
+ expect(result.config).toMatchObject({
108
+ enabled: false,
109
+ debug: true,
110
+ });
111
+ expect(result.trace.length).toBeGreaterThan(1);
112
+ expect(result.trace.some(t => t.layer === 'cli')).toBe(true);
113
+ });
114
+ it('should handle array overwrite', async () => {
115
+ // Create workspace config with array
116
+ const workspaceConfig = {
117
+ schemaVersion: '1.0',
118
+ products: {
119
+ 'ai-review': {
120
+ rules: ['workspace-rule'],
121
+ },
122
+ },
123
+ };
124
+ await fsp.writeFile(path.join(testDir, 'kb-labs.config.json'), JSON.stringify(workspaceConfig, null, 2));
125
+ const result = await getProductConfig({
126
+ cwd: testDir,
127
+ product: 'aiReview',
128
+ cli: {
129
+ rules: ['cli-rule'],
130
+ },
131
+ }, null);
132
+ expect(result.config.rules).toEqual(['cli-rule']);
133
+ expect(result.trace.length).toBeGreaterThan(2);
134
+ expect(result.trace.some(t => t.type === 'overwriteArray')).toBe(true);
135
+ });
136
+ });
137
+ describe('explainProductConfig', () => {
138
+ it('should return trace without resolving config', async () => {
139
+ const result = await explainProductConfig({
140
+ cwd: testDir,
141
+ product: 'aiReview',
142
+ }, null);
143
+ expect(result.trace.length).toBeGreaterThan(0);
144
+ expect(result.trace[0].layer).toBe('runtime');
145
+ });
146
+ });
147
+ describe('Error Handling', () => {
148
+ it('should throw KbError for invalid config', async () => {
149
+ // Create invalid JSON config
150
+ await fsp.writeFile(path.join(testDir, 'kb-labs.config.json'), '{ invalid json }');
151
+ await expect(getProductConfig({
152
+ cwd: testDir,
153
+ product: 'aiReview',
154
+ }, null)).rejects.toThrow(KbError);
155
+ });
156
+ it('should handle preset resolution failures', async () => {
157
+ // Create config with invalid preset
158
+ const workspaceConfig = {
159
+ schemaVersion: '1.0',
160
+ preset: 'nonexistent/preset',
161
+ products: {
162
+ 'ai-review': {
163
+ enabled: true,
164
+ },
165
+ },
166
+ };
167
+ await fsp.writeFile(path.join(testDir, 'kb-labs.config.json'), JSON.stringify(workspaceConfig, null, 2));
168
+ // The function should handle invalid presets gracefully and fall back to defaults
169
+ const result = await getProductConfig({
170
+ cwd: testDir,
171
+ product: 'aiReview',
172
+ }, null);
173
+ expect(result.config).toMatchObject({
174
+ enabled: true,
175
+ rules: [],
176
+ });
177
+ });
178
+ it('should handle merge conflicts gracefully', async () => {
179
+ // Create conflicting configs
180
+ const workspaceConfig = {
181
+ schemaVersion: '1.0',
182
+ products: {
183
+ 'ai-review': {
184
+ enabled: true,
185
+ rules: ['workspace-rule'],
186
+ },
187
+ },
188
+ };
189
+ await fsp.writeFile(path.join(testDir, 'kb-labs.config.json'), JSON.stringify(workspaceConfig, null, 2));
190
+ const localConfigDir = path.join(testDir, '.kb', 'ai-review');
191
+ await fsp.mkdir(localConfigDir, { recursive: true });
192
+ const localConfig = {
193
+ $schema: 'https://schemas.kb-labs.dev/config.schema.json',
194
+ schemaVersion: '1.0',
195
+ enabled: false,
196
+ rules: ['local-rule'],
197
+ };
198
+ await fsp.writeFile(path.join(localConfigDir, 'ai-review.config.json'), JSON.stringify(localConfig, null, 2));
199
+ const result = await getProductConfig({
200
+ cwd: testDir,
201
+ product: 'aiReview',
202
+ }, null);
203
+ // Local config should override workspace
204
+ expect(result.config).toMatchObject({
205
+ enabled: false,
206
+ rules: ['local-rule'],
207
+ });
208
+ });
209
+ it('should handle missing product in config', async () => {
210
+ // Create config without the product
211
+ const workspaceConfig = {
212
+ schemaVersion: '1.0',
213
+ products: {
214
+ 'other-product': {
215
+ enabled: true,
216
+ },
217
+ },
218
+ };
219
+ await fsp.writeFile(path.join(testDir, 'kb-labs.config.json'), JSON.stringify(workspaceConfig, null, 2));
220
+ const result = await getProductConfig({
221
+ cwd: testDir,
222
+ product: 'aiReview',
223
+ }, null);
224
+ // Should fall back to runtime defaults
225
+ expect(result.config).toMatchObject({
226
+ enabled: true,
227
+ rules: [],
228
+ });
229
+ });
230
+ it('should handle invalid product configuration structure', async () => {
231
+ // Create config with invalid product structure
232
+ const workspaceConfig = {
233
+ schemaVersion: '1.0',
234
+ products: {
235
+ 'ai-review': 'invalid-string-instead-of-object',
236
+ },
237
+ };
238
+ await fsp.writeFile(path.join(testDir, 'kb-labs.config.json'), JSON.stringify(workspaceConfig, null, 2));
239
+ // The function should handle invalid structures gracefully
240
+ const result = await getProductConfig({
241
+ cwd: testDir,
242
+ product: 'aiReview',
243
+ }, null);
244
+ // Should handle invalid structure gracefully
245
+ expect(result.config).toBe('invalid-string-instead-of-object');
246
+ });
247
+ it('should handle circular references in config', async () => {
248
+ // Create config that might cause circular references
249
+ const workspaceConfig = {
250
+ schemaVersion: '1.0',
251
+ products: {
252
+ 'ai-review': {
253
+ enabled: true,
254
+ circularRef: null,
255
+ },
256
+ },
257
+ };
258
+ workspaceConfig.products['ai-review'].circularRef = workspaceConfig;
259
+ // JSON.stringify will fail with circular references, so we'll create a simpler test
260
+ const simpleConfig = {
261
+ schemaVersion: '1.0',
262
+ products: {
263
+ 'ai-review': {
264
+ enabled: true,
265
+ },
266
+ },
267
+ };
268
+ await fsp.writeFile(path.join(testDir, 'kb-labs.config.json'), JSON.stringify(simpleConfig, null, 2));
269
+ // Should handle gracefully
270
+ const result = await getProductConfig({
271
+ cwd: testDir,
272
+ product: 'aiReview',
273
+ }, null);
274
+ expect(result.config).toMatchObject({
275
+ enabled: true,
276
+ });
277
+ });
278
+ it('should handle file system errors', async () => {
279
+ // Create directory that can't be read
280
+ const restrictedDir = path.join(testDir, 'restricted');
281
+ await fsp.mkdir(restrictedDir, { recursive: true });
282
+ await fsp.chmod(restrictedDir, 0o000); // Remove all permissions
283
+ // The function should handle permission errors gracefully
284
+ const result = await getProductConfig({
285
+ cwd: restrictedDir,
286
+ product: 'aiReview',
287
+ }, null);
288
+ // Should fall back to runtime defaults
289
+ expect(result.config).toMatchObject({
290
+ enabled: true,
291
+ rules: [],
292
+ });
293
+ // Restore permissions for cleanup
294
+ await fsp.chmod(restrictedDir, 0o755);
295
+ });
296
+ });
297
+ });
298
+ //# sourceMappingURL=product-config.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-config.spec.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/__tests__/product-config.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=runtime.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.spec.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/__tests__/runtime.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,127 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { promises as fsp } from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { findNearestConfig, readJsonWithDiagnostics, mergeDefined, resolveConfig, pickDefined } from '../runtime';
6
+ async function makeTmpDir(prefix = 'kb-core-config-') {
7
+ const dir = await fsp.mkdtemp(path.join(os.tmpdir(), prefix));
8
+ return dir;
9
+ }
10
+ async function rmDirSafe(dir) {
11
+ try {
12
+ await fsp.rm(dir, { recursive: true, force: true });
13
+ }
14
+ catch { }
15
+ }
16
+ describe('runtime utils', () => {
17
+ let tmp;
18
+ beforeEach(async () => {
19
+ tmp = await makeTmpDir();
20
+ });
21
+ afterEach(async () => {
22
+ await rmDirSafe(tmp);
23
+ });
24
+ describe('findNearestConfig', () => {
25
+ it('walks up directories and finds the nearest file', async () => {
26
+ const a = path.join(tmp, 'a');
27
+ const b = path.join(a, 'b');
28
+ await fsp.mkdir(b, { recursive: true });
29
+ const rc = path.join(a, '.sentinelrc.json');
30
+ await fsp.writeFile(rc, '{}', 'utf8');
31
+ const res = await findNearestConfig({ startDir: b, filenames: ['.sentinelrc.json'] });
32
+ expect(res.path).toBe(rc);
33
+ expect(res.tried.length).toBeGreaterThan(0);
34
+ expect(path.isAbsolute(res.path)).toBe(true);
35
+ });
36
+ it('respects stopDir boundary', async () => {
37
+ const a = path.join(tmp, 'a');
38
+ const b = path.join(a, 'b');
39
+ const c = path.join(b, 'c');
40
+ await fsp.mkdir(c, { recursive: true });
41
+ const rc = path.join(tmp, '.sentinelrc.json');
42
+ await fsp.writeFile(rc, '{}', 'utf8');
43
+ const res = await findNearestConfig({ startDir: c, stopDir: a, filenames: ['.sentinelrc.json'] });
44
+ expect(res.path).toBeNull();
45
+ expect(res.tried.some(p => p.endsWith('.sentinelrc.json'))).toBe(true);
46
+ });
47
+ });
48
+ describe('readJsonWithDiagnostics', () => {
49
+ it('returns ok with data on valid JSON', async () => {
50
+ const file = path.join(tmp, 'ok.json');
51
+ await fsp.writeFile(file, '{"x":1}', 'utf8');
52
+ const res = await readJsonWithDiagnostics(file);
53
+ expect(res.ok).toBe(true);
54
+ if (res.ok) {
55
+ expect(res.data.x).toBe(1);
56
+ }
57
+ expect(res.diagnostics).toEqual([]);
58
+ });
59
+ it('returns diagnostics on parse error', async () => {
60
+ const file = path.join(tmp, 'bad.json');
61
+ await fsp.writeFile(file, '{x:}', 'utf8');
62
+ const res = await readJsonWithDiagnostics(file);
63
+ expect(res.ok).toBe(false);
64
+ if (!res.ok) {
65
+ expect(res.diagnostics.find(d => d.code === 'JSON_PARSE_FAILED')).toBeTruthy();
66
+ }
67
+ });
68
+ it('returns diagnostics on read error', async () => {
69
+ const file = path.join(tmp, 'missing.json');
70
+ const res = await readJsonWithDiagnostics(file);
71
+ expect(res.ok).toBe(false);
72
+ if (!res.ok) {
73
+ expect(res.diagnostics.find(d => d.code === 'FILE_READ_FAILED')).toBeTruthy();
74
+ }
75
+ });
76
+ });
77
+ describe('mergeDefined', () => {
78
+ it('deep merges objects and arrays ignoring undefined', () => {
79
+ const base = { a: 1, b: { x: 1, y: [1] }, c: [1, 2], d: 'keep' };
80
+ const over = { a: undefined, b: { y: [2], z: 3 }, c: [3], d: 'set', e: 5 };
81
+ const m = mergeDefined(base, over);
82
+ expect(m).toEqual({ a: 1, b: { x: 1, y: [1, 2], z: 3 }, c: [1, 2, 3], d: 'set', e: 5 });
83
+ });
84
+ it('overlay wins on different types when defined', () => {
85
+ const base = { a: 1 };
86
+ const over = { a: { z: 1 } };
87
+ const m = mergeDefined(base, over);
88
+ expect(m.a).toEqual({ z: 1 });
89
+ });
90
+ });
91
+ describe('pickDefined', () => {
92
+ it('picks only defined values', () => {
93
+ const res = pickDefined({ a: 1, b: undefined, c: false });
94
+ expect(Object.prototype.hasOwnProperty.call(res, 'b')).toBe(false);
95
+ expect(res).toEqual({ a: 1, c: false });
96
+ });
97
+ });
98
+ describe('resolveConfig', () => {
99
+ it('applies precedence: defaults < file < env < cli; and validate', () => {
100
+ const defaults = { a: 1, b: { x: 1 }, c: 'd', f: 0 };
101
+ const file = { a: 2, b: { y: 2 } };
102
+ const envMapper = (env) => ({ b: { x: Number(env.TEST_X ?? 1), z: Number(env.TEST_Z ?? 0) }, c: env.TEST_C });
103
+ const cli = { c: 'cli', f: undefined };
104
+ const validate = (cfg) => ({ ok: cfg.a > 0, diagnostics: [{ level: 'info', code: 'VALIDATED', message: 'ok' }] });
105
+ const { value, diagnostics } = resolveConfig({ defaults, fileConfig: file, envMapper, cliOverrides: cli, validate });
106
+ expect(value).toEqual({
107
+ a: 2,
108
+ b: { x: 1, y: 2, z: 0 },
109
+ c: 'cli',
110
+ f: 0,
111
+ profiles: { rootDir: '.kb/profiles', defaultName: 'default', strict: true }
112
+ });
113
+ expect(diagnostics.some(d => d.code === 'VALIDATED')).toBe(true);
114
+ });
115
+ it('env mapper reads real env; can be stubbed', () => {
116
+ vi.stubEnv('TEST_Z', '5');
117
+ const defaults = { b: { z: 0 } };
118
+ const { value } = resolveConfig({ defaults: defaults, envMapper: (e) => ({ b: { z: Number(e.TEST_Z) } }) });
119
+ expect(value).toEqual({
120
+ b: { z: 5 },
121
+ profiles: { rootDir: '.kb/profiles', defaultName: 'default', strict: true }
122
+ });
123
+ vi.unstubAllEnvs();
124
+ });
125
+ });
126
+ });
127
+ //# sourceMappingURL=runtime.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.spec.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/__tests__/runtime.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @module @kb-labs/core/config/__tests__/upsert-lockfile.spec.ts
3
+ * Tests for upsert lockfile operations
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=upsert-lockfile.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upsert-lockfile.spec.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/__tests__/upsert-lockfile.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}