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