@skroyc/librarian 0.1.0 → 0.2.1

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 (76) hide show
  1. package/README.md +4 -16
  2. package/dist/agents/context-schema.d.ts +1 -1
  3. package/dist/agents/context-schema.d.ts.map +1 -1
  4. package/dist/agents/context-schema.js +5 -2
  5. package/dist/agents/context-schema.js.map +1 -1
  6. package/dist/agents/react-agent.d.ts.map +1 -1
  7. package/dist/agents/react-agent.js +63 -170
  8. package/dist/agents/react-agent.js.map +1 -1
  9. package/dist/agents/tool-runtime.d.ts.map +1 -1
  10. package/dist/cli.d.ts +1 -1
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +53 -49
  13. package/dist/cli.js.map +1 -1
  14. package/dist/config.d.ts +1 -1
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +115 -69
  17. package/dist/config.js.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +246 -150
  21. package/dist/index.js.map +1 -1
  22. package/dist/tools/file-finding.tool.d.ts +1 -1
  23. package/dist/tools/file-finding.tool.d.ts.map +1 -1
  24. package/dist/tools/file-finding.tool.js +70 -130
  25. package/dist/tools/file-finding.tool.js.map +1 -1
  26. package/dist/tools/file-listing.tool.d.ts +7 -1
  27. package/dist/tools/file-listing.tool.d.ts.map +1 -1
  28. package/dist/tools/file-listing.tool.js +96 -80
  29. package/dist/tools/file-listing.tool.js.map +1 -1
  30. package/dist/tools/file-reading.tool.d.ts +4 -1
  31. package/dist/tools/file-reading.tool.d.ts.map +1 -1
  32. package/dist/tools/file-reading.tool.js +107 -45
  33. package/dist/tools/file-reading.tool.js.map +1 -1
  34. package/dist/tools/grep-content.tool.d.ts +13 -1
  35. package/dist/tools/grep-content.tool.d.ts.map +1 -1
  36. package/dist/tools/grep-content.tool.js +186 -144
  37. package/dist/tools/grep-content.tool.js.map +1 -1
  38. package/dist/utils/error-utils.d.ts +9 -0
  39. package/dist/utils/error-utils.d.ts.map +1 -0
  40. package/dist/utils/error-utils.js +61 -0
  41. package/dist/utils/error-utils.js.map +1 -0
  42. package/dist/utils/file-utils.d.ts +1 -0
  43. package/dist/utils/file-utils.d.ts.map +1 -1
  44. package/dist/utils/file-utils.js +81 -9
  45. package/dist/utils/file-utils.js.map +1 -1
  46. package/dist/utils/format-utils.d.ts +25 -0
  47. package/dist/utils/format-utils.d.ts.map +1 -0
  48. package/dist/utils/format-utils.js +111 -0
  49. package/dist/utils/format-utils.js.map +1 -0
  50. package/dist/utils/gitignore-service.d.ts +10 -0
  51. package/dist/utils/gitignore-service.d.ts.map +1 -0
  52. package/dist/utils/gitignore-service.js +91 -0
  53. package/dist/utils/gitignore-service.js.map +1 -0
  54. package/dist/utils/logger.d.ts +2 -2
  55. package/dist/utils/logger.d.ts.map +1 -1
  56. package/dist/utils/logger.js +35 -34
  57. package/dist/utils/logger.js.map +1 -1
  58. package/dist/utils/path-utils.js +3 -3
  59. package/dist/utils/path-utils.js.map +1 -1
  60. package/package.json +1 -1
  61. package/src/agents/context-schema.ts +5 -2
  62. package/src/agents/react-agent.ts +694 -784
  63. package/src/agents/tool-runtime.ts +4 -4
  64. package/src/cli.ts +95 -57
  65. package/src/config.ts +192 -90
  66. package/src/index.ts +402 -180
  67. package/src/tools/file-finding.tool.ts +198 -310
  68. package/src/tools/file-listing.tool.ts +245 -202
  69. package/src/tools/file-reading.tool.ts +225 -138
  70. package/src/tools/grep-content.tool.ts +387 -307
  71. package/src/utils/error-utils.ts +95 -0
  72. package/src/utils/file-utils.ts +104 -19
  73. package/src/utils/format-utils.ts +190 -0
  74. package/src/utils/gitignore-service.ts +123 -0
  75. package/src/utils/logger.ts +112 -77
  76. package/src/utils/path-utils.ts +3 -3
@@ -1,21 +1,62 @@
1
- import path from 'node:path';
1
+ import path from "node:path";
2
2
  export async function isTextFile(filePath) {
3
3
  const textExtensions = new Set([
4
- '.txt', '.js', '.ts', '.jsx', '.tsx', '.json', '.yaml', '.yml', '.md',
5
- '.html', '.htm', '.css', '.scss', '.sass', '.less', '.py', '.rb', '.java',
6
- '.cpp', '.c', '.h', '.hpp', '.go', '.rs', '.php', '.sql', '.xml', '.csv',
7
- '.toml', '.lock', '.sh', '.bash', '.zsh', '.env', '.dockerfile', 'dockerfile',
8
- '.gitignore', '.npmrc', '.prettierrc', '.eslintrc', '.editorconfig', '.jsonc'
4
+ ".txt",
5
+ ".js",
6
+ ".ts",
7
+ ".jsx",
8
+ ".tsx",
9
+ ".json",
10
+ ".yaml",
11
+ ".yml",
12
+ ".md",
13
+ ".html",
14
+ ".htm",
15
+ ".css",
16
+ ".scss",
17
+ ".sass",
18
+ ".less",
19
+ ".py",
20
+ ".rb",
21
+ ".java",
22
+ ".cpp",
23
+ ".c",
24
+ ".h",
25
+ ".hpp",
26
+ ".go",
27
+ ".rs",
28
+ ".php",
29
+ ".sql",
30
+ ".xml",
31
+ ".csv",
32
+ ".toml",
33
+ ".lock",
34
+ ".sh",
35
+ ".bash",
36
+ ".zsh",
37
+ ".env",
38
+ ".dockerfile",
39
+ "dockerfile",
40
+ ".gitignore",
41
+ ".npmrc",
42
+ ".prettierrc",
43
+ ".eslintrc",
44
+ ".editorconfig",
45
+ ".jsonc",
9
46
  ]);
10
47
  const ext = path.extname(filePath).toLowerCase();
11
48
  if (textExtensions.has(ext)) {
12
49
  return true;
13
50
  }
14
51
  try {
15
- const buffer = await Bun.file(filePath).arrayBuffer();
52
+ const file = Bun.file(filePath);
53
+ if (file.size === 0) {
54
+ return true;
55
+ }
56
+ const buffer = await file.slice(0, 512).arrayBuffer();
16
57
  const uint8Array = new Uint8Array(buffer);
17
- for (let i = 0; i < Math.min(512, uint8Array.length); i++) {
18
- if (uint8Array[i] === 0) {
58
+ for (const byte of uint8Array) {
59
+ if (byte === 0) {
19
60
  return false;
20
61
  }
21
62
  }
@@ -25,4 +66,35 @@ export async function isTextFile(filePath) {
25
66
  return false;
26
67
  }
27
68
  }
69
+ export async function getFileLineCount(filePath) {
70
+ try {
71
+ const file = Bun.file(filePath);
72
+ if (file.size === 0) {
73
+ return 0;
74
+ }
75
+ const stream = file.stream();
76
+ const reader = stream.getReader();
77
+ let count = 0;
78
+ let lastByte = -1;
79
+ while (true) {
80
+ const { done, value } = await reader.read();
81
+ if (done) {
82
+ break;
83
+ }
84
+ for (const byte of value) {
85
+ lastByte = byte;
86
+ if (lastByte === 10) {
87
+ count++;
88
+ }
89
+ }
90
+ }
91
+ if (lastByte !== 10 && lastByte !== -1) {
92
+ count++;
93
+ }
94
+ return count;
95
+ }
96
+ catch {
97
+ return 0;
98
+ }
99
+ }
28
100
  //# sourceMappingURL=file-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAKA,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;QAC7B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK;QACrE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO;QACzE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;QACxE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY;QAC7E,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ;KAC9E,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAGA,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1D,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface FileSystemEntry {
2
+ name: string;
3
+ path: string;
4
+ isDirectory: boolean;
5
+ size?: number;
6
+ lineCount?: number;
7
+ depth?: number;
8
+ }
9
+ export interface SearchMatch {
10
+ line: number;
11
+ column: number;
12
+ text: string;
13
+ context?: {
14
+ before: string[];
15
+ after: string[];
16
+ };
17
+ }
18
+ export declare function withLineNumbers(lines: string[], startLine?: number): string;
19
+ export declare function formatLinesWithRange(lines: string[], viewRange?: [number, number]): string;
20
+ export declare function formatDirectoryTree(entries: FileSystemEntry[]): string;
21
+ export declare function formatSearchResults(results: {
22
+ path: string;
23
+ matches: SearchMatch[];
24
+ }[]): string;
25
+ //# sourceMappingURL=format-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-utils.d.ts","sourceRoot":"","sources":["../../src/utils/format-utils.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;CACH;AAQD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,SAAI,GAAG,MAAM,CAiBtE;AAKD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,MAAM,CAeR;AAmBD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAkBtE;AAKD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAE,EAAE,GAClD,MAAM,CA4ER"}
@@ -0,0 +1,111 @@
1
+ const MIN_LINE_NUM_WIDTH = 3;
2
+ const FILE_SEPARATOR = "--";
3
+ export function withLineNumbers(lines, startLine = 1) {
4
+ if (!lines || lines.length === 0) {
5
+ return "";
6
+ }
7
+ const maxLineNumWidth = Math.max(MIN_LINE_NUM_WIDTH, String(startLine + lines.length - 1).length);
8
+ return lines
9
+ .map((line, index) => {
10
+ const lineNum = startLine + index;
11
+ const paddedNum = String(lineNum).padStart(maxLineNumWidth);
12
+ return `${paddedNum}→${line}`;
13
+ })
14
+ .join("\n");
15
+ }
16
+ export function formatLinesWithRange(lines, viewRange) {
17
+ if (!lines || lines.length === 0) {
18
+ return "[File is empty]";
19
+ }
20
+ if (!viewRange) {
21
+ return withLineNumbers(lines);
22
+ }
23
+ const [start, end] = viewRange;
24
+ const startIndex = Math.max(0, start - 1);
25
+ const endIndex = end === -1 ? lines.length : Math.min(lines.length, end);
26
+ const selectedLines = lines.slice(startIndex, endIndex);
27
+ return withLineNumbers(selectedLines, start);
28
+ }
29
+ function _formatContentWithRange(content, viewRange) {
30
+ if (!content || content.trim() === "") {
31
+ return "[File is empty]";
32
+ }
33
+ return formatLinesWithRange(content.split("\n"), viewRange);
34
+ }
35
+ export function formatDirectoryTree(entries) {
36
+ let output = "";
37
+ for (const entry of entries) {
38
+ const indent = " ".repeat(entry.depth || 0);
39
+ let line = `${indent}${entry.isDirectory ? `${entry.name}/` : entry.name}`;
40
+ if (!entry.isDirectory && entry.lineCount !== undefined) {
41
+ line += ` (${entry.lineCount} lines)`;
42
+ }
43
+ else if (!entry.isDirectory && entry.size !== undefined) {
44
+ line += ` (${entry.size} bytes)`;
45
+ }
46
+ output += `${line}\n`;
47
+ }
48
+ return output.trimEnd();
49
+ }
50
+ export function formatSearchResults(results) {
51
+ let output = "";
52
+ const totalMatches = results.reduce((sum, r) => sum + r.matches.length, 0);
53
+ output += `Found ${totalMatches} matches in ${results.length} files:\n\n`;
54
+ let fileIndex = 0;
55
+ for (const result of results) {
56
+ output += `${result.path}\n`;
57
+ const sortedMatches = [...result.matches].sort((a, b) => a.line - b.line);
58
+ const displayedLines = new Set();
59
+ let lastPrintedLine = -1;
60
+ let maxLineNum = 0;
61
+ for (const match of sortedMatches) {
62
+ const lastContextLine = match.line + (match.context?.after.length || 0);
63
+ maxLineNum = Math.max(maxLineNum, lastContextLine);
64
+ }
65
+ const maxLineNumWidth = Math.max(MIN_LINE_NUM_WIDTH, String(maxLineNum).length);
66
+ for (const match of sortedMatches) {
67
+ if (match.context?.before) {
68
+ const startLine = Math.max(1, match.line - match.context.before.length);
69
+ for (let j = 0; j < match.context.before.length; j++) {
70
+ const lineNum = startLine + j;
71
+ if (!displayedLines.has(lineNum)) {
72
+ if (lastPrintedLine !== -1 && lineNum > lastPrintedLine + 1) {
73
+ output += `${" ".repeat(maxLineNumWidth)}⁝\n`;
74
+ }
75
+ output += `${String(lineNum).padStart(maxLineNumWidth)}→${match.context.before[j]}\n`;
76
+ displayedLines.add(lineNum);
77
+ lastPrintedLine = lineNum;
78
+ }
79
+ }
80
+ }
81
+ if (!displayedLines.has(match.line)) {
82
+ if (lastPrintedLine !== -1 && match.line > lastPrintedLine + 1) {
83
+ output += `${" ".repeat(maxLineNumWidth)}⁝\n`;
84
+ }
85
+ output += `${String(match.line).padStart(maxLineNumWidth)}→${match.text}\n`;
86
+ displayedLines.add(match.line);
87
+ lastPrintedLine = match.line;
88
+ }
89
+ if (match.context?.after) {
90
+ const startLine = match.line + 1;
91
+ for (let j = 0; j < match.context.after.length; j++) {
92
+ const lineNum = startLine + j;
93
+ if (!displayedLines.has(lineNum)) {
94
+ if (lastPrintedLine !== -1 && lineNum > lastPrintedLine + 1) {
95
+ output += `${" ".repeat(maxLineNumWidth)}⁝\n`;
96
+ }
97
+ output += `${String(lineNum).padStart(maxLineNumWidth)}→${match.context.after[j]}\n`;
98
+ displayedLines.add(lineNum);
99
+ lastPrintedLine = lineNum;
100
+ }
101
+ }
102
+ }
103
+ }
104
+ if (fileIndex < results.length - 1) {
105
+ output += `${FILE_SEPARATOR}\n`;
106
+ }
107
+ fileIndex++;
108
+ }
109
+ return output;
110
+ }
111
+ //# sourceMappingURL=format-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-utils.js","sourceRoot":"","sources":["../../src/utils/format-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare class GitIgnoreService {
2
+ private readonly rootDir;
3
+ private patterns;
4
+ private initialized;
5
+ constructor(rootDir: string);
6
+ initialize(): Promise<void>;
7
+ shouldIgnore(filePath: string, isDirectory?: boolean): boolean;
8
+ private parseGitIgnore;
9
+ }
10
+ //# sourceMappingURL=gitignore-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore-service.d.ts","sourceRoot":"","sources":["../../src/utils/gitignore-service.ts"],"names":[],"mappings":"AAkBA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,MAAM;IAIrB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAcjC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,UAAQ,GAAG,OAAO;IAwC5D,OAAO,CAAC,cAAc;CAyCvB"}
@@ -0,0 +1,91 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { Glob } from "bun";
4
+ const LINE_ENDING_REGEX = /\r?\n/;
5
+ export class GitIgnoreService {
6
+ rootDir;
7
+ patterns = [];
8
+ initialized = false;
9
+ constructor(rootDir) {
10
+ this.rootDir = path.resolve(rootDir);
11
+ }
12
+ async initialize() {
13
+ if (this.initialized) {
14
+ return;
15
+ }
16
+ try {
17
+ const gitignorePath = path.join(this.rootDir, ".gitignore");
18
+ const content = await readFile(gitignorePath, "utf-8");
19
+ this.patterns = this.parseGitIgnore(content);
20
+ }
21
+ catch {
22
+ this.patterns = [];
23
+ }
24
+ this.initialized = true;
25
+ }
26
+ shouldIgnore(filePath, isDirectory = false) {
27
+ if (!this.initialized) {
28
+ return false;
29
+ }
30
+ const relativePath = path.relative(this.rootDir, filePath);
31
+ if (relativePath === "" || relativePath === ".") {
32
+ return false;
33
+ }
34
+ let ignored = false;
35
+ let hasNegationMatch = false;
36
+ for (const p of this.patterns) {
37
+ if (p.glob.match(relativePath)) {
38
+ if (p.isDirectoryOnly &&
39
+ !isDirectory &&
40
+ !relativePath.includes("/") &&
41
+ p.glob.match(relativePath)) {
42
+ continue;
43
+ }
44
+ if (p.isNegation) {
45
+ ignored = false;
46
+ hasNegationMatch = true;
47
+ }
48
+ else if (!hasNegationMatch) {
49
+ ignored = true;
50
+ }
51
+ }
52
+ }
53
+ return ignored;
54
+ }
55
+ parseGitIgnore(content) {
56
+ const lines = content.split(LINE_ENDING_REGEX);
57
+ const patterns = [];
58
+ for (let line of lines) {
59
+ line = line.trim();
60
+ if (!line || line.startsWith("#")) {
61
+ continue;
62
+ }
63
+ let isNegation = false;
64
+ if (line.startsWith("!")) {
65
+ isNegation = true;
66
+ line = line.slice(1).trim();
67
+ }
68
+ const isDirectoryOnly = line.endsWith("/");
69
+ let cleanPattern = isDirectoryOnly ? line.slice(0, -1) : line;
70
+ if (cleanPattern.startsWith("/")) {
71
+ cleanPattern = cleanPattern.slice(1);
72
+ }
73
+ else if (!cleanPattern.includes("/")) {
74
+ cleanPattern = `**/${cleanPattern}`;
75
+ }
76
+ const finalPattern = `${cleanPattern}{,/**}`;
77
+ try {
78
+ patterns.push({
79
+ pattern: line,
80
+ isNegation,
81
+ isDirectoryOnly,
82
+ glob: new Glob(finalPattern),
83
+ });
84
+ }
85
+ catch {
86
+ }
87
+ }
88
+ return patterns;
89
+ }
90
+ }
91
+ //# sourceMappingURL=gitignore-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore-service.js","sourceRoot":"","sources":["../../src/utils/gitignore-service.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- export type LogLevel = 'INFO' | 'DEBUG' | 'WARN' | 'ERROR';
2
- export type LogComponent = 'CLI' | 'CONFIG' | 'LIBRARIAN' | 'AGENT' | 'TOOL' | 'LLM' | 'GIT' | 'PATH' | 'LOGGER' | 'TIMING';
1
+ export type LogLevel = "INFO" | "DEBUG" | "WARN" | "ERROR";
2
+ export type LogComponent = "CLI" | "CONFIG" | "LIBRARIAN" | "AGENT" | "TOOL" | "LLM" | "GIT" | "PATH" | "LOGGER" | "TIMING";
3
3
  interface LogMetadata {
4
4
  [key: string]: unknown;
5
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAC3D,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5H,UAAU,WAAW;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAOD,cAAM,MAAM;IACV,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2C;IAE5E,OAAO;IAMP,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;YAQtB,iBAAiB;IAgD/B,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,cAAc;IAerB,OAAO,CAAC,QAAQ;IAajB,OAAO,CAAC,GAAG;IAYX,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI;IAO5E,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI;IAS7E,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI;IAO5E,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI;IAoB5F,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAetC,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAqB9E,KAAK,IAAI,IAAI;CASf;AAGD,eAAO,MAAM,MAAM,QAAuB,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAC3D,MAAM,MAAM,YAAY,GACpB,KAAK,GACL,QAAQ,GACR,WAAW,GACX,OAAO,GACP,MAAM,GACN,KAAK,GACL,KAAK,GACL,MAAM,GACN,QAAQ,GACR,QAAQ,CAAC;AAEb,UAAU,WAAW;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAOD,cAAM,MAAM;IACV,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2C;IAE5E,OAAO;IAMP,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;YAQtB,iBAAiB;IA+C/B,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,GAAG;IAiBX,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI;IAO5E,KAAK,CACH,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,WAAW,GACrB,IAAI;IASP,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI;IAO5E,KAAK,CACH,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,KAAK,EACb,QAAQ,CAAC,EAAE,WAAW,GACrB,IAAI;IAoBP,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAetC,SAAS,CACP,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI;IAqBP,KAAK,IAAI,IAAI;CASd;AAGD,eAAO,MAAM,MAAM,QAAuB,CAAC"}
@@ -1,6 +1,6 @@
1
- import { mkdir } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import os from 'node:os';
1
+ import { mkdir } from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
4
  class Logger {
5
5
  static instance;
6
6
  writer = null;
@@ -24,17 +24,17 @@ class Logger {
24
24
  const now = new Date();
25
25
  const isoString = now.toISOString();
26
26
  if (!isoString) {
27
- throw new Error('Failed to generate timestamp');
27
+ throw new Error("Failed to generate timestamp");
28
28
  }
29
29
  const year = now.getFullYear();
30
- const month = String(now.getMonth() + 1).padStart(2, '0');
31
- const day = String(now.getDate()).padStart(2, '0');
32
- const hours = String(now.getHours()).padStart(2, '0');
33
- const minutes = String(now.getMinutes()).padStart(2, '0');
34
- const seconds = String(now.getSeconds()).padStart(2, '0');
35
- const ms = String(now.getMilliseconds()).padStart(3, '0');
30
+ const month = String(now.getMonth() + 1).padStart(2, "0");
31
+ const day = String(now.getDate()).padStart(2, "0");
32
+ const hours = String(now.getHours()).padStart(2, "0");
33
+ const minutes = String(now.getMinutes()).padStart(2, "0");
34
+ const seconds = String(now.getSeconds()).padStart(2, "0");
35
+ const ms = String(now.getMilliseconds()).padStart(3, "0");
36
36
  const timestamp = `${year}-${month}-${day}_${hours}-${minutes}-${seconds}_${ms}`;
37
- const logDir = path.join(os.homedir(), '.config', 'librarian', 'logs');
37
+ const logDir = path.join(os.homedir(), ".config", "librarian", "logs");
38
38
  if (!(await Bun.file(logDir).exists())) {
39
39
  await mkdir(logDir, { recursive: true });
40
40
  }
@@ -42,7 +42,7 @@ class Logger {
42
42
  const logPath = path.join(logDir, logFilename);
43
43
  const logFile = Bun.file(logPath);
44
44
  this.writer = logFile.writer();
45
- this.info('LOGGER', `Logging initialized: ${logPath}`);
45
+ this.info("LOGGER", `Logging initialized: ${logPath}`);
46
46
  }
47
47
  catch {
48
48
  }
@@ -50,12 +50,12 @@ class Logger {
50
50
  formatTimestamp() {
51
51
  const now = new Date();
52
52
  const year = now.getFullYear();
53
- const month = String(now.getMonth() + 1).padStart(2, '0');
54
- const day = String(now.getDate()).padStart(2, '0');
55
- const hours = String(now.getHours()).padStart(2, '0');
56
- const minutes = String(now.getMinutes()).padStart(2, '0');
57
- const seconds = String(now.getSeconds()).padStart(2, '0');
58
- const ms = String(now.getMilliseconds()).padStart(3, '0');
53
+ const month = String(now.getMonth() + 1).padStart(2, "0");
54
+ const day = String(now.getDate()).padStart(2, "0");
55
+ const hours = String(now.getHours()).padStart(2, "0");
56
+ const minutes = String(now.getMinutes()).padStart(2, "0");
57
+ const seconds = String(now.getSeconds()).padStart(2, "0");
58
+ const ms = String(now.getMilliseconds()).padStart(3, "0");
59
59
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${ms}`;
60
60
  }
61
61
  redactMetadata(metadata) {
@@ -67,20 +67,21 @@ class Logger {
67
67
  }
68
68
  getRedactedValue(key, value) {
69
69
  const lowerKey = key.toLowerCase();
70
- if (['apiKey', 'token', 'secret', 'password'].includes(lowerKey)) {
71
- return '[REDACTED]';
70
+ if (["apiKey", "token", "secret", "password"].includes(lowerKey)) {
71
+ return "[REDACTED]";
72
72
  }
73
- if ((key === 'query' || key === 'content') && typeof value === 'string') {
73
+ if ((key === "query" || key === "content") && typeof value === "string") {
74
74
  return value.length;
75
75
  }
76
- if ((key === 'repoUrl' || key === 'baseURL') && typeof value === 'string') {
76
+ if ((key === "repoUrl" || key === "baseURL") && typeof value === "string") {
77
77
  return this.redactUrl(value);
78
78
  }
79
- if (key === 'workingDir' && typeof value === 'string') {
80
- return value.replace(os.homedir(), '~');
79
+ if (key === "workingDir" && typeof value === "string") {
80
+ return value.replace(os.homedir(), "~");
81
81
  }
82
- if (typeof value === 'string' && (value.includes(os.homedir()) || value.includes('/home/'))) {
83
- return value.replace(os.homedir(), '~');
82
+ if (typeof value === "string" &&
83
+ (value.includes(os.homedir()) || value.includes("/home/"))) {
84
+ return value.replace(os.homedir(), "~");
84
85
  }
85
86
  return value;
86
87
  }
@@ -90,7 +91,7 @@ class Logger {
90
91
  return url.hostname;
91
92
  }
92
93
  catch {
93
- return '[INVALID_URL]';
94
+ return "[INVALID_URL]";
94
95
  }
95
96
  }
96
97
  formatLogEntry(level, component, message, metadata) {
@@ -120,15 +121,15 @@ class Logger {
120
121
  }
121
122
  }
122
123
  info(component, message, metadata) {
123
- this.log('INFO', component, message, metadata);
124
+ this.log("INFO", component, message, metadata);
124
125
  }
125
126
  debug(component, message, metadata) {
126
127
  if (this.debugMode) {
127
- this.log('DEBUG', component, message, metadata);
128
+ this.log("DEBUG", component, message, metadata);
128
129
  }
129
130
  }
130
131
  warn(component, message, metadata) {
131
- this.log('WARN', component, message, metadata);
132
+ this.log("WARN", component, message, metadata);
132
133
  }
133
134
  error(component, message, error, metadata) {
134
135
  const errorMetadata = metadata ? { ...metadata } : {};
@@ -139,15 +140,15 @@ class Logger {
139
140
  errorMetadata.stack = error.stack;
140
141
  }
141
142
  }
142
- this.log('ERROR', component, message, errorMetadata);
143
+ this.log("ERROR", component, message, errorMetadata);
143
144
  }
144
145
  timingStart(operation) {
145
146
  const operationId = `${operation}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
146
147
  this.timingOperations.set(operationId, {
147
148
  operation,
148
- startTime: performance.now()
149
+ startTime: performance.now(),
149
150
  });
150
- this.debug('TIMING', `Started: ${operation}`);
151
+ this.debug("TIMING", `Started: ${operation}`);
151
152
  return operationId;
152
153
  }
153
154
  timingEnd(operationId, component, message) {
@@ -159,7 +160,7 @@ class Logger {
159
160
  const logMessage = message || `Completed: ${timing.operation}`;
160
161
  this.info(component, logMessage, { duration: `${durationMs}ms` });
161
162
  if (this.debugMode) {
162
- this.debug('TIMING', `Ended: ${timing.operation}`, { durationMs });
163
+ this.debug("TIMING", `Ended: ${timing.operation}`, { durationMs });
163
164
  }
164
165
  }
165
166
  }
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import path from 'node:path';
2
- import os from 'node:os';
1
+ import os from "node:os";
2
+ import path from "node:path";
3
3
  export function expandTilde(filePath) {
4
- if (filePath.startsWith('~/')) {
4
+ if (filePath.startsWith("~/")) {
5
5
  return path.join(os.homedir(), filePath.slice(2));
6
6
  }
7
7
  return filePath;
@@ -1 +1 @@
1
- {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/utils/path-utils.ts"],"names":[],"mappings":"AAKA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAKzB,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../src/utils/path-utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAK7B,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skroyc/librarian",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Librarian CLI - Technology Research Agent",
5
5
  "main": "./dist/index.js",
6
6
  "bin": {
@@ -1,4 +1,4 @@
1
- import { z } from 'zod';
1
+ import { z } from "zod";
2
2
 
3
3
  /**
4
4
  * Context Schema for Agent Runtime
@@ -10,7 +10,10 @@ export const contextSchema = z.object({
10
10
  /** The absolute path to sandbox directory where all file operations should be confined */
11
11
  workingDir: z.string().describe("The absolute path to sandbox directory"),
12
12
  /** Optional environment identifier (e.g., 'development', 'production') */
13
- environment: z.string().optional().describe("Optional environment identifier"),
13
+ environment: z
14
+ .string()
15
+ .optional()
16
+ .describe("Optional environment identifier"),
14
17
  /** The technology group name (e.g., 'default', 'langchain') */
15
18
  group: z.string().describe("The technology group name"),
16
19
  /** The technology/repo name (e.g., 'react', 'openai') */