@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,54 @@
1
+ /**
2
+ * @module @kb-labs/core/config/errors
3
+ * Standardized error class for KB Labs with exit code mapping
4
+ */
5
+ export class KbError extends Error {
6
+ code;
7
+ hint;
8
+ meta;
9
+ constructor(code, message, hint, meta) {
10
+ super(message);
11
+ this.code = code;
12
+ this.hint = hint;
13
+ this.meta = meta;
14
+ this.name = 'KbError';
15
+ }
16
+ }
17
+ /**
18
+ * Maps KbError codes to CLI exit codes
19
+ */
20
+ export function getExitCode(err) {
21
+ if (err.code === 'ERR_FORBIDDEN') {
22
+ return 3;
23
+ }
24
+ if (err.code === 'ERR_CONFIG_NOT_FOUND') {
25
+ return 2;
26
+ }
27
+ if (err.code === 'ERR_CONFIG_EXISTS_CONFLICT') {
28
+ return 2;
29
+ }
30
+ if (err.code === 'ERR_PATH_OUTSIDE_WORKSPACE') {
31
+ return 2;
32
+ }
33
+ if (err.code.startsWith('ERR_')) {
34
+ return 1;
35
+ }
36
+ return 1;
37
+ }
38
+ /**
39
+ * Error codes with their standard hints
40
+ */
41
+ export const ERROR_HINTS = {
42
+ ERR_CONFIG_NOT_FOUND: 'Create kb-labs.config.yaml or run: kb init',
43
+ ERR_CONFIG_INVALID: 'Check configuration syntax and required fields',
44
+ ERR_CONFIG_EXISTS_CONFLICT: 'Use --force to overwrite existing configuration',
45
+ ERR_PATH_OUTSIDE_WORKSPACE: 'Check cwd or use a relative path within the workspace',
46
+ ERR_PRESET_NOT_RESOLVED: 'Install the required preset package or check network connectivity',
47
+ ERR_PROFILE_INCOMPATIBLE: 'Profile version is incompatible with current system',
48
+ ERR_PROFILE_NOT_DEFINED: 'Add profiles.default to kb-labs.config.yaml',
49
+ ERR_PROFILE_RESOLVE_FAILED: 'pnpm add -D @kb-labs/profile-...',
50
+ ERR_PROFILE_INVALID_FORMAT: 'Recreate profile with: kb init profile --scaffold-local-profile',
51
+ ERR_ARTIFACT_LIMIT_EXCEEDED: 'Remove or split large artifacts, or reduce artifact count',
52
+ ERR_FORBIDDEN: 'Add role in policy.overrides or use preset...',
53
+ };
54
+ //# sourceMappingURL=kb-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kb-error.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/errors/kb-error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,OAAQ,SAAQ,KAAK;IAEvB;IAEA;IACA;IAJT,YACS,IAAY,EACnB,OAAe,EACR,IAAa,EACb,IAAU;QAEjB,KAAK,CAAC,OAAO,CAAC,CAAC;QALR,SAAI,GAAJ,IAAI,CAAQ;QAEZ,SAAI,GAAJ,IAAI,CAAS;QACb,SAAI,GAAJ,IAAI,CAAM;QAGjB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;IACxB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QAAA,OAAO,CAAC,CAAC;IAAA,CAAC;IAC7C,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;QAAA,OAAO,CAAC,CAAC;IAAA,CAAC;IACpD,IAAI,GAAG,CAAC,IAAI,KAAK,4BAA4B,EAAE,CAAC;QAAA,OAAO,CAAC,CAAC;IAAA,CAAC;IAC1D,IAAI,GAAG,CAAC,IAAI,KAAK,4BAA4B,EAAE,CAAC;QAAA,OAAO,CAAC,CAAC;IAAA,CAAC;IAC1D,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAAA,OAAO,CAAC,CAAC;IAAA,CAAC;IAC5C,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,oBAAoB,EAAE,4CAA4C;IAClE,kBAAkB,EAAE,gDAAgD;IACpE,0BAA0B,EAAE,iDAAiD;IAC7E,0BAA0B,EAAE,uDAAuD;IACnF,uBAAuB,EAAE,mEAAmE;IAC5F,wBAAwB,EAAE,qDAAqD;IAC/E,uBAAuB,EAAE,6CAA6C;IACtE,0BAA0B,EAAE,kCAAkC;IAC9D,0BAA0B,EAAE,iEAAiE;IAC7F,2BAA2B,EAAE,2DAA2D;IACxF,aAAa,EAAE,+CAA+C;CACtD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fs.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.spec.d.ts","sourceRoot":"","sources":["../../../../../kb-labs-core/packages/sys/src/fs/__tests__/fs.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import { toAbsolute } from '../fs';
5
+ describe('toAbsolute', () => {
6
+ it('returns baseDir when maybeRelative is falsy', () => {
7
+ const base = os.tmpdir();
8
+ expect(toAbsolute(base, undefined)).toBe(base);
9
+ expect(toAbsolute(base, '')).toBe(path.join(base, ''));
10
+ });
11
+ it('returns absolute path as-is', () => {
12
+ const abs = path.join(os.tmpdir(), 'x', 'y');
13
+ expect(path.isAbsolute(abs)).toBe(true);
14
+ expect(toAbsolute('/root', abs)).toBe(abs);
15
+ });
16
+ it('joins relative path to base', () => {
17
+ const base = path.join(os.tmpdir(), 'base');
18
+ const res = toAbsolute(base, 'child/file.txt');
19
+ expect(res).toBe(path.join(base, 'child/file.txt'));
20
+ });
21
+ });
22
+ //# sourceMappingURL=fs.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.spec.js","sourceRoot":"","sources":["../../../../../kb-labs-core/packages/sys/src/fs/__tests__/fs.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,MAAM,SAAS,CAAA;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAElC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,EAAE,CAAA;QACxB,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAC5C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAA;QAC3C,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;QAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @module @kb-labs/core/sys/fs
3
+ * Safe path helpers with explicit bases.
4
+ */
5
+ export declare function toAbsolute(baseDir: string, maybeRelative?: string): string;
6
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/sys/src/fs/fs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1E"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @module @kb-labs/core/sys/fs
3
+ * Safe path helpers with explicit bases.
4
+ */
5
+ import path from "node:path";
6
+ export function toAbsolute(baseDir, maybeRelative) {
7
+ if (!maybeRelative) {
8
+ return baseDir;
9
+ }
10
+ return path.isAbsolute(maybeRelative) ? maybeRelative : path.join(baseDir, maybeRelative);
11
+ }
12
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/sys/src/fs/fs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,aAAsB;IAC9D,IAAI,CAAC,aAAa,EAAE,CAAC;QAAC,OAAO,OAAO,CAAC;IAAC,CAAC;IACvC,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './fs';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/sys/src/fs/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './fs';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/sys/src/fs/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @module @kb-labs/core/config/hash/config-hash
3
+ * SHA256 hash computation for configuration objects (lockfile generation)
4
+ */
5
+ /**
6
+ * Compute SHA256 hash of a configuration object
7
+ * @param obj Configuration object to hash
8
+ * @returns SHA256 hash as hex string
9
+ */
10
+ export declare function computeConfigHash(obj: any): string;
11
+ /**
12
+ * Compute hash for multiple config objects
13
+ * @param configs Array of config objects
14
+ * @returns Combined SHA256 hash
15
+ */
16
+ export declare function computeConfigsHash(configs: any[]): string;
17
+ //# sourceMappingURL=config-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-hash.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/hash/config-hash.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAKlD;AAmCD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,CAKzD"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @module @kb-labs/core/config/hash/config-hash
3
+ * SHA256 hash computation for configuration objects (lockfile generation)
4
+ */
5
+ import { createHash } from 'node:crypto';
6
+ /**
7
+ * Compute SHA256 hash of a configuration object
8
+ * @param obj Configuration object to hash
9
+ * @returns SHA256 hash as hex string
10
+ */
11
+ export function computeConfigHash(obj) {
12
+ // Normalize object for consistent hashing
13
+ const normalized = normalizeForHash(obj);
14
+ const json = JSON.stringify(normalized, null, 0);
15
+ return createHash('sha256').update(json, 'utf8').digest('hex');
16
+ }
17
+ /**
18
+ * Normalize object for consistent hashing
19
+ * - Sort object keys
20
+ * - Remove undefined values
21
+ * - Convert to stable representation
22
+ */
23
+ function normalizeForHash(obj) {
24
+ if (obj === null || obj === undefined) {
25
+ return null;
26
+ }
27
+ if (typeof obj !== 'object') {
28
+ return obj;
29
+ }
30
+ if (Array.isArray(obj)) {
31
+ return obj.map(normalizeForHash);
32
+ }
33
+ // Sort object keys for consistent ordering
34
+ const sortedKeys = Object.keys(obj).sort();
35
+ const normalized = {};
36
+ for (const key of sortedKeys) {
37
+ const value = obj[key];
38
+ if (value !== undefined) {
39
+ normalized[key] = normalizeForHash(value);
40
+ }
41
+ }
42
+ return normalized;
43
+ }
44
+ /**
45
+ * Compute hash for multiple config objects
46
+ * @param configs Array of config objects
47
+ * @returns Combined SHA256 hash
48
+ */
49
+ export function computeConfigsHash(configs) {
50
+ const combined = configs.reduce((acc, config) => {
51
+ return { ...acc, ...config };
52
+ }, {});
53
+ return computeConfigHash(combined);
54
+ }
55
+ //# sourceMappingURL=config-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-hash.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/hash/config-hash.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAQ;IACxC,0CAA0C;IAC1C,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,GAAQ;IAChC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACnC,CAAC;IAED,2CAA2C;IAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,UAAU,GAAQ,EAAE,CAAC;IAE3B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,UAAU,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAc;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;QAC9C,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC/B,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './types';
2
+ export * from './logging';
3
+ export * from './fs';
4
+ export * from './repo';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../kb-labs-core/packages/sys/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,MAAM,CAAA;AACpB,cAAc,QAAQ,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './types';
2
+ export * from './logging';
3
+ export * from './fs';
4
+ export * from './repo';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../kb-labs-core/packages/sys/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,MAAM,CAAA;AACpB,cAAc,QAAQ,CAAA"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @module @kb-labs/core/config/lockfile/lockfile
3
+ * Lockfile generation and management
4
+ */
5
+ import type { ProductId } from '../types';
6
+ export interface LockfileData {
7
+ $schema?: string;
8
+ schemaVersion: '1.0';
9
+ orgPreset?: string;
10
+ profile?: string;
11
+ policyBundle?: string;
12
+ hashes: Record<string, string>;
13
+ generatedAt: string;
14
+ }
15
+ /**
16
+ * Read lockfile from workspace
17
+ */
18
+ export declare function readLockfile(cwd: string): Promise<LockfileData | null>;
19
+ /**
20
+ * Write lockfile to workspace
21
+ */
22
+ export declare function writeLockfile(cwd: string, lockfileData: LockfileData): Promise<void>;
23
+ /**
24
+ * Update lockfile with new hashes
25
+ */
26
+ export declare function updateLockfile(cwd: string, updates: {
27
+ orgPreset?: string;
28
+ profile?: string;
29
+ policyBundle?: string;
30
+ configHashes?: Record<string, any>;
31
+ }): Promise<LockfileData>;
32
+ /**
33
+ * Get config hash for a product
34
+ */
35
+ export declare function getLockfileConfigHash(product: ProductId, config: any): string;
36
+ /**
37
+ * Check if lockfile is up to date
38
+ */
39
+ export declare function isLockfileUpToDate(cwd: string, configs: Record<string, any>): Promise<boolean>;
40
+ /**
41
+ * Validate lockfile schema
42
+ */
43
+ export declare function validateLockfile(lockfileData: any): lockfileData is LockfileData;
44
+ /**
45
+ * Get lockfile statistics
46
+ */
47
+ export declare function getLockfileStats(lockfileData: LockfileData): {
48
+ productCount: number;
49
+ hasOrgPreset: boolean;
50
+ hasProfile: boolean;
51
+ hasPolicyBundle: boolean;
52
+ generatedAt: Date;
53
+ };
54
+ //# sourceMappingURL=lockfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/lockfile/lockfile.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,KAAK,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAgB5E;AAmBD;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACpC,GACA,OAAO,CAAC,YAAY,CAAC,CAwBvB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,MAAM,CAE7E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,GAAG,GAAG,YAAY,IAAI,YAAY,CAkBhF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,IAAI,CAAC;CACnB,CAQA"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * @module @kb-labs/core/config/lockfile/lockfile
3
+ * Lockfile generation and management
4
+ */
5
+ import { promises as fsp } from 'node:fs';
6
+ import path from 'node:path';
7
+ import { computeConfigHash } from '../hash/config-hash';
8
+ import { toFsProduct } from '../utils/product-normalize';
9
+ /**
10
+ * Read lockfile from workspace
11
+ */
12
+ export async function readLockfile(cwd) {
13
+ const lockfilePath = path.join(cwd, '.kb', 'lock.json');
14
+ try {
15
+ const lockfileData = await fsp.readFile(lockfilePath, 'utf-8');
16
+ return JSON.parse(lockfileData);
17
+ }
18
+ catch {
19
+ // Try old location for backward compatibility
20
+ const oldLockfilePath = path.join(cwd, '.kb', 'lockfile.json');
21
+ try {
22
+ const lockfileData = await fsp.readFile(oldLockfilePath, 'utf-8');
23
+ return JSON.parse(lockfileData);
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ }
30
+ /**
31
+ * Stable JSON serialization with sorted keys for predictable diffs
32
+ */
33
+ function stableStringify(obj, space = 2) {
34
+ return JSON.stringify(obj, (key, value) => {
35
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
36
+ return Object.keys(value)
37
+ .sort()
38
+ .reduce((sorted, key) => {
39
+ sorted[key] = value[key];
40
+ return sorted;
41
+ }, {});
42
+ }
43
+ return value;
44
+ }, space);
45
+ }
46
+ /**
47
+ * Write lockfile to workspace
48
+ */
49
+ export async function writeLockfile(cwd, lockfileData) {
50
+ const lockfileDir = path.join(cwd, '.kb');
51
+ const lockfilePath = path.join(lockfileDir, 'lock.json');
52
+ // Ensure .kb directory exists
53
+ await fsp.mkdir(lockfileDir, { recursive: true });
54
+ // Add schema if not present
55
+ if (!lockfileData.$schema) {
56
+ lockfileData.$schema = 'https://schemas.kb-labs.dev/lockfile.schema.json';
57
+ }
58
+ // Use atomic write with stable key ordering
59
+ const { writeFileAtomic } = await import('../utils/fs-atomic');
60
+ await writeFileAtomic(lockfilePath, stableStringify(lockfileData, 2) + '\n');
61
+ }
62
+ /**
63
+ * Update lockfile with new hashes
64
+ */
65
+ export async function updateLockfile(cwd, updates) {
66
+ const existing = await readLockfile(cwd);
67
+ const lockfileData = {
68
+ $schema: 'https://schemas.kb-labs.dev/lockfile.schema.json',
69
+ schemaVersion: '1.0',
70
+ orgPreset: updates.orgPreset || existing?.orgPreset,
71
+ profile: updates.profile || existing?.profile,
72
+ policyBundle: updates.policyBundle || existing?.policyBundle,
73
+ hashes: { ...existing?.hashes },
74
+ generatedAt: new Date().toISOString(),
75
+ };
76
+ // Update config hashes
77
+ if (updates.configHashes) {
78
+ for (const [product, config] of Object.entries(updates.configHashes)) {
79
+ const fsProduct = toFsProduct(product);
80
+ const hash = computeConfigHash(config);
81
+ lockfileData.hashes[fsProduct] = hash;
82
+ }
83
+ }
84
+ await writeLockfile(cwd, lockfileData);
85
+ return lockfileData;
86
+ }
87
+ /**
88
+ * Get config hash for a product
89
+ */
90
+ export function getLockfileConfigHash(product, config) {
91
+ return computeConfigHash(config);
92
+ }
93
+ /**
94
+ * Check if lockfile is up to date
95
+ */
96
+ export async function isLockfileUpToDate(cwd, configs) {
97
+ const lockfile = await readLockfile(cwd);
98
+ if (!lockfile) {
99
+ return false;
100
+ }
101
+ for (const [product, config] of Object.entries(configs)) {
102
+ const fsProduct = toFsProduct(product);
103
+ const currentHash = computeConfigHash(config);
104
+ const lockfileHash = lockfile.hashes[fsProduct];
105
+ if (currentHash !== lockfileHash) {
106
+ return false;
107
+ }
108
+ }
109
+ return true;
110
+ }
111
+ /**
112
+ * Validate lockfile schema
113
+ */
114
+ export function validateLockfile(lockfileData) {
115
+ if (!lockfileData || typeof lockfileData !== 'object') {
116
+ return false;
117
+ }
118
+ if (lockfileData.schemaVersion !== '1.0') {
119
+ return false;
120
+ }
121
+ if (!lockfileData.hashes || typeof lockfileData.hashes !== 'object') {
122
+ return false;
123
+ }
124
+ if (!lockfileData.generatedAt || typeof lockfileData.generatedAt !== 'string') {
125
+ return false;
126
+ }
127
+ return true;
128
+ }
129
+ /**
130
+ * Get lockfile statistics
131
+ */
132
+ export function getLockfileStats(lockfileData) {
133
+ return {
134
+ productCount: Object.keys(lockfileData.hashes).length,
135
+ hasOrgPreset: !!lockfileData.orgPreset,
136
+ hasProfile: !!lockfileData.profile,
137
+ hasPolicyBundle: !!lockfileData.policyBundle,
138
+ generatedAt: new Date(lockfileData.generatedAt),
139
+ };
140
+ }
141
+ //# sourceMappingURL=lockfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../../../kb-labs-core/packages/config/src/lockfile/lockfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=logger.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.spec.d.ts","sourceRoot":"","sources":["../../../../../kb-labs-core/packages/sys/src/logging/__tests__/logger.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { configureLogger, setLogLevel, addSink, getLogger } from '..';
3
+ function makeRecord() {
4
+ const records = [];
5
+ const sink = { handle: (r) => { records.push(r); } };
6
+ return { records, sink };
7
+ }
8
+ describe.sequential('logging', () => {
9
+ beforeEach(() => {
10
+ configureLogger({ level: 'info', sinks: [], redactor: undefined, categoryFilter: /.*/, clock: () => new Date('2020-01-01T00:00:00.000Z') });
11
+ });
12
+ it('respects log level thresholds', async () => {
13
+ const { records, sink } = makeRecord();
14
+ addSink(sink);
15
+ const log = getLogger('test');
16
+ log.debug('d');
17
+ log.info('i');
18
+ log.warn('w');
19
+ log.error('e');
20
+ await Promise.resolve();
21
+ await new Promise(r => setTimeout(r, 1));
22
+ expect(records.map(r => r.level)).toEqual(['info', 'warn', 'error']);
23
+ });
24
+ it('supports changing level at runtime', async () => {
25
+ const { records, sink } = makeRecord();
26
+ addSink(sink);
27
+ setLogLevel('debug');
28
+ const log = getLogger('cat');
29
+ log.debug('ok');
30
+ await Promise.resolve();
31
+ await new Promise(r => setTimeout(r, 1));
32
+ expect(records[0].level).toBe('debug');
33
+ });
34
+ it('category filter prevents emission when not allowed', async () => {
35
+ const { records, sink } = makeRecord();
36
+ configureLogger({ categoryFilter: ['allowed'] });
37
+ addSink(sink);
38
+ getLogger('blocked').info('no');
39
+ getLogger('allowed').info('yes');
40
+ await new Promise(r => setTimeout(r, 0));
41
+ expect(records.length).toBe(1);
42
+ expect(records[0].category).toBe('allowed');
43
+ });
44
+ it('child logger inherits category and merges meta', async () => {
45
+ const { records, sink } = makeRecord();
46
+ addSink(sink);
47
+ const root = getLogger('root');
48
+ const child = root.child({ meta: { a: 1 } });
49
+ child.info('msg', { b: 2 });
50
+ await new Promise(r => setTimeout(r, 0));
51
+ expect(records[0]).toBeDefined();
52
+ expect(records[0].category).toBe('root');
53
+ expect(records[0].meta).toEqual({ a: 1, b: 2 });
54
+ });
55
+ it('captures errors when Error instance provided', async () => {
56
+ const { records, sink } = makeRecord();
57
+ addSink(sink);
58
+ const err = new Error('boom');
59
+ getLogger('x').error('oops', err);
60
+ await new Promise(r => setTimeout(r, 0));
61
+ expect(records[0]).toBeDefined();
62
+ expect(records[0].err?.message).toBe('boom');
63
+ });
64
+ });
65
+ //# sourceMappingURL=logger.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.spec.js","sourceRoot":"","sources":["../../../../../kb-labs-core/packages/sys/src/logging/__tests__/logger.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=redaction.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.spec.d.ts","sourceRoot":"","sources":["../../../../../kb-labs-core/packages/sys/src/logging/__tests__/redaction.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { createRedactor } from '..';
3
+ describe('createRedactor', () => {
4
+ it('masks default keys recursively in objects and arrays', () => {
5
+ const redactor = createRedactor();
6
+ const rec = {
7
+ time: 't', level: 'info', msg: 'm',
8
+ meta: {
9
+ token: 'secret',
10
+ apiKey: 'k',
11
+ Authorization: 'hdr',
12
+ nested: { Token: 's2', keep: 1 },
13
+ arr: [{ token: 'a' }, { keep: 2 }],
14
+ }
15
+ };
16
+ const out = redactor(rec);
17
+ expect(out.meta).toEqual({
18
+ token: '****', apiKey: '****', Authorization: '****',
19
+ nested: { Token: '****', keep: 1 },
20
+ arr: [{ token: '****' }, { keep: 2 }],
21
+ });
22
+ });
23
+ it('uses custom key list and mask', () => {
24
+ const redactor = createRedactor({ keys: ['password', 'ssn'], mask: '***' });
25
+ const out = redactor({ time: 't', level: 'info', msg: 'm', meta: { password: 'p', SSN: '123', other: 'ok' } });
26
+ expect(out.meta).toEqual({ password: '***', SSN: '***', other: 'ok' });
27
+ });
28
+ it('returns same record when no meta present', () => {
29
+ const redactor = createRedactor();
30
+ const rec = { time: 't', level: 'info', msg: 'm' };
31
+ expect(redactor(rec)).toBe(rec);
32
+ });
33
+ });
34
+ //# sourceMappingURL=redaction.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.spec.js","sourceRoot":"","sources":["../../../../../kb-labs-core/packages/sys/src/logging/__tests__/redaction.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,CAAA;AAEnC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAA;QACjC,MAAM,GAAG,GAAG;YACV,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAe,EAAE,GAAG,EAAE,GAAG;YAC3C,IAAI,EAAE;gBACJ,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,GAAG;gBACX,aAAa,EAAE,KAAK;gBACpB,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE;gBAChC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;aACnC;SACF,CAAA;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAU,CAAC,CAAA;QAChC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACvB,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;YACpD,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE;YAClC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;SACtC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC3E,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAS,CAAC,CAAA;QACrH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAA;QACjC,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAe,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;QAC3D,MAAM,CAAC,QAAQ,CAAC,GAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sinks-and-env.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sinks-and-env.spec.d.ts","sourceRoot":"","sources":["../../../../../kb-labs-core/packages/sys/src/logging/__tests__/sinks-and-env.spec.ts"],"names":[],"mappings":""}