@kb-labs/core-config 1.0.0 → 1.2.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.
- package/dist/__tests__/cache.spec.d.ts +6 -0
- package/dist/__tests__/cache.spec.d.ts.map +1 -0
- package/dist/__tests__/cache.spec.js +87 -0
- package/dist/__tests__/cache.spec.js.map +1 -0
- package/dist/__tests__/fs-atomic.spec.d.ts +6 -0
- package/dist/__tests__/fs-atomic.spec.d.ts.map +1 -0
- package/dist/__tests__/fs-atomic.spec.js +153 -0
- package/dist/__tests__/fs-atomic.spec.js.map +1 -0
- package/dist/__tests__/get-product-config-edge-cases.spec.d.ts +6 -0
- package/dist/__tests__/get-product-config-edge-cases.spec.d.ts.map +1 -0
- package/dist/__tests__/get-product-config-edge-cases.spec.js +334 -0
- package/dist/__tests__/get-product-config-edge-cases.spec.js.map +1 -0
- package/dist/__tests__/init-workspace.spec.d.ts +6 -0
- package/dist/__tests__/init-workspace.spec.d.ts.map +1 -0
- package/dist/__tests__/init-workspace.spec.js +101 -0
- package/dist/__tests__/init-workspace.spec.js.map +1 -0
- package/dist/__tests__/kb-error.spec.d.ts +6 -0
- package/dist/__tests__/kb-error.spec.d.ts.map +1 -0
- package/dist/__tests__/kb-error.spec.js +193 -0
- package/dist/__tests__/kb-error.spec.js.map +1 -0
- package/dist/__tests__/preset-lockfile.spec.d.ts +6 -0
- package/dist/__tests__/preset-lockfile.spec.d.ts.map +1 -0
- package/dist/__tests__/preset-lockfile.spec.js +142 -0
- package/dist/__tests__/preset-lockfile.spec.js.map +1 -0
- package/dist/__tests__/product-config-profiles.spec.d.ts +6 -0
- package/dist/__tests__/product-config-profiles.spec.d.ts.map +1 -0
- package/dist/__tests__/product-config-profiles.spec.js +82 -0
- package/dist/__tests__/product-config-profiles.spec.js.map +1 -0
- package/dist/__tests__/product-config.spec.d.ts +6 -0
- package/dist/__tests__/product-config.spec.d.ts.map +1 -0
- package/dist/__tests__/product-config.spec.js +304 -0
- package/dist/__tests__/product-config.spec.js.map +1 -0
- package/dist/__tests__/profiles-demo.d.ts +11 -0
- package/dist/__tests__/profiles-demo.d.ts.map +1 -0
- package/dist/__tests__/profiles-demo.js +173 -0
- package/dist/__tests__/profiles-demo.js.map +1 -0
- package/dist/__tests__/profiles-resolver.spec.d.ts +2 -0
- package/dist/__tests__/profiles-resolver.spec.d.ts.map +1 -0
- package/dist/__tests__/profiles-resolver.spec.js +114 -0
- package/dist/__tests__/profiles-resolver.spec.js.map +1 -0
- package/dist/__tests__/profiles-section.spec.d.ts +2 -0
- package/dist/__tests__/profiles-section.spec.d.ts.map +1 -0
- package/dist/__tests__/profiles-section.spec.js +50 -0
- package/dist/__tests__/profiles-section.spec.js.map +1 -0
- package/dist/__tests__/runtime.spec.d.ts +2 -0
- package/dist/__tests__/runtime.spec.d.ts.map +1 -0
- package/dist/__tests__/runtime.spec.js +170 -0
- package/dist/__tests__/runtime.spec.js.map +1 -0
- package/dist/__tests__/upsert-lockfile.spec.d.ts +1 -0
- package/dist/__tests__/upsert-lockfile.spec.d.ts.map +1 -0
- package/dist/__tests__/upsert-lockfile.spec.js +2 -0
- package/dist/__tests__/upsert-lockfile.spec.js.map +1 -0
- package/dist/__tests__/validate-config.spec.d.ts +2 -0
- package/dist/__tests__/validate-config.spec.d.ts.map +1 -0
- package/dist/__tests__/validate-config.spec.js +14 -0
- package/dist/__tests__/validate-config.spec.js.map +1 -0
- package/dist/api/init-workspace.d.ts +10 -0
- package/dist/api/init-workspace.d.ts.map +1 -0
- package/dist/api/init-workspace.js +186 -0
- package/dist/api/init-workspace.js.map +1 -0
- package/dist/api/product-config.d.ts +20 -0
- package/dist/api/product-config.d.ts.map +1 -0
- package/dist/api/product-config.js +236 -0
- package/dist/api/product-config.js.map +1 -0
- package/dist/api/read-config.d.ts +22 -0
- package/dist/api/read-config.d.ts.map +1 -0
- package/dist/api/read-config.js +112 -0
- package/dist/api/read-config.js.map +1 -0
- package/dist/api/read-kb-config.d.ts +12 -0
- package/dist/api/read-kb-config.d.ts.map +1 -0
- package/dist/api/read-kb-config.js +47 -0
- package/dist/api/read-kb-config.js.map +1 -0
- package/dist/api/upsert-lockfile.d.ts +10 -0
- package/dist/api/upsert-lockfile.d.ts.map +1 -0
- package/dist/api/upsert-lockfile.js +63 -0
- package/dist/api/upsert-lockfile.js.map +1 -0
- package/dist/cache/fs-cache.d.ts +38 -0
- package/dist/cache/fs-cache.d.ts.map +1 -0
- package/dist/cache/fs-cache.js +142 -0
- package/dist/cache/fs-cache.js.map +1 -0
- package/dist/errors/kb-error.d.ts +35 -0
- package/dist/errors/kb-error.d.ts.map +1 -0
- package/dist/errors/kb-error.js +57 -0
- package/dist/errors/kb-error.js.map +1 -0
- package/dist/hash/config-hash.d.ts +17 -0
- package/dist/hash/config-hash.d.ts.map +1 -0
- package/dist/hash/config-hash.js +55 -0
- package/dist/hash/config-hash.js.map +1 -0
- package/dist/index.d.ts +25 -1016
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -1533
- package/dist/index.js.map +1 -1
- package/dist/lockfile/lockfile.d.ts +53 -0
- package/dist/lockfile/lockfile.d.ts.map +1 -0
- package/dist/lockfile/lockfile.js +142 -0
- package/dist/lockfile/lockfile.js.map +1 -0
- package/dist/merge/layered-merge.d.ts +16 -0
- package/dist/merge/layered-merge.d.ts.map +1 -0
- package/dist/merge/layered-merge.js +87 -0
- package/dist/merge/layered-merge.js.map +1 -0
- package/dist/preset/resolve-preset.d.ts +28 -0
- package/dist/preset/resolve-preset.d.ts.map +1 -0
- package/dist/preset/resolve-preset.js +104 -0
- package/dist/preset/resolve-preset.js.map +1 -0
- package/dist/profiles/loader.d.ts +12 -0
- package/dist/profiles/loader.d.ts.map +1 -0
- package/dist/profiles/loader.js +34 -0
- package/dist/profiles/loader.js.map +1 -0
- package/dist/profiles/resolver.d.ts +11 -0
- package/dist/profiles/resolver.d.ts.map +1 -0
- package/dist/profiles/resolver.js +252 -0
- package/dist/profiles/resolver.js.map +1 -0
- package/dist/profiles/scope-selector.d.ts +19 -0
- package/dist/profiles/scope-selector.d.ts.map +1 -0
- package/dist/profiles/scope-selector.js +64 -0
- package/dist/profiles/scope-selector.js.map +1 -0
- package/dist/profiles/types.d.ts +462 -0
- package/dist/profiles/types.d.ts.map +1 -0
- package/dist/profiles/types.js +68 -0
- package/dist/profiles/types.js.map +1 -0
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +2 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/runtime.d.ts +46 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +126 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/init.d.ts +33 -0
- package/dist/types/init.d.ts.map +1 -0
- package/dist/types/init.js +6 -0
- package/dist/types/init.js.map +1 -0
- package/dist/types/preset.d.ts +27 -0
- package/dist/types/preset.d.ts.map +1 -0
- package/dist/types/preset.js +6 -0
- package/dist/types/preset.js.map +1 -0
- package/dist/types/types.d.ts +70 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +2 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utils/__tests__/env.spec.d.ts +2 -0
- package/dist/utils/__tests__/env.spec.d.ts.map +1 -0
- package/dist/utils/__tests__/env.spec.js +33 -0
- package/dist/utils/__tests__/env.spec.js.map +1 -0
- package/dist/utils/env.d.ts +7 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +25 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/fs-atomic.d.ts +15 -0
- package/dist/utils/fs-atomic.d.ts.map +1 -0
- package/dist/utils/fs-atomic.js +46 -0
- package/dist/utils/fs-atomic.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/paths.d.ts +21 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +32 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/product-normalize.d.ts +25 -0
- package/dist/utils/product-normalize.d.ts.map +1 -0
- package/dist/utils/product-normalize.js +48 -0
- package/dist/utils/product-normalize.js.map +1 -0
- package/dist/validation/validate-config.d.ts +10 -0
- package/dist/validation/validate-config.d.ts.map +1 -0
- package/dist/validation/validate-config.js +21 -0
- package/dist/validation/validate-config.js.map +1 -0
- package/package.json +13 -13
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @kb-labs/core/config/cache/fs-cache
|
|
3
|
+
* LRU cache for filesystem reads with clearCaches() support
|
|
4
|
+
*/
|
|
5
|
+
import { promises as fsp } from 'node:fs';
|
|
6
|
+
class LRUCache {
|
|
7
|
+
cache = new Map();
|
|
8
|
+
maxSize;
|
|
9
|
+
constructor(maxSize = 100) {
|
|
10
|
+
this.maxSize = maxSize;
|
|
11
|
+
}
|
|
12
|
+
get(key) {
|
|
13
|
+
const value = this.cache.get(key);
|
|
14
|
+
if (value !== undefined) {
|
|
15
|
+
// Move to end (most recently used)
|
|
16
|
+
this.cache.delete(key);
|
|
17
|
+
this.cache.set(key, value);
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
set(key, value) {
|
|
22
|
+
if (this.cache.has(key)) {
|
|
23
|
+
this.cache.delete(key);
|
|
24
|
+
}
|
|
25
|
+
else if (this.cache.size >= this.maxSize) {
|
|
26
|
+
// Remove least recently used (first item)
|
|
27
|
+
const firstKey = this.cache.keys().next().value;
|
|
28
|
+
if (firstKey !== undefined) {
|
|
29
|
+
this.cache.delete(firstKey);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
this.cache.set(key, value);
|
|
33
|
+
}
|
|
34
|
+
delete(key) {
|
|
35
|
+
return this.cache.delete(key);
|
|
36
|
+
}
|
|
37
|
+
clear() {
|
|
38
|
+
this.cache.clear();
|
|
39
|
+
}
|
|
40
|
+
size() {
|
|
41
|
+
return this.cache.size;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
class FSCache {
|
|
45
|
+
cache = new LRUCache(100);
|
|
46
|
+
keyCache = new LRUCache(100);
|
|
47
|
+
/**
|
|
48
|
+
* Generate cache key from file path, mtime, and size
|
|
49
|
+
*/
|
|
50
|
+
async getCacheKey(absPath) {
|
|
51
|
+
const keyStr = `key:${absPath}`;
|
|
52
|
+
let key = this.keyCache.get(keyStr);
|
|
53
|
+
if (!key) {
|
|
54
|
+
try {
|
|
55
|
+
const stats = await fsp.stat(absPath);
|
|
56
|
+
key = {
|
|
57
|
+
absPath,
|
|
58
|
+
mtime: stats.mtime.getTime(),
|
|
59
|
+
size: stats.size,
|
|
60
|
+
};
|
|
61
|
+
this.keyCache.set(keyStr, key);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// File doesn't exist or can't be read
|
|
65
|
+
return { absPath, mtime: 0, size: 0 };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return key;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get cached file data if available and not stale
|
|
72
|
+
*/
|
|
73
|
+
async get(absPath) {
|
|
74
|
+
const key = await this.getCacheKey(absPath);
|
|
75
|
+
const cacheKey = `${key.absPath}|${key.mtime}|${key.size}`;
|
|
76
|
+
const entry = this.cache.get(cacheKey);
|
|
77
|
+
if (!entry) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
// Check if file has been modified since cache
|
|
81
|
+
try {
|
|
82
|
+
const stats = await fsp.stat(absPath);
|
|
83
|
+
if (stats.mtime.getTime() !== key.mtime || stats.size !== key.size) {
|
|
84
|
+
// File changed, remove from cache and update key cache
|
|
85
|
+
this.cache.delete(cacheKey);
|
|
86
|
+
// Update the key cache with new stats
|
|
87
|
+
const newKey = {
|
|
88
|
+
absPath,
|
|
89
|
+
mtime: stats.mtime.getTime(),
|
|
90
|
+
size: stats.size,
|
|
91
|
+
};
|
|
92
|
+
this.keyCache.set(`key:${absPath}`, newKey);
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// File no longer exists
|
|
98
|
+
this.cache.delete(cacheKey);
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
return entry.data;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Cache file data
|
|
105
|
+
*/
|
|
106
|
+
async set(absPath, data) {
|
|
107
|
+
const key = await this.getCacheKey(absPath);
|
|
108
|
+
const cacheKey = `${key.absPath}|${key.mtime}|${key.size}`;
|
|
109
|
+
this.cache.set(cacheKey, {
|
|
110
|
+
data,
|
|
111
|
+
mtime: key.mtime,
|
|
112
|
+
size: key.size,
|
|
113
|
+
timestamp: Date.now(),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Clear all caches
|
|
118
|
+
*/
|
|
119
|
+
clearCaches() {
|
|
120
|
+
this.cache.clear();
|
|
121
|
+
this.keyCache.clear();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get cache statistics
|
|
125
|
+
*/
|
|
126
|
+
getStats() {
|
|
127
|
+
return {
|
|
128
|
+
size: this.cache.size(),
|
|
129
|
+
keySize: this.keyCache.size(),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Singleton instance
|
|
134
|
+
const fsCache = new FSCache();
|
|
135
|
+
export { fsCache, FSCache };
|
|
136
|
+
/**
|
|
137
|
+
* Clear all filesystem caches
|
|
138
|
+
*/
|
|
139
|
+
export function clearCaches() {
|
|
140
|
+
fsCache.clearCaches();
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=fs-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-cache.js","sourceRoot":"","sources":["../../src/cache/fs-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -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":["../../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":["../../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"}
|