@kb-labs/core-config 1.2.0 → 1.4.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 (173) hide show
  1. package/dist/index.d.ts +1016 -25
  2. package/dist/index.js +1533 -29
  3. package/dist/index.js.map +1 -1
  4. package/package.json +2 -2
  5. package/dist/__tests__/cache.spec.d.ts +0 -6
  6. package/dist/__tests__/cache.spec.d.ts.map +0 -1
  7. package/dist/__tests__/cache.spec.js +0 -87
  8. package/dist/__tests__/cache.spec.js.map +0 -1
  9. package/dist/__tests__/fs-atomic.spec.d.ts +0 -6
  10. package/dist/__tests__/fs-atomic.spec.d.ts.map +0 -1
  11. package/dist/__tests__/fs-atomic.spec.js +0 -153
  12. package/dist/__tests__/fs-atomic.spec.js.map +0 -1
  13. package/dist/__tests__/get-product-config-edge-cases.spec.d.ts +0 -6
  14. package/dist/__tests__/get-product-config-edge-cases.spec.d.ts.map +0 -1
  15. package/dist/__tests__/get-product-config-edge-cases.spec.js +0 -334
  16. package/dist/__tests__/get-product-config-edge-cases.spec.js.map +0 -1
  17. package/dist/__tests__/init-workspace.spec.d.ts +0 -6
  18. package/dist/__tests__/init-workspace.spec.d.ts.map +0 -1
  19. package/dist/__tests__/init-workspace.spec.js +0 -101
  20. package/dist/__tests__/init-workspace.spec.js.map +0 -1
  21. package/dist/__tests__/kb-error.spec.d.ts +0 -6
  22. package/dist/__tests__/kb-error.spec.d.ts.map +0 -1
  23. package/dist/__tests__/kb-error.spec.js +0 -193
  24. package/dist/__tests__/kb-error.spec.js.map +0 -1
  25. package/dist/__tests__/preset-lockfile.spec.d.ts +0 -6
  26. package/dist/__tests__/preset-lockfile.spec.d.ts.map +0 -1
  27. package/dist/__tests__/preset-lockfile.spec.js +0 -142
  28. package/dist/__tests__/preset-lockfile.spec.js.map +0 -1
  29. package/dist/__tests__/product-config-profiles.spec.d.ts +0 -6
  30. package/dist/__tests__/product-config-profiles.spec.d.ts.map +0 -1
  31. package/dist/__tests__/product-config-profiles.spec.js +0 -82
  32. package/dist/__tests__/product-config-profiles.spec.js.map +0 -1
  33. package/dist/__tests__/product-config.spec.d.ts +0 -6
  34. package/dist/__tests__/product-config.spec.d.ts.map +0 -1
  35. package/dist/__tests__/product-config.spec.js +0 -304
  36. package/dist/__tests__/product-config.spec.js.map +0 -1
  37. package/dist/__tests__/profiles-demo.d.ts +0 -11
  38. package/dist/__tests__/profiles-demo.d.ts.map +0 -1
  39. package/dist/__tests__/profiles-demo.js +0 -173
  40. package/dist/__tests__/profiles-demo.js.map +0 -1
  41. package/dist/__tests__/profiles-resolver.spec.d.ts +0 -2
  42. package/dist/__tests__/profiles-resolver.spec.d.ts.map +0 -1
  43. package/dist/__tests__/profiles-resolver.spec.js +0 -114
  44. package/dist/__tests__/profiles-resolver.spec.js.map +0 -1
  45. package/dist/__tests__/profiles-section.spec.d.ts +0 -2
  46. package/dist/__tests__/profiles-section.spec.d.ts.map +0 -1
  47. package/dist/__tests__/profiles-section.spec.js +0 -50
  48. package/dist/__tests__/profiles-section.spec.js.map +0 -1
  49. package/dist/__tests__/runtime.spec.d.ts +0 -2
  50. package/dist/__tests__/runtime.spec.d.ts.map +0 -1
  51. package/dist/__tests__/runtime.spec.js +0 -170
  52. package/dist/__tests__/runtime.spec.js.map +0 -1
  53. package/dist/__tests__/upsert-lockfile.spec.d.ts +0 -1
  54. package/dist/__tests__/upsert-lockfile.spec.d.ts.map +0 -1
  55. package/dist/__tests__/upsert-lockfile.spec.js +0 -2
  56. package/dist/__tests__/upsert-lockfile.spec.js.map +0 -1
  57. package/dist/__tests__/validate-config.spec.d.ts +0 -2
  58. package/dist/__tests__/validate-config.spec.d.ts.map +0 -1
  59. package/dist/__tests__/validate-config.spec.js +0 -14
  60. package/dist/__tests__/validate-config.spec.js.map +0 -1
  61. package/dist/api/init-workspace.d.ts +0 -10
  62. package/dist/api/init-workspace.d.ts.map +0 -1
  63. package/dist/api/init-workspace.js +0 -186
  64. package/dist/api/init-workspace.js.map +0 -1
  65. package/dist/api/product-config.d.ts +0 -20
  66. package/dist/api/product-config.d.ts.map +0 -1
  67. package/dist/api/product-config.js +0 -236
  68. package/dist/api/product-config.js.map +0 -1
  69. package/dist/api/read-config.d.ts +0 -22
  70. package/dist/api/read-config.d.ts.map +0 -1
  71. package/dist/api/read-config.js +0 -112
  72. package/dist/api/read-config.js.map +0 -1
  73. package/dist/api/read-kb-config.d.ts +0 -12
  74. package/dist/api/read-kb-config.d.ts.map +0 -1
  75. package/dist/api/read-kb-config.js +0 -47
  76. package/dist/api/read-kb-config.js.map +0 -1
  77. package/dist/api/upsert-lockfile.d.ts +0 -10
  78. package/dist/api/upsert-lockfile.d.ts.map +0 -1
  79. package/dist/api/upsert-lockfile.js +0 -63
  80. package/dist/api/upsert-lockfile.js.map +0 -1
  81. package/dist/cache/fs-cache.d.ts +0 -38
  82. package/dist/cache/fs-cache.d.ts.map +0 -1
  83. package/dist/cache/fs-cache.js +0 -142
  84. package/dist/cache/fs-cache.js.map +0 -1
  85. package/dist/errors/kb-error.d.ts +0 -35
  86. package/dist/errors/kb-error.d.ts.map +0 -1
  87. package/dist/errors/kb-error.js +0 -57
  88. package/dist/errors/kb-error.js.map +0 -1
  89. package/dist/hash/config-hash.d.ts +0 -17
  90. package/dist/hash/config-hash.d.ts.map +0 -1
  91. package/dist/hash/config-hash.js +0 -55
  92. package/dist/hash/config-hash.js.map +0 -1
  93. package/dist/index.d.ts.map +0 -1
  94. package/dist/lockfile/lockfile.d.ts +0 -53
  95. package/dist/lockfile/lockfile.d.ts.map +0 -1
  96. package/dist/lockfile/lockfile.js +0 -142
  97. package/dist/lockfile/lockfile.js.map +0 -1
  98. package/dist/merge/layered-merge.d.ts +0 -16
  99. package/dist/merge/layered-merge.d.ts.map +0 -1
  100. package/dist/merge/layered-merge.js +0 -87
  101. package/dist/merge/layered-merge.js.map +0 -1
  102. package/dist/preset/resolve-preset.d.ts +0 -28
  103. package/dist/preset/resolve-preset.d.ts.map +0 -1
  104. package/dist/preset/resolve-preset.js +0 -104
  105. package/dist/preset/resolve-preset.js.map +0 -1
  106. package/dist/profiles/loader.d.ts +0 -12
  107. package/dist/profiles/loader.d.ts.map +0 -1
  108. package/dist/profiles/loader.js +0 -34
  109. package/dist/profiles/loader.js.map +0 -1
  110. package/dist/profiles/resolver.d.ts +0 -11
  111. package/dist/profiles/resolver.d.ts.map +0 -1
  112. package/dist/profiles/resolver.js +0 -252
  113. package/dist/profiles/resolver.js.map +0 -1
  114. package/dist/profiles/scope-selector.d.ts +0 -19
  115. package/dist/profiles/scope-selector.d.ts.map +0 -1
  116. package/dist/profiles/scope-selector.js +0 -64
  117. package/dist/profiles/scope-selector.js.map +0 -1
  118. package/dist/profiles/types.d.ts +0 -462
  119. package/dist/profiles/types.d.ts.map +0 -1
  120. package/dist/profiles/types.js +0 -68
  121. package/dist/profiles/types.js.map +0 -1
  122. package/dist/runtime/index.d.ts +0 -2
  123. package/dist/runtime/index.d.ts.map +0 -1
  124. package/dist/runtime/index.js +0 -2
  125. package/dist/runtime/index.js.map +0 -1
  126. package/dist/runtime/runtime.d.ts +0 -46
  127. package/dist/runtime/runtime.d.ts.map +0 -1
  128. package/dist/runtime/runtime.js +0 -126
  129. package/dist/runtime/runtime.js.map +0 -1
  130. package/dist/types/index.d.ts +0 -2
  131. package/dist/types/index.d.ts.map +0 -1
  132. package/dist/types/index.js +0 -2
  133. package/dist/types/index.js.map +0 -1
  134. package/dist/types/init.d.ts +0 -33
  135. package/dist/types/init.d.ts.map +0 -1
  136. package/dist/types/init.js +0 -6
  137. package/dist/types/init.js.map +0 -1
  138. package/dist/types/preset.d.ts +0 -27
  139. package/dist/types/preset.d.ts.map +0 -1
  140. package/dist/types/preset.js +0 -6
  141. package/dist/types/preset.js.map +0 -1
  142. package/dist/types/types.d.ts +0 -70
  143. package/dist/types/types.d.ts.map +0 -1
  144. package/dist/types/types.js +0 -2
  145. package/dist/types/types.js.map +0 -1
  146. package/dist/utils/__tests__/env.spec.d.ts +0 -2
  147. package/dist/utils/__tests__/env.spec.d.ts.map +0 -1
  148. package/dist/utils/__tests__/env.spec.js +0 -33
  149. package/dist/utils/__tests__/env.spec.js.map +0 -1
  150. package/dist/utils/env.d.ts +0 -7
  151. package/dist/utils/env.d.ts.map +0 -1
  152. package/dist/utils/env.js +0 -25
  153. package/dist/utils/env.js.map +0 -1
  154. package/dist/utils/fs-atomic.d.ts +0 -15
  155. package/dist/utils/fs-atomic.d.ts.map +0 -1
  156. package/dist/utils/fs-atomic.js +0 -46
  157. package/dist/utils/fs-atomic.js.map +0 -1
  158. package/dist/utils/index.d.ts +0 -3
  159. package/dist/utils/index.d.ts.map +0 -1
  160. package/dist/utils/index.js +0 -3
  161. package/dist/utils/index.js.map +0 -1
  162. package/dist/utils/paths.d.ts +0 -21
  163. package/dist/utils/paths.d.ts.map +0 -1
  164. package/dist/utils/paths.js +0 -32
  165. package/dist/utils/paths.js.map +0 -1
  166. package/dist/utils/product-normalize.d.ts +0 -25
  167. package/dist/utils/product-normalize.d.ts.map +0 -1
  168. package/dist/utils/product-normalize.js +0 -48
  169. package/dist/utils/product-normalize.js.map +0 -1
  170. package/dist/validation/validate-config.d.ts +0 -10
  171. package/dist/validation/validate-config.d.ts.map +0 -1
  172. package/dist/validation/validate-config.js +0 -21
  173. package/dist/validation/validate-config.js.map +0 -1
@@ -1,142 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"fs-cache.js","sourceRoot":"","sources":["../../src/cache/fs-cache.ts"],"names":[],"mappings":"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"}
@@ -1,35 +0,0 @@
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/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[] to kb.config.json or pass --profile=<id>";
26
- readonly ERR_PROFILE_RESOLVE_FAILED: "Profile registry unavailable. Define profiles[] inside kb.config.json or use workspace presets.";
27
- readonly ERR_PROFILE_EXTENDS_FAILED: "Profile extends failed. Check extends reference or install required preset/package.";
28
- readonly ERR_PROFILE_SCOPE_NOT_FOUND: "Scope not found. Use --scope=<id> with one of the configured scopes.";
29
- readonly ERR_PROFILE_SCOPE_CONFLICT: "Multiple scopes matched. Specify --scope=<id> explicitly.";
30
- readonly ERR_PROFILE_INVALID_FORMAT: "Update profiles[] in kb.config.json (Profiles v2) or rerun your plugin setup command.";
31
- readonly ERR_ARTIFACT_LIMIT_EXCEEDED: "Remove or split large artifacts, or reduce artifact count";
32
- readonly ERR_FORBIDDEN: "Add role in policy.overrides or use preset...";
33
- };
34
- export type ErrorCode = keyof typeof ERROR_HINTS;
35
- //# sourceMappingURL=kb-error.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kb-error.d.ts","sourceRoot":"","sources":["../../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;;;;;;;;;;;;;;;CAed,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,WAAW,CAAC"}
@@ -1,57 +0,0 @@
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/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[] to kb.config.json or pass --profile=<id>',
49
- ERR_PROFILE_RESOLVE_FAILED: 'Profile registry unavailable. Define profiles[] inside kb.config.json or use workspace presets.',
50
- ERR_PROFILE_EXTENDS_FAILED: 'Profile extends failed. Check extends reference or install required preset/package.',
51
- ERR_PROFILE_SCOPE_NOT_FOUND: 'Scope not found. Use --scope=<id> with one of the configured scopes.',
52
- ERR_PROFILE_SCOPE_CONFLICT: 'Multiple scopes matched. Specify --scope=<id> explicitly.',
53
- ERR_PROFILE_INVALID_FORMAT: 'Update profiles[] in kb.config.json (Profiles v2) or rerun your plugin setup command.',
54
- ERR_ARTIFACT_LIMIT_EXCEEDED: 'Remove or split large artifacts, or reduce artifact count',
55
- ERR_FORBIDDEN: 'Add role in policy.overrides or use preset...',
56
- };
57
- //# sourceMappingURL=kb-error.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kb-error.js","sourceRoot":"","sources":["../../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,gDAAgD;IACtE,kBAAkB,EAAE,gDAAgD;IACpE,0BAA0B,EAAE,iDAAiD;IAC7E,0BAA0B,EAAE,uDAAuD;IACnF,uBAAuB,EAAE,mEAAmE;IAC5F,wBAAwB,EAAE,qDAAqD;IAC/E,uBAAuB,EAAE,yDAAyD;IAClF,0BAA0B,EAAE,iGAAiG;IAC7H,0BAA0B,EAAE,qFAAqF;IACjH,2BAA2B,EAAE,sEAAsE;IACnG,0BAA0B,EAAE,2DAA2D;IACvF,0BAA0B,EAAE,uFAAuF;IACnH,2BAA2B,EAAE,2DAA2D;IACxF,aAAa,EAAE,+CAA+C;CACtD,CAAC"}
@@ -1,17 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-hash.d.ts","sourceRoot":"","sources":["../../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"}
@@ -1,55 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-hash.js","sourceRoot":"","sources":["../../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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAG7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AAGnC,cAAc,cAAc,CAAA;AAC5B,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AAGjC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA"}
@@ -1,53 +0,0 @@
1
- /**
2
- * @module @kb-labs/core/config/lockfile/lockfile
3
- * Lockfile generation and management
4
- */
5
- export interface LockfileData {
6
- $schema?: string;
7
- schemaVersion: '1.0';
8
- orgPreset?: string;
9
- profile?: string;
10
- policyBundle?: string;
11
- hashes: Record<string, string>;
12
- generatedAt: string;
13
- }
14
- /**
15
- * Read lockfile from workspace
16
- */
17
- export declare function readLockfile(cwd: string): Promise<LockfileData | null>;
18
- /**
19
- * Write lockfile to workspace
20
- */
21
- export declare function writeLockfile(cwd: string, lockfileData: LockfileData): Promise<void>;
22
- /**
23
- * Update lockfile with new hashes
24
- */
25
- export declare function updateLockfile(cwd: string, updates: {
26
- orgPreset?: string;
27
- profile?: string;
28
- policyBundle?: string;
29
- configHashes?: Record<string, any>;
30
- }): Promise<LockfileData>;
31
- /**
32
- * Get config hash for a product
33
- */
34
- export declare function getLockfileConfigHash(product: string, config: any): string;
35
- /**
36
- * Check if lockfile is up to date
37
- */
38
- export declare function isLockfileUpToDate(cwd: string, configs: Record<string, any>): Promise<boolean>;
39
- /**
40
- * Validate lockfile schema
41
- */
42
- export declare function validateLockfile(lockfileData: any): lockfileData is LockfileData;
43
- /**
44
- * Get lockfile statistics
45
- */
46
- export declare function getLockfileStats(lockfileData: LockfileData): {
47
- productCount: number;
48
- hasOrgPreset: boolean;
49
- hasProfile: boolean;
50
- hasPolicyBundle: boolean;
51
- generatedAt: Date;
52
- };
53
- //# sourceMappingURL=lockfile.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../src/lockfile/lockfile.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,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,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,MAAM,CAE1E;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"}
@@ -1,142 +0,0 @@
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
- // Note: KbError and ERROR_HINTS are available if needed for future error handling
8
- import { computeConfigHash } from '../hash/config-hash';
9
- import { toFsProduct } from '../utils/product-normalize';
10
- /**
11
- * Read lockfile from workspace
12
- */
13
- export async function readLockfile(cwd) {
14
- const lockfilePath = path.join(cwd, '.kb', 'lock.json');
15
- try {
16
- const lockfileData = await fsp.readFile(lockfilePath, 'utf-8');
17
- return JSON.parse(lockfileData);
18
- }
19
- catch {
20
- // Try old location for backward compatibility
21
- const oldLockfilePath = path.join(cwd, '.kb', 'lockfile.json');
22
- try {
23
- const lockfileData = await fsp.readFile(oldLockfilePath, 'utf-8');
24
- return JSON.parse(lockfileData);
25
- }
26
- catch {
27
- return null;
28
- }
29
- }
30
- }
31
- /**
32
- * Stable JSON serialization with sorted keys for predictable diffs
33
- */
34
- function stableStringify(obj, space = 2) {
35
- return JSON.stringify(obj, (key, value) => {
36
- if (value && typeof value === 'object' && !Array.isArray(value)) {
37
- return Object.keys(value)
38
- .sort()
39
- .reduce((sorted, key) => {
40
- sorted[key] = value[key];
41
- return sorted;
42
- }, {});
43
- }
44
- return value;
45
- }, space);
46
- }
47
- /**
48
- * Write lockfile to workspace
49
- */
50
- export async function writeLockfile(cwd, lockfileData) {
51
- const lockfileDir = path.join(cwd, '.kb');
52
- const lockfilePath = path.join(lockfileDir, 'lock.json');
53
- // Ensure .kb directory exists
54
- await fsp.mkdir(lockfileDir, { recursive: true });
55
- // Add schema if not present
56
- if (!lockfileData.$schema) {
57
- lockfileData.$schema = 'https://schemas.kb-labs.dev/lockfile.schema.json';
58
- }
59
- // Use atomic write with stable key ordering
60
- const { writeFileAtomic } = await import('../utils/fs-atomic');
61
- await writeFileAtomic(lockfilePath, stableStringify(lockfileData, 2) + '\n');
62
- }
63
- /**
64
- * Update lockfile with new hashes
65
- */
66
- export async function updateLockfile(cwd, updates) {
67
- const existing = await readLockfile(cwd);
68
- const lockfileData = {
69
- $schema: 'https://schemas.kb-labs.dev/lockfile.schema.json',
70
- schemaVersion: '1.0',
71
- orgPreset: updates.orgPreset || existing?.orgPreset,
72
- profile: updates.profile || existing?.profile,
73
- policyBundle: updates.policyBundle || existing?.policyBundle,
74
- hashes: { ...existing?.hashes },
75
- generatedAt: new Date().toISOString(),
76
- };
77
- // Update config hashes
78
- if (updates.configHashes) {
79
- for (const [product, config] of Object.entries(updates.configHashes)) {
80
- const fsProduct = toFsProduct(product);
81
- const hash = computeConfigHash(config);
82
- lockfileData.hashes[fsProduct] = hash;
83
- }
84
- }
85
- await writeLockfile(cwd, lockfileData);
86
- return lockfileData;
87
- }
88
- /**
89
- * Get config hash for a product
90
- */
91
- export function getLockfileConfigHash(product, config) {
92
- return computeConfigHash(config);
93
- }
94
- /**
95
- * Check if lockfile is up to date
96
- */
97
- export async function isLockfileUpToDate(cwd, configs) {
98
- const lockfile = await readLockfile(cwd);
99
- if (!lockfile) {
100
- return false;
101
- }
102
- for (const [product, config] of Object.entries(configs)) {
103
- const fsProduct = toFsProduct(product);
104
- const currentHash = computeConfigHash(config);
105
- const lockfileHash = lockfile.hashes[fsProduct];
106
- if (currentHash !== lockfileHash) {
107
- return false;
108
- }
109
- }
110
- return true;
111
- }
112
- /**
113
- * Validate lockfile schema
114
- */
115
- export function validateLockfile(lockfileData) {
116
- if (!lockfileData || typeof lockfileData !== 'object') {
117
- return false;
118
- }
119
- if (lockfileData.schemaVersion !== '1.0') {
120
- return false;
121
- }
122
- if (!lockfileData.hashes || typeof lockfileData.hashes !== 'object') {
123
- return false;
124
- }
125
- if (!lockfileData.generatedAt || typeof lockfileData.generatedAt !== 'string') {
126
- return false;
127
- }
128
- return true;
129
- }
130
- /**
131
- * Get lockfile statistics
132
- */
133
- export function getLockfileStats(lockfileData) {
134
- return {
135
- productCount: Object.keys(lockfileData.hashes).length,
136
- hasOrgPreset: !!lockfileData.orgPreset,
137
- hasProfile: !!lockfileData.profile,
138
- hasPolicyBundle: !!lockfileData.policyBundle,
139
- generatedAt: new Date(lockfileData.generatedAt),
140
- };
141
- }
142
- //# sourceMappingURL=lockfile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/lockfile/lockfile.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- /**
2
- * @module @kb-labs/core/config/merge/layered-merge
3
- * Layered merge with trace for configuration layers
4
- */
5
- import type { ConfigLayer, MergeTrace } from '../types';
6
- export interface LayeredMergeResult {
7
- merged: any;
8
- trace: MergeTrace[];
9
- }
10
- /**
11
- * Merge configuration layers with detailed trace
12
- * Arrays are overwritten (not merged)
13
- * Objects are deeply merged
14
- */
15
- export declare function layeredMergeWithTrace(layers: ConfigLayer[]): LayeredMergeResult;
16
- //# sourceMappingURL=layered-merge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"layered-merge.d.ts","sourceRoot":"","sources":["../../src/merge/layered-merge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,GAAG,CAAC;IACZ,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAgE/E"}
@@ -1,87 +0,0 @@
1
- /**
2
- * @module @kb-labs/core/config/merge/layered-merge
3
- * Layered merge with trace for configuration layers
4
- */
5
- /**
6
- * Merge configuration layers with detailed trace
7
- * Arrays are overwritten (not merged)
8
- * Objects are deeply merged
9
- */
10
- export function layeredMergeWithTrace(layers) {
11
- const trace = [];
12
- const isPlainObject = (v) => v && typeof v === 'object' && !Array.isArray(v) && Object.getPrototypeOf(v) === Object.prototype;
13
- const merge = (base, overlay, layer, path = []) => {
14
- // Handle array overwrite
15
- if (Array.isArray(base) && Array.isArray(overlay)) {
16
- trace.push({
17
- path: path.join('.'),
18
- source: layer.source,
19
- type: 'overwriteArray',
20
- layer: layer.label,
21
- profileRef: layer.source.includes('profile') ? extractProfileRef(layer.source) : undefined,
22
- presetRef: layer.source.includes('preset') ? extractPresetRef(layer.source) : undefined,
23
- version: extractVersion(layer.source),
24
- });
25
- return overlay;
26
- }
27
- // Handle object merge
28
- if (isPlainObject(base) && isPlainObject(overlay)) {
29
- const result = { ...base };
30
- for (const [key, value] of Object.entries(overlay)) {
31
- if (key in base) {
32
- result[key] = merge(base[key], value, layer, [...path, key]);
33
- }
34
- else {
35
- trace.push({
36
- path: [...path, key].join('.'),
37
- source: layer.source,
38
- type: 'set',
39
- layer: layer.label,
40
- profileRef: layer.source.includes('profile') ? extractProfileRef(layer.source) : undefined,
41
- presetRef: layer.source.includes('preset') ? extractPresetRef(layer.source) : undefined,
42
- version: extractVersion(layer.source),
43
- });
44
- result[key] = value;
45
- }
46
- }
47
- return result;
48
- }
49
- // Different types or primitive values - overlay wins
50
- trace.push({
51
- path: path.join('.'),
52
- source: layer.source,
53
- type: 'set',
54
- layer: layer.label,
55
- profileRef: layer.source.includes('profile') ? extractProfileRef(layer.source) : undefined,
56
- presetRef: layer.source.includes('preset') ? extractPresetRef(layer.source) : undefined,
57
- version: extractVersion(layer.source),
58
- });
59
- return overlay ?? base;
60
- };
61
- const merged = layers.reduce((acc, layer) => {
62
- return merge(acc, layer.value, layer);
63
- }, {});
64
- return { merged, trace };
65
- }
66
- /**
67
- * Extract profile ref from source string
68
- */
69
- function extractProfileRef(source) {
70
- const match = source.match(/profile[^:]*:[^@]+@(.+)/);
71
- return match?.[1];
72
- }
73
- /**
74
- * Extract preset ref from source string
75
- */
76
- function extractPresetRef(source) {
77
- const match = source.match(/preset[^:]*:@(.+)/);
78
- return match?.[1];
79
- }
80
- /**
81
- * Extract version from source string
82
- */
83
- function extractVersion(source) {
84
- const match = source.match(/@([^:]+)/);
85
- return match?.[1];
86
- }
87
- //# sourceMappingURL=layered-merge.js.map