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