@kb-labs/core-sys 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/fs/__tests__/fs.spec.d.ts +2 -0
  2. package/dist/fs/__tests__/fs.spec.d.ts.map +1 -0
  3. package/dist/fs/__tests__/fs.spec.js +22 -0
  4. package/dist/fs/__tests__/fs.spec.js.map +1 -0
  5. package/dist/fs/fs.d.ts +6 -0
  6. package/dist/fs/fs.d.ts.map +1 -0
  7. package/dist/fs/fs.js +12 -0
  8. package/dist/fs/fs.js.map +1 -0
  9. package/dist/fs/index.d.ts +2 -0
  10. package/dist/fs/index.d.ts.map +1 -0
  11. package/dist/fs/index.js +2 -0
  12. package/dist/fs/index.js.map +1 -0
  13. package/dist/index.d.ts +5 -166
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +4 -347
  16. package/dist/index.js.map +1 -1
  17. package/dist/output/factory.d.ts +20 -0
  18. package/dist/output/factory.d.ts.map +1 -0
  19. package/dist/output/factory.js +101 -0
  20. package/dist/output/factory.js.map +1 -0
  21. package/dist/output/index.d.ts +8 -0
  22. package/dist/output/index.d.ts.map +1 -0
  23. package/dist/output/index.js +7 -0
  24. package/dist/output/index.js.map +1 -0
  25. package/dist/output/output-impl.d.ts +40 -0
  26. package/dist/output/output-impl.d.ts.map +1 -0
  27. package/dist/output/output-impl.js +241 -0
  28. package/dist/output/output-impl.js.map +1 -0
  29. package/dist/output/types.d.ts +122 -0
  30. package/dist/output/types.d.ts.map +1 -0
  31. package/dist/output/types.js +6 -0
  32. package/dist/output/types.js.map +1 -0
  33. package/dist/repo/__tests__/repo.spec.d.ts +2 -0
  34. package/dist/repo/__tests__/repo.spec.d.ts.map +1 -0
  35. package/dist/repo/__tests__/repo.spec.js +25 -0
  36. package/dist/repo/__tests__/repo.spec.js.map +1 -0
  37. package/dist/repo/index.d.ts +2 -0
  38. package/dist/repo/index.d.ts.map +1 -0
  39. package/dist/repo/index.js +2 -0
  40. package/dist/repo/index.js.map +1 -0
  41. package/dist/repo/repo.d.ts +11 -0
  42. package/dist/repo/repo.d.ts.map +1 -0
  43. package/dist/repo/repo.js +36 -0
  44. package/dist/repo/repo.js.map +1 -0
  45. package/dist/types/index.d.ts +2 -0
  46. package/dist/types/index.d.ts.map +1 -0
  47. package/dist/types/index.js +2 -0
  48. package/dist/types/index.js.map +1 -0
  49. package/dist/types/types.d.ts +6 -0
  50. package/dist/types/types.d.ts.map +1 -0
  51. package/dist/types/types.js +2 -0
  52. package/dist/types/types.js.map +1 -0
  53. package/package.json +13 -13
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fs.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.spec.d.ts","sourceRoot":"","sources":["../../../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":["../../../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,6 @@
1
+ /**
2
+ * @module @kb-labs/core/sys/fs
3
+ * Safe path helpers with explicit bases.
4
+ */
5
+ export declare function toAbsolute(baseDir: string, maybeRelative?: string): string;
6
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/fs/fs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1E"}
package/dist/fs/fs.js ADDED
@@ -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":["../../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,2 @@
1
+ export * from './fs';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fs/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './fs';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fs/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,166 +1,5 @@
1
- interface FindNearestConfigOpts {
2
- startDir?: string;
3
- stopDir?: string;
4
- filenames: string[];
5
- }
6
-
7
- /**
8
- * @module @kb-labs/core-sys/output/types
9
- * Unified Output interface for KB Labs platform
10
- */
11
- type VerbosityLevel = "quiet" | "normal" | "verbose" | "debug" | "inspect";
12
- type OutputMode = "tty" | "pipe" | "ci";
13
- type DebugFormat = "human" | "ai";
14
- type OutputLogLevel = "trace" | "debug" | "info" | "warn" | "error" | "fatal";
15
- interface OutputLogRecord {
16
- time: string;
17
- ts: string;
18
- level: OutputLogLevel;
19
- category?: string;
20
- msg: string;
21
- meta?: Record<string, unknown>;
22
- }
23
- interface OutputLogSink {
24
- handle(record: OutputLogRecord): void | Promise<void>;
25
- }
26
- interface OutputLogger {
27
- info(message: string, meta?: Record<string, unknown>): void;
28
- warn(message: string, meta?: Record<string, unknown>): void;
29
- error(message: string, error?: Error, meta?: Record<string, unknown>): void;
30
- debug(message: string, meta?: Record<string, unknown>): void;
31
- child(bindings: Record<string, unknown>): OutputLogger;
32
- }
33
- /**
34
- * Spinner interface for progress indicators
35
- */
36
- interface Spinner {
37
- start(): void;
38
- stop(): void;
39
- update(options: {
40
- text?: string;
41
- }): void;
42
- succeed(message?: string): void;
43
- fail(message?: string): void;
44
- }
45
- /**
46
- * Progress details for progress() method
47
- */
48
- interface ProgressDetails {
49
- current?: number;
50
- total?: number;
51
- message?: string;
52
- [key: string]: unknown;
53
- }
54
- /**
55
- * Error options for error() method
56
- */
57
- interface ErrorOptions {
58
- title?: string;
59
- code?: string;
60
- suggestions?: string[];
61
- docs?: string;
62
- context?: Record<string, unknown>;
63
- report?: boolean;
64
- }
65
- /**
66
- * UI utilities interface
67
- */
68
- interface UIUtilities {
69
- box: (title: string, content?: string[], maxWidth?: number) => string;
70
- sideBox: (options: {
71
- title: string;
72
- sections: Array<{
73
- header?: string;
74
- items: string[];
75
- }>;
76
- footer?: string;
77
- status?: 'success' | 'error' | 'warning' | 'info';
78
- timing?: number;
79
- }) => string;
80
- table: (rows: (string | number)[][], headers?: string[]) => string[];
81
- keyValue: (pairs: Record<string, string | number>, options?: {
82
- padKeys?: boolean;
83
- }) => string[];
84
- spinner: (text: string, jsonMode?: boolean) => Spinner;
85
- colors: {
86
- info: (text: string) => string;
87
- warn: (text: string) => string;
88
- error: (text: string) => string;
89
- success: (text: string) => string;
90
- muted: (text: string) => string;
91
- bold: (text: string) => string;
92
- primary: (text: string) => string;
93
- accent: (text: string) => string;
94
- };
95
- symbols: {
96
- success: string;
97
- error: string;
98
- warning: string;
99
- info: string;
100
- bullet: string;
101
- };
102
- }
103
- /**
104
- * Unified Output interface for plugins and CLI
105
- */
106
- interface Output {
107
- success(message: string, data?: Record<string, unknown>): void;
108
- error(error: Error | string, options?: ErrorOptions): void;
109
- warn(message: string, hint?: string): void;
110
- progress(stage: string, details?: ProgressDetails): void;
111
- spinner(text: string): Spinner;
112
- info(message: string, meta?: Record<string, unknown>): void;
113
- debug(message: string, meta?: Record<string, unknown>): void;
114
- trace(message: string, meta?: Record<string, unknown>): void;
115
- json(data: unknown): void;
116
- write(text: string): void;
117
- ui: UIUtilities;
118
- group(name: string): void;
119
- groupEnd(): void;
120
- readonly mode: OutputMode;
121
- readonly verbosity: VerbosityLevel;
122
- readonly isQuiet: boolean;
123
- readonly isVerbose: boolean;
124
- readonly isDebug: boolean;
125
- readonly isJSON: boolean;
126
- readonly isAIFormat: boolean;
127
- }
128
-
129
- /**
130
- * @module @kb-labs/core-sys/output/factory
131
- * Output factory with auto-detection
132
- */
133
-
134
- interface OutputConfig {
135
- verbosity?: VerbosityLevel;
136
- mode?: OutputMode;
137
- format?: DebugFormat;
138
- json?: boolean;
139
- sinks?: OutputLogSink[];
140
- category?: string;
141
- context?: {
142
- plugin?: string;
143
- command?: string;
144
- trace?: string;
145
- };
146
- }
147
- declare function createOutput(config?: OutputConfig): Output;
148
-
149
- /**
150
- * @module @kb-labs/core/sys/fs
151
- * Safe path helpers with explicit bases.
152
- */
153
- declare function toAbsolute(baseDir: string, maybeRelative?: string): string;
154
-
155
- /**
156
- * @module @kb-labs/core/sys/repo
157
- * Repository root discovery. Pure infrastructure, no domain keys.
158
- */
159
- /**
160
- * Find repository root by searching for markers in priority order.
161
- * First searches entire tree for pnpm-workspace.yaml (monorepo root),
162
- * then .git, then package.json as fallback.
163
- */
164
- declare function findRepoRoot(startDir?: string): Promise<string>;
165
-
166
- export { type DebugFormat, type ErrorOptions, type FindNearestConfigOpts, type Output, type OutputConfig, type OutputLogLevel, type OutputLogRecord, type OutputLogSink, type OutputLogger, type OutputMode, type ProgressDetails, type Spinner, type UIUtilities, type VerbosityLevel, createOutput, findRepoRoot, toAbsolute };
1
+ export * from './types';
2
+ export * from './output';
3
+ export * from './fs';
4
+ export * from './repo';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,MAAM,CAAA;AACpB,cAAc,QAAQ,CAAA"}
package/dist/index.js CHANGED
@@ -1,348 +1,5 @@
1
- import { safeSymbols, safeColors, createSpinner, keyValue, sideBorderBox, box, table } from '@kb-labs/shared-cli-ui';
2
- import { formatTable } from '@kb-labs/shared-cli-ui/table';
3
- import path2 from 'path';
4
- import { promises } from 'fs';
5
-
6
- // src/output/output-impl.ts
7
- var OutputImpl = class {
8
- constructor(config) {
9
- this.config = config;
10
- }
11
- // Getters
12
- get mode() {
13
- return this.config.mode;
14
- }
15
- get verbosity() {
16
- return this.config.verbosity;
17
- }
18
- get isQuiet() {
19
- return this.config.verbosity === "quiet";
20
- }
21
- get isVerbose() {
22
- return ["verbose", "debug", "inspect"].includes(this.config.verbosity);
23
- }
24
- get isDebug() {
25
- return ["debug", "inspect"].includes(this.config.verbosity);
26
- }
27
- get isJSON() {
28
- return this.config.json;
29
- }
30
- get isAIFormat() {
31
- return this.config.format === "ai";
32
- }
33
- get ui() {
34
- return {
35
- box,
36
- sideBox: sideBorderBox,
37
- table: (rows, headers) => {
38
- if (headers && headers.length > 0) {
39
- return formatTable(
40
- headers.map((h) => ({
41
- header: h,
42
- width: void 0,
43
- align: "left"
44
- })),
45
- rows.map((r) => r.map(String)),
46
- { header: true }
47
- );
48
- }
49
- return table(rows.map((r) => r.map(String)));
50
- },
51
- keyValue,
52
- spinner: (text, jsonMode) => createSpinner(text, jsonMode || this.isJSON),
53
- colors: {
54
- info: safeColors.info,
55
- warn: safeColors.warning,
56
- error: safeColors.error,
57
- success: safeColors.success,
58
- muted: safeColors.muted,
59
- bold: safeColors.bold,
60
- primary: safeColors.primary,
61
- accent: safeColors.accent
62
- },
63
- symbols: {
64
- success: safeSymbols.success,
65
- error: safeSymbols.error,
66
- warning: safeSymbols.warning,
67
- info: safeSymbols.info,
68
- bullet: safeSymbols.bullet
69
- }
70
- };
71
- }
72
- // Main methods
73
- success(message, data) {
74
- if (this.isJSON) {
75
- this.json({ ok: true, message, ...data });
76
- return;
77
- }
78
- if (this.isQuiet) {
79
- return;
80
- }
81
- const output = `${safeSymbols.success} ${message}`;
82
- console.log(safeColors.success(output));
83
- this.config.logger.info(message, data);
84
- }
85
- error(error, options) {
86
- const message = error instanceof Error ? error.message : error;
87
- const stack = error instanceof Error ? error.stack : void 0;
88
- if (this.isJSON) {
89
- this.json({
90
- ok: false,
91
- error: {
92
- message,
93
- code: options?.code,
94
- context: options?.context,
95
- suggestions: options?.suggestions
96
- }
97
- });
98
- return;
99
- }
100
- const lines = [];
101
- if (options?.title) {
102
- lines.push(
103
- safeColors.error(`${safeSymbols.error} ${options.title}`)
104
- );
105
- }
106
- lines.push(safeColors.error(message));
107
- if (options?.code) {
108
- lines.push(safeColors.muted(`Code: ${options.code}`));
109
- }
110
- if (options?.context && Object.keys(options.context).length > 0) {
111
- lines.push("");
112
- lines.push(safeColors.bold("Context:"));
113
- lines.push(
114
- ...keyValue(
115
- Object.fromEntries(
116
- Object.entries(options.context).map(([k, v]) => [
117
- k,
118
- String(v)
119
- ])
120
- )
121
- )
122
- );
123
- }
124
- if (options?.suggestions && options.suggestions.length > 0) {
125
- lines.push("");
126
- lines.push(safeColors.bold("Suggestions:"));
127
- options.suggestions.forEach((s) => {
128
- lines.push(` ${safeSymbols.bullet} ${s}`);
129
- });
130
- }
131
- if (options?.docs) {
132
- lines.push("");
133
- lines.push(safeColors.info(`Documentation: ${options.docs}`));
134
- }
135
- const boxed = box("Error", lines);
136
- console.error(boxed);
137
- const errorMeta = {
138
- code: options?.code,
139
- context: options?.context
140
- };
141
- if (stack) {
142
- errorMeta.stack = stack;
143
- }
144
- if (error instanceof Error) {
145
- this.config.logger.error(message, error);
146
- } else {
147
- this.config.logger.error(message, void 0, errorMeta);
148
- }
149
- }
150
- warn(message, hint) {
151
- if (this.isQuiet) {
152
- return;
153
- }
154
- const output = `${safeSymbols.warning} ${message}`;
155
- console.warn(safeColors.warning(output));
156
- if (hint) {
157
- console.warn(safeColors.muted(` ${hint}`));
158
- }
159
- this.config.logger.warn(message, { hint });
160
- }
161
- progress(stage, details) {
162
- if (this.isQuiet) {
163
- return;
164
- }
165
- let output = stage;
166
- if (details?.current !== void 0 && details?.total !== void 0) {
167
- const percent = Math.round(
168
- details.current / details.total * 100
169
- );
170
- output += ` (${details.current}/${details.total}, ${percent}%)`;
171
- }
172
- if (details?.message) {
173
- output += ` - ${details.message}`;
174
- }
175
- console.log(safeColors.info(output));
176
- this.config.logger.info(output, details);
177
- }
178
- spinner(text) {
179
- return createSpinner(text, this.isJSON || this.isQuiet);
180
- }
181
- info(message, meta) {
182
- if (!this.isVerbose) {
183
- return;
184
- }
185
- console.log(message);
186
- this.config.logger.info(message, meta);
187
- }
188
- debug(message, meta) {
189
- if (!this.isDebug) {
190
- return;
191
- }
192
- console.log(safeColors.muted(message));
193
- this.config.logger.debug(message, meta);
194
- }
195
- trace(message, meta) {
196
- if (this.verbosity !== "inspect") {
197
- return;
198
- }
199
- console.log(safeColors.muted(`[TRACE] ${message}`));
200
- this.config.logger.debug(message, { ...meta, trace: true });
201
- }
202
- json(data) {
203
- console.log(JSON.stringify(data, null, 2));
204
- }
205
- write(text) {
206
- if (this.isQuiet) {
207
- return;
208
- }
209
- console.log(text);
210
- }
211
- group(name) {
212
- if (this.isDebug) {
213
- console.group(name);
214
- }
215
- }
216
- groupEnd() {
217
- if (this.isDebug) {
218
- console.groupEnd();
219
- }
220
- }
221
- // Internal method для форматированного вывода через ConsoleSink
222
- // Используется только для UI вывода, не для записи в файлы
223
- logToConsoleSink(level, msg, meta) {
224
- const record = {
225
- time: (/* @__PURE__ */ new Date()).toISOString(),
226
- ts: (/* @__PURE__ */ new Date()).toISOString(),
227
- level,
228
- category: this.config.category,
229
- msg,
230
- meta: { ...this.config.context, ...meta }
231
- };
232
- for (const sink of this.config.sinks) {
233
- try {
234
- void sink.handle(record);
235
- } catch (err) {
236
- console.error("Sink error:", err);
237
- }
238
- }
239
- }
240
- };
241
-
242
- // src/output/factory.ts
243
- var ConsoleLogger = class _ConsoleLogger {
244
- constructor(level, bindings = {}) {
245
- this.level = level;
246
- this.bindings = bindings;
247
- }
248
- canLog(target) {
249
- const rank = {
250
- silent: 0,
251
- error: 1,
252
- warn: 2,
253
- info: 3,
254
- debug: 4,
255
- trace: 5
256
- };
257
- return rank[target] <= rank[this.level];
258
- }
259
- withMeta(meta) {
260
- const merged = { ...this.bindings, ...meta ?? {} };
261
- return Object.keys(merged).length > 0 ? ` ${JSON.stringify(merged)}` : "";
262
- }
263
- info(message, meta) {
264
- if (this.canLog("info")) {
265
- console.log(`[INFO] ${message}${this.withMeta(meta)}`);
266
- }
267
- }
268
- warn(message, meta) {
269
- if (this.canLog("warn")) {
270
- console.warn(`[WARN] ${message}${this.withMeta(meta)}`);
271
- }
272
- }
273
- error(message, error, meta) {
274
- if (this.canLog("error")) {
275
- const payload = error ? { ...meta, error: { message: error.message, stack: error.stack } } : meta;
276
- console.error(`[ERROR] ${message}${this.withMeta(payload)}`);
277
- }
278
- }
279
- debug(message, meta) {
280
- if (this.canLog("debug")) {
281
- console.debug(`[DEBUG] ${message}${this.withMeta(meta)}`);
282
- }
283
- }
284
- child(bindings) {
285
- return new _ConsoleLogger(this.level, { ...this.bindings, ...bindings });
286
- }
287
- };
288
- function createOutput(config = {}) {
289
- const mode = config.mode || detectMode();
290
- const verbosity = config.verbosity || "normal";
291
- const format = config.format || (config.json ? "ai" : "human");
292
- const sinks = config.sinks || [];
293
- const loggerLevel = verbosity === "inspect" ? "trace" : verbosity === "debug" ? "debug" : verbosity === "verbose" ? "info" : verbosity === "quiet" ? "silent" : "info";
294
- const logger = new ConsoleLogger(loggerLevel, {
295
- category: config.category || "output",
296
- ...config.context || {}
297
- });
298
- return new OutputImpl({
299
- mode,
300
- verbosity,
301
- format,
302
- json: config.json || false,
303
- sinks,
304
- // Только ConsoleSink для UI
305
- logger,
306
- // Глобальный logger для записи в файлы
307
- category: config.category,
308
- context: config.context
309
- });
310
- }
311
- function detectMode() {
312
- if (process.env.CI === "true") {
313
- return "ci";
314
- }
315
- if (process.stdout.isTTY) {
316
- return "tty";
317
- }
318
- return "pipe";
319
- }
320
- function toAbsolute(baseDir, maybeRelative) {
321
- if (!maybeRelative) {
322
- return baseDir;
323
- }
324
- return path2.isAbsolute(maybeRelative) ? maybeRelative : path2.join(baseDir, maybeRelative);
325
- }
326
- async function findRepoRoot(startDir = process.cwd()) {
327
- const markersPriority = ["pnpm-workspace.yaml", ".git", "package.json"];
328
- for (const marker of markersPriority) {
329
- let dir = path2.resolve(startDir);
330
- while (true) {
331
- try {
332
- await promises.access(path2.join(dir, marker));
333
- return dir;
334
- } catch {
335
- }
336
- const parent = path2.dirname(dir);
337
- if (parent === dir) {
338
- break;
339
- }
340
- dir = parent;
341
- }
342
- }
343
- return path2.resolve(startDir);
344
- }
345
-
346
- export { createOutput, findRepoRoot, toAbsolute };
347
- //# sourceMappingURL=index.js.map
1
+ export * from './types';
2
+ export * from './output';
3
+ export * from './fs';
4
+ export * from './repo';
348
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/output/output-impl.ts","../src/output/factory.ts","../src/fs/fs.ts","../src/repo/repo.ts"],"names":["path","fsp"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/core-sys/output/output-impl\n * Output implementation\n */\n\nimport type {\n Output,\n OutputMode,\n VerbosityLevel,\n DebugFormat,\n OutputLogSink,\n OutputLogRecord,\n OutputLogger,\n ErrorOptions,\n ProgressDetails,\n UIUtilities,\n Spinner,\n} from \"./types\";\nimport {\n box,\n keyValue,\n table,\n createSpinner,\n safeColors,\n safeSymbols,\n sideBorderBox,\n} from \"@kb-labs/shared-cli-ui\";\nimport { formatTable } from \"@kb-labs/shared-cli-ui/table\";\n\nexport class OutputImpl implements Output {\n constructor(\n private config: {\n mode: OutputMode;\n verbosity: VerbosityLevel;\n format: DebugFormat;\n json: boolean;\n sinks: OutputLogSink[]; // Только для форматированного вывода (ConsoleSink)\n logger: OutputLogger; // Глобальный logger для записи в файлы\n category?: string;\n context?: Record<string, unknown>;\n }\n ) {}\n\n // Getters\n get mode(): OutputMode {\n return this.config.mode;\n }\n\n get verbosity(): VerbosityLevel {\n return this.config.verbosity;\n }\n\n get isQuiet(): boolean {\n return this.config.verbosity === \"quiet\";\n }\n\n get isVerbose(): boolean {\n return [\"verbose\", \"debug\", \"inspect\"].includes(this.config.verbosity);\n }\n\n get isDebug(): boolean {\n return [\"debug\", \"inspect\"].includes(this.config.verbosity);\n }\n\n get isJSON(): boolean {\n return this.config.json;\n }\n\n get isAIFormat(): boolean {\n return this.config.format === \"ai\";\n }\n\n get ui(): UIUtilities {\n return {\n box,\n sideBox: sideBorderBox,\n table: (rows, headers) => {\n if (headers && headers.length > 0) {\n return formatTable(\n headers.map((h) => ({\n header: h,\n width: undefined,\n align: \"left\" as const,\n })),\n rows.map((r) => r.map(String)),\n { header: true }\n );\n }\n return table(rows.map((r) => r.map(String)));\n },\n keyValue,\n spinner: (text: string, jsonMode?: boolean) =>\n createSpinner(text, jsonMode || this.isJSON),\n colors: {\n info: safeColors.info,\n warn: safeColors.warning,\n error: safeColors.error,\n success: safeColors.success,\n muted: safeColors.muted,\n bold: safeColors.bold,\n primary: safeColors.primary,\n accent: safeColors.accent,\n },\n symbols: {\n success: safeSymbols.success,\n error: safeSymbols.error,\n warning: safeSymbols.warning,\n info: safeSymbols.info,\n bullet: safeSymbols.bullet,\n },\n };\n }\n\n // Main methods\n success(message: string, data?: Record<string, unknown>): void {\n if (this.isJSON) {\n this.json({ ok: true, message, ...data });\n return;\n }\n\n if (this.isQuiet) {return;}\n\n const output = `${safeSymbols.success} ${message}`;\n console.log(safeColors.success(output));\n // Использовать глобальный logger для записи в файлы\n this.config.logger.info(message, data);\n }\n\n error(error: Error | string, options?: ErrorOptions): void {\n const message = error instanceof Error ? error.message : error;\n const stack = error instanceof Error ? error.stack : undefined;\n\n if (this.isJSON) {\n this.json({\n ok: false,\n error: {\n message,\n code: options?.code,\n context: options?.context,\n suggestions: options?.suggestions,\n },\n });\n return;\n }\n\n // Красивое форматирование ошибки\n const lines: string[] = [];\n\n if (options?.title) {\n lines.push(\n safeColors.error(`${safeSymbols.error} ${options.title}`)\n );\n }\n\n lines.push(safeColors.error(message));\n\n if (options?.code) {\n lines.push(safeColors.muted(`Code: ${options.code}`));\n }\n\n if (options?.context && Object.keys(options.context).length > 0) {\n lines.push(\"\");\n lines.push(safeColors.bold(\"Context:\"));\n lines.push(\n ...keyValue(\n Object.fromEntries(\n Object.entries(options.context).map(([k, v]) => [\n k,\n String(v),\n ])\n )\n )\n );\n }\n\n if (options?.suggestions && options.suggestions.length > 0) {\n lines.push(\"\");\n lines.push(safeColors.bold(\"Suggestions:\"));\n options.suggestions.forEach((s) => {\n lines.push(` ${safeSymbols.bullet} ${s}`);\n });\n }\n\n if (options?.docs) {\n lines.push(\"\");\n lines.push(safeColors.info(`Documentation: ${options.docs}`));\n }\n\n const boxed = box(\"Error\", lines);\n console.error(boxed);\n\n // Использовать глобальный logger для записи в файлы\n const errorMeta: Record<string, unknown> = {\n code: options?.code,\n context: options?.context,\n };\n if (stack) {\n errorMeta.stack = stack;\n }\n if (error instanceof Error) {\n this.config.logger.error(message, error);\n } else {\n this.config.logger.error(message, undefined, errorMeta);\n }\n }\n\n warn(message: string, hint?: string): void {\n if (this.isQuiet) {return;}\n\n const output = `${safeSymbols.warning} ${message}`;\n console.warn(safeColors.warning(output));\n\n if (hint) {\n console.warn(safeColors.muted(` ${hint}`));\n }\n\n // Использовать глобальный logger для записи в файлы\n this.config.logger.warn(message, { hint });\n }\n\n progress(stage: string, details?: ProgressDetails): void {\n if (this.isQuiet) {return;}\n\n let output = stage;\n if (details?.current !== undefined && details?.total !== undefined) {\n const percent = Math.round(\n (details.current / details.total) * 100\n );\n output += ` (${details.current}/${details.total}, ${percent}%)`;\n }\n\n if (details?.message) {\n output += ` - ${details.message}`;\n }\n\n console.log(safeColors.info(output));\n // Использовать глобальный logger для записи в файлы\n this.config.logger.info(output, details as Record<string, unknown>);\n }\n\n spinner(text: string): Spinner {\n return createSpinner(text, this.isJSON || this.isQuiet);\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n if (!this.isVerbose) {return;}\n\n console.log(message);\n // Использовать глобальный logger для записи в файлы\n this.config.logger.info(message, meta);\n }\n\n debug(message: string, meta?: Record<string, unknown>): void {\n if (!this.isDebug) {return;}\n\n console.log(safeColors.muted(message));\n // Использовать глобальный logger для записи в файлы\n this.config.logger.debug(message, meta);\n }\n\n trace(message: string, meta?: Record<string, unknown>): void {\n if (this.verbosity !== \"inspect\") {return;}\n\n console.log(safeColors.muted(`[TRACE] ${message}`));\n // Использовать глобальный logger для записи в файлы (trace → debug)\n this.config.logger.debug(message, { ...meta, trace: true } as Record<string, unknown>);\n }\n\n json(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n }\n\n write(text: string): void {\n if (this.isQuiet) {return;}\n console.log(text);\n }\n\n group(name: string): void {\n if (this.isDebug) {\n console.group(name);\n }\n }\n\n groupEnd(): void {\n if (this.isDebug) {\n console.groupEnd();\n }\n }\n\n // Internal method для форматированного вывода через ConsoleSink\n // Используется только для UI вывода, не для записи в файлы\n private logToConsoleSink(\n level: OutputLogRecord[\"level\"],\n msg: string,\n meta?: Record<string, unknown>\n ): void {\n const record: OutputLogRecord = {\n time: new Date().toISOString(),\n ts: new Date().toISOString(),\n level,\n category: this.config.category,\n msg,\n meta: { ...this.config.context, ...meta },\n };\n\n // Отправить только в ConsoleSink для форматированного вывода\n // Запись в файлы идет через глобальный logger\n for (const sink of this.config.sinks) {\n try {\n void sink.handle(record);\n } catch (err) {\n // Sink failures should not break execution\n console.error(\"Sink error:\", err);\n }\n }\n }\n}\n","/**\n * @module @kb-labs/core-sys/output/factory\n * Output factory with auto-detection\n */\n\nimport type { Output, OutputMode, VerbosityLevel, DebugFormat, OutputLogSink, OutputLogger } from \"./types\";\nimport { OutputImpl } from \"./output-impl\";\n\ntype LogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\n\nclass ConsoleLogger implements OutputLogger {\n constructor(\n private readonly level: LogLevel,\n private readonly bindings: Record<string, unknown> = {}\n ) {}\n\n private canLog(target: LogLevel): boolean {\n const rank: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5,\n };\n return rank[target] <= rank[this.level];\n }\n\n private withMeta(meta?: Record<string, unknown>): string {\n const merged = { ...this.bindings, ...(meta ?? {}) };\n return Object.keys(merged).length > 0 ? ` ${JSON.stringify(merged)}` : \"\";\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n if (this.canLog(\"info\")) {\n console.log(`[INFO] ${message}${this.withMeta(meta)}`);\n }\n }\n\n warn(message: string, meta?: Record<string, unknown>): void {\n if (this.canLog(\"warn\")) {\n console.warn(`[WARN] ${message}${this.withMeta(meta)}`);\n }\n }\n\n error(message: string, error?: Error, meta?: Record<string, unknown>): void {\n if (this.canLog(\"error\")) {\n const payload = error\n ? { ...meta, error: { message: error.message, stack: error.stack } }\n : meta;\n console.error(`[ERROR] ${message}${this.withMeta(payload)}`);\n }\n }\n\n debug(message: string, meta?: Record<string, unknown>): void {\n if (this.canLog(\"debug\")) {\n console.debug(`[DEBUG] ${message}${this.withMeta(meta)}`);\n }\n }\n\n child(bindings: Record<string, unknown>): OutputLogger {\n return new ConsoleLogger(this.level, { ...this.bindings, ...bindings });\n }\n}\n\nexport interface OutputConfig {\n verbosity?: VerbosityLevel; // Из флагов\n mode?: OutputMode; // Auto-detect или explicit\n format?: DebugFormat; // 'human' | 'ai'\n json?: boolean; // --json флаг\n sinks?: OutputLogSink[]; // Дополнительные sinks\n category?: string; // Категория для логов\n context?: {\n // Контекст команды\n plugin?: string;\n command?: string;\n trace?: string;\n };\n}\n\nexport function createOutput(config: OutputConfig = {}): Output {\n // Auto-detect mode\n const mode: OutputMode = config.mode || detectMode();\n\n // Verbosity из конфига или normal по умолчанию\n const verbosity: VerbosityLevel = config.verbosity || \"normal\";\n\n // Format\n const format: DebugFormat =\n config.format || (config.json ? \"ai\" : \"human\");\n\n // Создать sinks только для форматированного вывода пользователю\n const sinks: OutputLogSink[] = config.sinks || [];\n\n const loggerLevel =\n verbosity === \"inspect\"\n ? \"trace\"\n : verbosity === \"debug\"\n ? \"debug\"\n : verbosity === \"verbose\"\n ? \"info\"\n : verbosity === \"quiet\"\n ? \"silent\"\n : \"info\";\n const logger = new ConsoleLogger(loggerLevel, {\n category: config.category || \"output\",\n ...(config.context || {}),\n });\n\n // Создать Output implementation\n return new OutputImpl({\n mode,\n verbosity,\n format,\n json: config.json || false,\n sinks, // Только ConsoleSink для UI\n logger, // Глобальный logger для записи в файлы\n category: config.category,\n context: config.context,\n });\n}\n\nfunction detectMode(): OutputMode {\n // CI environment\n if (process.env.CI === \"true\") {\n return \"ci\";\n }\n\n // TTY\n if (process.stdout.isTTY) {\n return \"tty\";\n }\n\n // Pipe\n return \"pipe\";\n}\n","/**\n * @module @kb-labs/core/sys/fs\n * Safe path helpers with explicit bases.\n */\n\nimport path from \"node:path\";\n\nexport function toAbsolute(baseDir: string, maybeRelative?: string): string {\n if (!maybeRelative) { return baseDir; }\n return path.isAbsolute(maybeRelative) ? maybeRelative : path.join(baseDir, maybeRelative);\n}","/**\n * @module @kb-labs/core/sys/repo\n * Repository root discovery. Pure infrastructure, no domain keys.\n */\n\nimport path from \"node:path\";\nimport { promises as fsp } from \"node:fs\";\n\n/**\n * Find repository root by searching for markers in priority order.\n * First searches entire tree for pnpm-workspace.yaml (monorepo root),\n * then .git, then package.json as fallback.\n */\nexport async function findRepoRoot(startDir = process.cwd()): Promise<string> {\n const markersPriority = [\"pnpm-workspace.yaml\", \".git\", \"package.json\"];\n\n // Try each marker in priority order, searching entire tree each time\n for (const marker of markersPriority) {\n let dir = path.resolve(startDir);\n while (true) {\n try {\n await fsp.access(path.join(dir, marker));\n return dir; // Found it!\n } catch {\n // Continue searching upward\n }\n\n const parent = path.dirname(dir);\n if (parent === dir) {\n // Reached filesystem root without finding this marker\n break;\n }\n dir = parent;\n }\n }\n\n // Fallback: return current directory if nothing found\n return path.resolve(startDir);\n}"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,MAAM,CAAA;AACpB,cAAc,QAAQ,CAAA"}