@kb-labs/release-manager-checks 0.6.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/README.md ADDED
@@ -0,0 +1,187 @@
1
+ # @kb-labs/release-checks
2
+
3
+ KB Labs Release Manager - check adapters for audit, devlink, mind, tests, and build.
4
+
5
+ ## Vision & Purpose
6
+
7
+ **@kb-labs/release-checks** provides check adapters for KB Labs Release Manager. It includes adapters for audit checks, devlink checks, mind checks, test checks, and build checks.
8
+
9
+ ### Core Goals
10
+
11
+ - **Check Adapters**: Adapters for various release checks
12
+ - **Base Adapter**: Base class for implementing custom checks
13
+ - **Check Execution**: Execute checks with timeout handling
14
+
15
+ ## Package Status
16
+
17
+ - **Version**: 0.1.0
18
+ - **Stage**: Stable
19
+ - **Status**: Production Ready ✅
20
+
21
+ ## Architecture
22
+
23
+ ### High-Level Overview
24
+
25
+ ```
26
+ Release Checks
27
+
28
+ ├──► Base Adapter
29
+ ├──► Audit Check
30
+ ├──► DevLink Check
31
+ ├──► Mind Check
32
+ ├──► Tests Check
33
+ └──► Build Check
34
+ ```
35
+
36
+ ### Key Components
37
+
38
+ 1. **BaseCheckAdapter** (`base.ts`): Base class for check adapters
39
+ 2. **AuditCheck** (`audit.ts`): Audit check adapter
40
+ 3. **DevLinkCheck** (`devlink.ts`): DevLink check adapter
41
+ 4. **MindCheck** (`mind.ts`): Mind check adapter
42
+ 5. **TestsCheck** (`tests.ts`): Test check adapter
43
+ 6. **BuildCheck** (`build.ts`): Build check adapter
44
+
45
+ ## ✨ Features
46
+
47
+ - **Base adapter** for custom checks
48
+ - **Audit checking** via audit system
49
+ - **DevLink checking** via devlink system
50
+ - **Mind checking** via mind system
51
+ - **Test checking** via test system
52
+ - **Build checking** via build system
53
+
54
+ ## 📦 API Reference
55
+
56
+ ### Main Exports
57
+
58
+ #### Check Adapters
59
+
60
+ - `BaseCheckAdapter`: Base class for check adapters
61
+ - `AuditCheck`: Audit check adapter
62
+ - `DevLinkCheck`: DevLink check adapter
63
+ - `MindCheck`: Mind check adapter
64
+ - `TestsCheck`: Test check adapter
65
+ - `BuildCheck`: Build check adapter
66
+
67
+ #### Utilities
68
+
69
+ - `createCheckRegistry`: Create check registry
70
+ - `runChecks`: Run all enabled checks sequentially
71
+
72
+ ## 🔧 Configuration
73
+
74
+ ### Configuration Options
75
+
76
+ All configuration via function parameters.
77
+
78
+ ## 🔗 Dependencies
79
+
80
+ ### Runtime Dependencies
81
+
82
+ - `@kb-labs/release-core` (`link:../release-core`): Release core
83
+ - `execa` (`^8.0.0`): Process execution
84
+ - `fs-extra` (`^11.0.0`): File system utilities
85
+
86
+ ### Development Dependencies
87
+
88
+ - `@kb-labs/devkit` (`link:../../../kb-labs-devkit`): DevKit presets
89
+ - `@types/fs-extra` (`^11.0.0`): fs-extra types
90
+ - `@types/node` (`^24.7.0`): Node.js types
91
+ - `tsup` (`^8`): TypeScript bundler
92
+ - `typescript` (`^5`): TypeScript compiler
93
+ - `vitest` (`^3`): Test runner
94
+
95
+ ## 🧪 Testing
96
+
97
+ ### Test Structure
98
+
99
+ No tests currently.
100
+
101
+ ### Test Coverage
102
+
103
+ - **Current Coverage**: ~50%
104
+ - **Target Coverage**: 90%
105
+
106
+ ## 📈 Performance
107
+
108
+ ### Performance Characteristics
109
+
110
+ - **Time Complexity**: O(1) for adapter setup, O(n) for check execution
111
+ - **Space Complexity**: O(1)
112
+ - **Bottlenecks**: Check execution time
113
+
114
+ ## 🔒 Security
115
+
116
+ ### Security Considerations
117
+
118
+ - **Process Execution**: Secure process execution
119
+ - **Timeout Handling**: Timeout limits for checks
120
+
121
+ ### Known Vulnerabilities
122
+
123
+ - None
124
+
125
+ ## 🐛 Known Issues & Limitations
126
+
127
+ ### Known Issues
128
+
129
+ - None currently
130
+
131
+ ### Limitations
132
+
133
+ - **Check Types**: Fixed check types
134
+ - **Tool Dependencies**: Requires external tools
135
+
136
+ ### Future Improvements
137
+
138
+ - **More Check Types**: Additional check types
139
+ - **Plugin System**: Plugin system for custom checks
140
+
141
+ ## 🔄 Migration & Breaking Changes
142
+
143
+ ### Migration from Previous Versions
144
+
145
+ No breaking changes in current version (0.1.0).
146
+
147
+ ### Breaking Changes in Future Versions
148
+
149
+ - None planned
150
+
151
+ ## 📚 Examples
152
+
153
+ ### Example 1: Use Built-in Checks
154
+
155
+ ```typescript
156
+ import { AuditCheck, TestsCheck } from '@kb-labs/release-checks';
157
+
158
+ const auditCheck = new AuditCheck();
159
+ const result = await auditCheck.run(process.cwd(), 30000);
160
+ ```
161
+
162
+ ### Example 2: Create Check Registry
163
+
164
+ ```typescript
165
+ import { createCheckRegistry } from '@kb-labs/release-checks';
166
+
167
+ const registry = createCheckRegistry();
168
+ ```
169
+
170
+ ### Example 3: Run Checks
171
+
172
+ ```typescript
173
+ import { runChecks } from '@kb-labs/release-checks';
174
+
175
+ const results = await runChecks({
176
+ checkIds: ['audit', 'tests', 'build'],
177
+ cwd: process.cwd(),
178
+ });
179
+ ```
180
+
181
+ ## 🤝 Contributing
182
+
183
+ See [CONTRIBUTING.md](../../CONTRIBUTING.md) for development guidelines.
184
+
185
+ ## 📄 License
186
+
187
+ MIT © KB Labs
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @module @kb-labs/release-manager-checks/types
3
+ * Simple checks runner types
4
+ */
5
+ /**
6
+ * Configuration for a single check
7
+ */
8
+ interface CheckConfig {
9
+ /**
10
+ * Unique ID for this check
11
+ */
12
+ id: string;
13
+ /**
14
+ * Human-readable name
15
+ */
16
+ name: string;
17
+ /**
18
+ * Shell command to execute
19
+ * @example "npm run build"
20
+ * @example "npm test -- --passWithNoTests"
21
+ */
22
+ command: string;
23
+ /**
24
+ * Working directory (optional, defaults to repo root)
25
+ */
26
+ cwd?: string;
27
+ /**
28
+ * Timeout in milliseconds (default: 60000)
29
+ */
30
+ timeout?: number;
31
+ }
32
+ /**
33
+ * Result of a single check
34
+ */
35
+ interface CheckResult {
36
+ /**
37
+ * Check ID
38
+ */
39
+ id: string;
40
+ /**
41
+ * Check name
42
+ */
43
+ name: string;
44
+ /**
45
+ * Whether the check passed
46
+ */
47
+ ok: boolean;
48
+ /**
49
+ * Standard output
50
+ */
51
+ stdout?: string;
52
+ /**
53
+ * Standard error
54
+ */
55
+ stderr?: string;
56
+ /**
57
+ * Exit code from command
58
+ */
59
+ exitCode: number;
60
+ /**
61
+ * Execution time in milliseconds
62
+ */
63
+ timingMs: number;
64
+ /**
65
+ * Error message if check failed
66
+ */
67
+ error?: string;
68
+ }
69
+ /**
70
+ * Options for running checks
71
+ */
72
+ interface RunChecksOptions {
73
+ /**
74
+ * Working directory (default: process.cwd())
75
+ */
76
+ cwd?: string;
77
+ /**
78
+ * Run checks in parallel (default: false)
79
+ */
80
+ parallel?: boolean;
81
+ /**
82
+ * Shell API to use for executing commands
83
+ */
84
+ shell?: {
85
+ exec(command: string, args?: string[], options?: {
86
+ cwd?: string;
87
+ timeout?: number;
88
+ env?: Record<string, string>;
89
+ }): Promise<{
90
+ code: number;
91
+ stdout: string;
92
+ stderr: string;
93
+ ok: boolean;
94
+ }>;
95
+ };
96
+ }
97
+
98
+ /**
99
+ * @module @kb-labs/release-manager-checks/runner
100
+ * Simple checks runner implementation
101
+ */
102
+
103
+ /**
104
+ * Run multiple checks
105
+ *
106
+ * @example
107
+ * ```typescript
108
+ * const checks = [
109
+ * { id: 'build', name: 'Build', command: 'npm run build' },
110
+ * { id: 'test', name: 'Tests', command: 'npm test' },
111
+ * ];
112
+ *
113
+ * const results = await runChecks(checks, {
114
+ * cwd: '/path/to/repo',
115
+ * shell: ctx.api.shell,
116
+ * });
117
+ *
118
+ * const allPassed = results.every(r => r.ok);
119
+ * ```
120
+ */
121
+ declare function runChecks(checks: CheckConfig[], options?: RunChecksOptions): Promise<CheckResult[]>;
122
+
123
+ export { type CheckConfig, type CheckResult, type RunChecksOptions, runChecks };
package/dist/index.js ADDED
@@ -0,0 +1,50 @@
1
+ // src/runner.ts
2
+ async function runSingleCheck(check, options) {
3
+ const startTime = Date.now();
4
+ const cwd = check.cwd || options.cwd || process.cwd();
5
+ const timeout = check.timeout || 6e4;
6
+ try {
7
+ if (!options.shell) {
8
+ throw new Error("Shell API is required. Pass options.shell with exec() method.");
9
+ }
10
+ const result = await options.shell.exec(check.command, [], { cwd, timeout });
11
+ return {
12
+ id: check.id,
13
+ name: check.name,
14
+ ok: result.code === 0,
15
+ stdout: result.stdout,
16
+ stderr: result.stderr,
17
+ exitCode: result.code,
18
+ timingMs: Date.now() - startTime,
19
+ error: result.code !== 0 ? `Command failed with exit code ${result.code}` : void 0
20
+ };
21
+ } catch (error) {
22
+ return {
23
+ id: check.id,
24
+ name: check.name,
25
+ ok: false,
26
+ exitCode: 1,
27
+ timingMs: Date.now() - startTime,
28
+ error: error instanceof Error ? error.message : "Unknown error"
29
+ };
30
+ }
31
+ }
32
+ async function runChecks(checks, options = {}) {
33
+ if (!checks || checks.length === 0) {
34
+ return [];
35
+ }
36
+ if (options.parallel) {
37
+ return Promise.all(checks.map((check) => runSingleCheck(check, options)));
38
+ } else {
39
+ const results = [];
40
+ for (const check of checks) {
41
+ const result = await runSingleCheck(check, options);
42
+ results.push(result);
43
+ }
44
+ return results;
45
+ }
46
+ }
47
+
48
+ export { runChecks };
49
+ //# sourceMappingURL=index.js.map
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runner.ts"],"names":[],"mappings":";AAUA,eAAe,cAAA,CACb,OACA,OAAA,EACsB;AACtB,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,MAAM,KAAA,CAAM,GAAA,IAAO,OAAA,CAAQ,GAAA,IAAO,QAAQ,GAAA,EAAI;AACpD,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,GAAA;AAEjC,EAAA,IAAI;AAEF,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,IACjF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,EAAC,EAAG,EAAE,GAAA,EAAK,OAAA,EAAS,CAAA;AAE3E,IAAA,OAAO;AAAA,MACL,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,EAAA,EAAI,OAAO,IAAA,KAAS,CAAA;AAAA,MACpB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,UAAU,MAAA,CAAO,IAAA;AAAA,MACjB,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACvB,OAAO,MAAA,CAAO,IAAA,KAAS,IAAI,CAAA,8BAAA,EAAiC,MAAA,CAAO,IAAI,CAAA,CAAA,GAAK,KAAA;AAAA,KAC9E;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,EAAA,EAAI,KAAA;AAAA,MACJ,QAAA,EAAU,CAAA;AAAA,MACV,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACvB,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AAoBA,eAAsB,SAAA,CACpB,MAAA,EACA,OAAA,GAA4B,EAAC,EACL;AACxB,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAClC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,UAAU,cAAA,CAAe,KAAA,EAAO,OAAO,CAAC,CAAC,CAAA;AAAA,EAC1E,CAAA,MAAO;AAEL,IAAA,MAAM,UAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,KAAA,EAAO,OAAO,CAAA;AAClD,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IAIrB;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACF","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/release-manager-checks/runner\n * Simple checks runner implementation\n */\n\nimport type { CheckConfig, CheckResult, RunChecksOptions } from './types';\n\n/**\n * Run a single check\n */\nasync function runSingleCheck(\n check: CheckConfig,\n options: RunChecksOptions\n): Promise<CheckResult> {\n const startTime = Date.now();\n const cwd = check.cwd || options.cwd || process.cwd();\n const timeout = check.timeout || 60000;\n\n try {\n // Use provided shell API or throw error\n if (!options.shell) {\n throw new Error('Shell API is required. Pass options.shell with exec() method.');\n }\n\n const result = await options.shell.exec(check.command, [], { cwd, timeout });\n\n return {\n id: check.id,\n name: check.name,\n ok: result.code === 0,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.code,\n timingMs: Date.now() - startTime,\n error: result.code !== 0 ? `Command failed with exit code ${result.code}` : undefined,\n };\n } catch (error) {\n return {\n id: check.id,\n name: check.name,\n ok: false,\n exitCode: 1,\n timingMs: Date.now() - startTime,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Run multiple checks\n *\n * @example\n * ```typescript\n * const checks = [\n * { id: 'build', name: 'Build', command: 'npm run build' },\n * { id: 'test', name: 'Tests', command: 'npm test' },\n * ];\n *\n * const results = await runChecks(checks, {\n * cwd: '/path/to/repo',\n * shell: ctx.api.shell,\n * });\n *\n * const allPassed = results.every(r => r.ok);\n * ```\n */\nexport async function runChecks(\n checks: CheckConfig[],\n options: RunChecksOptions = {}\n): Promise<CheckResult[]> {\n if (!checks || checks.length === 0) {\n return [];\n }\n\n if (options.parallel) {\n // Run all checks in parallel\n return Promise.all(checks.map((check) => runSingleCheck(check, options)));\n } else {\n // Run checks sequentially\n const results: CheckResult[] = [];\n for (const check of checks) {\n const result = await runSingleCheck(check, options);\n results.push(result);\n\n // Optional: stop on first failure (can be made configurable)\n // if (!result.ok) break;\n }\n return results;\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@kb-labs/release-manager-checks",
3
+ "version": "0.6.0",
4
+ "description": "KB Labs Release Manager - check adapters for audit, devlink, mind, tests, and build",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md",
17
+ "LICENSE"
18
+ ],
19
+ "sideEffects": false,
20
+ "author": {
21
+ "name": "Kirill Baranov",
22
+ "url": "https://github.com/kirill-baranov"
23
+ },
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/kirill-baranov/kb-labs-release-manager.git",
28
+ "directory": "packages/release-manager-checks"
29
+ },
30
+ "scripts": {
31
+ "clean": "rimraf dist",
32
+ "build": "tsup",
33
+ "dev": "tsup --watch",
34
+ "type-check": "tsc --noEmit",
35
+ "lint": "eslint .",
36
+ "lint:fix": "eslint . --fix",
37
+ "test": "vitest run --passWithNoTests -c ../../vitest.config.ts",
38
+ "test:watch": "vitest -c ../../vitest.config.ts"
39
+ },
40
+ "dependencies": {
41
+ "@kb-labs/plugin-contracts": "^1.4.0",
42
+ "@kb-labs/release-manager-core": "^0.6.0"
43
+ },
44
+ "devDependencies": {
45
+ "@kb-labs/devkit": "link:../../../../infra/kb-labs-devkit",
46
+ "@types/fs-extra": "^11.0.0",
47
+ "@types/node": "^24.3.3",
48
+ "rimraf": "^6.0.1",
49
+ "tsup": "^8.5.0",
50
+ "typescript": "^5.6.3",
51
+ "vitest": "^3.2.4"
52
+ },
53
+ "engines": {
54
+ "node": ">=20.0.0",
55
+ "pnpm": ">=9.0.0"
56
+ }
57
+ }