@side-quest/kit 0.0.0 → 0.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 (127) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +54 -352
  3. package/dist/cli.d.ts +14 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +156 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/index.d.ts +8 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +8 -2509
  10. package/dist/index.js.map +1 -0
  11. package/dist/lib/ast/index.d.ts +11 -0
  12. package/dist/lib/ast/index.d.ts.map +1 -0
  13. package/dist/lib/ast/index.js +15 -0
  14. package/dist/lib/ast/index.js.map +1 -0
  15. package/dist/lib/ast/languages.d.ts +55 -0
  16. package/dist/lib/ast/languages.d.ts.map +1 -0
  17. package/dist/lib/ast/languages.js +146 -0
  18. package/dist/lib/ast/languages.js.map +1 -0
  19. package/dist/lib/ast/pattern.d.ts +84 -0
  20. package/dist/lib/ast/pattern.d.ts.map +1 -0
  21. package/dist/lib/ast/pattern.js +268 -0
  22. package/dist/lib/ast/pattern.js.map +1 -0
  23. package/dist/lib/ast/searcher.d.ts +89 -0
  24. package/dist/lib/ast/searcher.d.ts.map +1 -0
  25. package/dist/lib/ast/searcher.js +316 -0
  26. package/dist/lib/ast/searcher.js.map +1 -0
  27. package/dist/lib/ast/types.d.ts +93 -0
  28. package/dist/lib/ast/types.d.ts.map +1 -0
  29. package/dist/lib/ast/types.js +23 -0
  30. package/dist/lib/ast/types.js.map +1 -0
  31. package/dist/lib/commands/callers.d.ts +20 -0
  32. package/dist/lib/commands/callers.d.ts.map +1 -0
  33. package/dist/lib/commands/callers.js +162 -0
  34. package/dist/lib/commands/callers.js.map +1 -0
  35. package/dist/lib/commands/find.d.ts +15 -0
  36. package/dist/lib/commands/find.d.ts.map +1 -0
  37. package/dist/lib/commands/find.js +113 -0
  38. package/dist/lib/commands/find.js.map +1 -0
  39. package/dist/lib/commands/overview.d.ts +6 -0
  40. package/dist/lib/commands/overview.d.ts.map +1 -0
  41. package/dist/lib/commands/overview.js +52 -0
  42. package/dist/lib/commands/overview.js.map +1 -0
  43. package/dist/lib/commands/prime.d.ts +16 -0
  44. package/dist/lib/commands/prime.d.ts.map +1 -0
  45. package/dist/lib/commands/prime.js +168 -0
  46. package/dist/lib/commands/prime.js.map +1 -0
  47. package/dist/lib/commands/search.d.ts +20 -0
  48. package/dist/lib/commands/search.d.ts.map +1 -0
  49. package/dist/lib/commands/search.js +111 -0
  50. package/dist/lib/commands/search.js.map +1 -0
  51. package/dist/lib/errors.d.ts +80 -0
  52. package/dist/lib/errors.d.ts.map +1 -0
  53. package/dist/lib/errors.js +189 -0
  54. package/dist/lib/errors.js.map +1 -0
  55. package/dist/lib/formatters/output.d.ts +5 -0
  56. package/dist/lib/formatters/output.d.ts.map +1 -0
  57. package/dist/lib/formatters/output.js +5 -0
  58. package/dist/lib/formatters/output.js.map +1 -0
  59. package/dist/lib/formatters.d.ts +29 -0
  60. package/dist/lib/formatters.d.ts.map +1 -0
  61. package/dist/lib/formatters.js +141 -0
  62. package/dist/lib/formatters.js.map +1 -0
  63. package/dist/lib/index-tools.d.ts +108 -0
  64. package/dist/lib/index-tools.d.ts.map +1 -0
  65. package/dist/lib/index-tools.js +311 -0
  66. package/dist/lib/index-tools.js.map +1 -0
  67. package/dist/lib/index.d.ts +21 -0
  68. package/dist/lib/index.d.ts.map +1 -0
  69. package/dist/lib/index.js +42 -0
  70. package/dist/lib/index.js.map +1 -0
  71. package/dist/lib/kit-wrapper.d.ts +70 -0
  72. package/dist/lib/kit-wrapper.d.ts.map +1 -0
  73. package/dist/lib/kit-wrapper.js +462 -0
  74. package/dist/lib/kit-wrapper.js.map +1 -0
  75. package/dist/lib/logger.d.ts +28 -0
  76. package/dist/lib/logger.d.ts.map +1 -0
  77. package/dist/lib/logger.js +39 -0
  78. package/dist/lib/logger.js.map +1 -0
  79. package/dist/lib/types.d.ts +179 -0
  80. package/dist/lib/types.d.ts.map +1 -0
  81. package/dist/lib/types.js +48 -0
  82. package/dist/lib/types.js.map +1 -0
  83. package/dist/lib/utils/args.d.ts +40 -0
  84. package/dist/lib/utils/args.d.ts.map +1 -0
  85. package/dist/lib/utils/args.js +58 -0
  86. package/dist/lib/utils/args.js.map +1 -0
  87. package/dist/lib/utils/git.d.ts +23 -0
  88. package/dist/lib/utils/git.d.ts.map +1 -0
  89. package/dist/lib/utils/git.js +50 -0
  90. package/dist/lib/utils/git.js.map +1 -0
  91. package/dist/lib/utils/index-parser.d.ts +155 -0
  92. package/dist/lib/utils/index-parser.d.ts.map +1 -0
  93. package/dist/lib/utils/index-parser.js +252 -0
  94. package/dist/lib/utils/index-parser.js.map +1 -0
  95. package/dist/lib/validators.d.ts +138 -0
  96. package/dist/lib/validators.d.ts.map +1 -0
  97. package/dist/lib/validators.js +302 -0
  98. package/dist/lib/validators.js.map +1 -0
  99. package/dist/mcp/index.d.ts +19 -0
  100. package/dist/mcp/index.d.ts.map +1 -0
  101. package/dist/mcp/index.js +769 -0
  102. package/dist/mcp/index.js.map +1 -0
  103. package/package.json +5 -2
  104. package/src/cli.ts +170 -0
  105. package/src/lib/ast/index.ts +32 -0
  106. package/src/lib/ast/languages.ts +172 -0
  107. package/src/lib/ast/pattern.ts +299 -0
  108. package/src/lib/ast/searcher.ts +381 -0
  109. package/src/lib/ast/types.ts +99 -0
  110. package/src/lib/commands/callers.ts +226 -0
  111. package/src/lib/commands/find.ts +159 -0
  112. package/src/lib/commands/overview.ts +73 -0
  113. package/src/lib/commands/prime.ts +271 -0
  114. package/src/lib/commands/search.ts +146 -0
  115. package/src/lib/errors.ts +221 -0
  116. package/src/lib/formatters/output.ts +9 -0
  117. package/src/lib/formatters.ts +189 -0
  118. package/src/lib/index-tools.ts +471 -0
  119. package/src/lib/index.ts +122 -0
  120. package/src/lib/kit-wrapper.ts +675 -0
  121. package/src/lib/logger.ts +57 -0
  122. package/src/lib/types.ts +228 -0
  123. package/src/lib/utils/args.ts +72 -0
  124. package/src/lib/utils/git.ts +65 -0
  125. package/src/lib/utils/index-parser.ts +350 -0
  126. package/src/lib/validators.ts +437 -0
  127. package/src/mcp/index.ts +144 -79
@@ -0,0 +1,252 @@
1
+ /**
2
+ * PROJECT_INDEX.json parser and query utilities
3
+ *
4
+ * Provides TypeScript-based queries to replace jq dependencies.
5
+ * Supports git-style directory search to find index from any subdirectory.
6
+ */
7
+ import { dirname, join, resolve } from 'node:path';
8
+ import { findUpSync, pathExistsSync } from '@side-quest/core/fs';
9
+ /**
10
+ * Search up directory tree for PROJECT_INDEX.json (git-style)
11
+ *
12
+ * Note: Delegates to @sidequest/core/fs findUpSync for the file search.
13
+ *
14
+ * @param startDir - Directory to start searching from (default: process.cwd())
15
+ * @returns Absolute path to PROJECT_INDEX.json
16
+ * @throws Error if index not found
17
+ */
18
+ export async function findProjectIndex(startDir = process.cwd()) {
19
+ const indexPath = findUpSync('PROJECT_INDEX.json', startDir);
20
+ if (indexPath) {
21
+ return indexPath;
22
+ }
23
+ throw new Error('PROJECT_INDEX.json not found in current directory or any parent directory.\n' +
24
+ 'Run: bun run src/cli.ts prime');
25
+ }
26
+ /**
27
+ * Resolve explicit path to PROJECT_INDEX.json
28
+ *
29
+ * Handles three cases:
30
+ * 1. Path to PROJECT_INDEX.json file directly
31
+ * 2. Path to directory containing PROJECT_INDEX.json
32
+ * 3. Relative path that needs resolution
33
+ *
34
+ * @param explicitPath - Explicit path provided by user
35
+ * @returns Absolute path to PROJECT_INDEX.json
36
+ * @throws Error if index not found at specified path
37
+ */
38
+ export function resolveExplicitIndexPath(explicitPath) {
39
+ const resolved = resolve(explicitPath);
40
+ // Case 1: Direct path to PROJECT_INDEX.json
41
+ if (resolved.endsWith('PROJECT_INDEX.json')) {
42
+ if (pathExistsSync(resolved)) {
43
+ return resolved;
44
+ }
45
+ throw new Error(`PROJECT_INDEX.json not found at: ${resolved}`);
46
+ }
47
+ // Case 2: Directory containing PROJECT_INDEX.json
48
+ const indexInDir = join(resolved, 'PROJECT_INDEX.json');
49
+ if (pathExistsSync(indexInDir)) {
50
+ return indexInDir;
51
+ }
52
+ throw new Error(`PROJECT_INDEX.json not found at: ${indexInDir}\n` +
53
+ 'Specify either:\n' +
54
+ ' - Path to PROJECT_INDEX.json file\n' +
55
+ ' - Directory containing PROJECT_INDEX.json');
56
+ }
57
+ /**
58
+ * Load and parse PROJECT_INDEX.json
59
+ *
60
+ * @param explicitPath - Optional explicit path to index file or directory
61
+ * @returns Parsed project index
62
+ * @throws Error if index not found or invalid JSON
63
+ */
64
+ export async function loadProjectIndex(explicitPath) {
65
+ const indexPath = explicitPath
66
+ ? resolveExplicitIndexPath(explicitPath)
67
+ : await findProjectIndex();
68
+ const file = Bun.file(indexPath);
69
+ return (await file.json());
70
+ }
71
+ /**
72
+ * Find symbols by name across all files
73
+ *
74
+ * @param index - Project index
75
+ * @param symbolName - Symbol name to search for (exact match)
76
+ * @returns Array of matching symbols with their file paths
77
+ */
78
+ export function findSymbol(index, symbolName) {
79
+ const results = [];
80
+ for (const [file, symbols] of Object.entries(index.symbols)) {
81
+ for (const symbol of symbols) {
82
+ if (symbol.name === symbolName) {
83
+ results.push({ file, symbol });
84
+ }
85
+ }
86
+ }
87
+ return results;
88
+ }
89
+ /**
90
+ * Find symbols by fuzzy name matching (case-insensitive substring)
91
+ *
92
+ * @param index - Project index
93
+ * @param query - Search query (substring, case-insensitive)
94
+ * @returns Array of matching symbols with their file paths
95
+ */
96
+ export function findSymbolFuzzy(index, query) {
97
+ const results = [];
98
+ const lowerQuery = query.toLowerCase();
99
+ for (const [file, symbols] of Object.entries(index.symbols)) {
100
+ for (const symbol of symbols) {
101
+ const lowerName = symbol.name.toLowerCase();
102
+ // Exact match (highest score)
103
+ if (lowerName === lowerQuery) {
104
+ results.push({ file, symbol, score: 100 });
105
+ }
106
+ // Starts with (high score)
107
+ else if (lowerName.startsWith(lowerQuery)) {
108
+ results.push({ file, symbol, score: 75 });
109
+ }
110
+ // Contains (lower score)
111
+ else if (lowerName.includes(lowerQuery)) {
112
+ results.push({ file, symbol, score: 50 });
113
+ }
114
+ }
115
+ }
116
+ // Sort by score descending, then by name
117
+ return results.sort((a, b) => {
118
+ if (b.score !== a.score)
119
+ return b.score - a.score;
120
+ return a.symbol.name.localeCompare(b.symbol.name);
121
+ });
122
+ }
123
+ /**
124
+ * Get all symbols in a file
125
+ *
126
+ * @param index - Project index
127
+ * @param filePath - File path (can be relative or absolute)
128
+ * @returns Array of symbols in the file
129
+ */
130
+ export function getFileSymbols(index, filePath) {
131
+ // Try exact match first
132
+ if (index.symbols[filePath]) {
133
+ return index.symbols[filePath];
134
+ }
135
+ // Try finding by filename (if relative path provided)
136
+ for (const [path, symbols] of Object.entries(index.symbols)) {
137
+ if (path.endsWith(filePath)) {
138
+ return symbols;
139
+ }
140
+ }
141
+ return [];
142
+ }
143
+ /**
144
+ * Get all files with their symbol counts
145
+ *
146
+ * @param index - Project index
147
+ * @returns Array of files with symbol counts
148
+ */
149
+ export function getFileStats(index) {
150
+ const stats = [];
151
+ for (const [file, symbols] of Object.entries(index.symbols)) {
152
+ stats.push({ file, symbolCount: symbols.length });
153
+ }
154
+ // Sort by symbol count descending
155
+ return stats.sort((a, b) => b.symbolCount - a.symbolCount);
156
+ }
157
+ /**
158
+ * Get symbol distribution by type
159
+ *
160
+ * @param index - Project index
161
+ * @returns Record of symbol types to counts
162
+ */
163
+ export function getSymbolTypeDistribution(index) {
164
+ const distribution = {
165
+ function: 0,
166
+ class: 0,
167
+ interface: 0,
168
+ type: 0,
169
+ constant: 0,
170
+ variable: 0,
171
+ };
172
+ for (const symbols of Object.values(index.symbols)) {
173
+ for (const symbol of symbols) {
174
+ distribution[symbol.type] = (distribution[symbol.type] || 0) + 1;
175
+ }
176
+ }
177
+ return distribution;
178
+ }
179
+ /**
180
+ * Get all exported symbols (heuristic: uppercase or common export patterns)
181
+ *
182
+ * Note: Kit index doesn't have explicit "exported" flag, so we use naming conventions
183
+ *
184
+ * @param index - Project index
185
+ * @returns Array of likely exported symbols
186
+ */
187
+ export function getExportedSymbols(index) {
188
+ const exported = [];
189
+ for (const [file, symbols] of Object.entries(index.symbols)) {
190
+ // Skip test files
191
+ if (file.includes('.test.') || file.includes('.spec.')) {
192
+ continue;
193
+ }
194
+ for (const symbol of symbols) {
195
+ // Heuristic: likely exported if:
196
+ // 1. Starts with uppercase (classes, types, interfaces)
197
+ // 2. Exported by naming convention
198
+ const firstChar = symbol.name[0];
199
+ if (firstChar && firstChar === firstChar.toUpperCase()) {
200
+ exported.push({ file, symbol });
201
+ }
202
+ }
203
+ }
204
+ return exported;
205
+ }
206
+ /**
207
+ * Group symbols by directory
208
+ *
209
+ * @param index - Project index
210
+ * @returns Record of directory paths to symbol counts
211
+ */
212
+ export function groupSymbolsByDirectory(index) {
213
+ const dirCounts = {};
214
+ for (const [file, symbols] of Object.entries(index.symbols)) {
215
+ const dir = dirname(file);
216
+ dirCounts[dir] = (dirCounts[dir] || 0) + symbols.length;
217
+ }
218
+ return dirCounts;
219
+ }
220
+ /**
221
+ * Get directory with most symbols (complexity hotspot)
222
+ *
223
+ * @param index - Project index
224
+ * @param topN - Number of top directories to return
225
+ * @returns Array of directories sorted by symbol count
226
+ */
227
+ export function getComplexityHotspots(index, topN = 10) {
228
+ const dirCounts = groupSymbolsByDirectory(index);
229
+ const sorted = Object.entries(dirCounts)
230
+ .map(([directory, symbolCount]) => ({ directory, symbolCount }))
231
+ .sort((a, b) => b.symbolCount - a.symbolCount);
232
+ return sorted.slice(0, topN);
233
+ }
234
+ /**
235
+ * Get all symbols of a specific type
236
+ *
237
+ * @param index - Project index
238
+ * @param type - Symbol type to filter by
239
+ * @returns Array of matching symbols with file paths
240
+ */
241
+ export function getSymbolsByType(index, type) {
242
+ const results = [];
243
+ for (const [file, symbols] of Object.entries(index.symbols)) {
244
+ for (const symbol of symbols) {
245
+ if (symbol.type === type) {
246
+ results.push({ file, symbol });
247
+ }
248
+ }
249
+ }
250
+ return results;
251
+ }
252
+ //# sourceMappingURL=index-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-parser.js","sourceRoot":"","sources":["../../../src/lib/utils/index-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Kit Plugin Validators
3
+ *
4
+ * Input validation and security utilities for safe Kit CLI operations.
5
+ */
6
+ /**
7
+ * Result of path validation.
8
+ */
9
+ export interface PathValidationResult {
10
+ /** Whether the path is valid */
11
+ valid: boolean;
12
+ /** Normalized absolute path (only if valid) */
13
+ path?: string;
14
+ /** Error message (only if invalid) */
15
+ error?: string;
16
+ }
17
+ /**
18
+ * Validate a path for Kit operations.
19
+ *
20
+ * Checks:
21
+ * - Path exists
22
+ * - Path is a directory (for search operations)
23
+ * - No path traversal attacks (.. sequences escaping base)
24
+ *
25
+ * @param inputPath - Path to validate
26
+ * @param options - Validation options
27
+ * @returns Validation result with normalized path or error
28
+ */
29
+ export declare function validatePath(inputPath: string, options?: {
30
+ /** Base directory to restrict access within (optional) */
31
+ basePath?: string;
32
+ /** Whether the path must be a directory (default: true) */
33
+ mustBeDirectory?: boolean;
34
+ /** Whether the path must exist (default: true) */
35
+ mustExist?: boolean;
36
+ }): PathValidationResult;
37
+ /**
38
+ * Validate a number is a positive integer within bounds.
39
+ * @deprecated Use validateInteger from @sidequest/core/validation instead
40
+ * @param value - Value to validate
41
+ * @param options - Validation options
42
+ * @returns Validation result
43
+ */
44
+ export declare function validatePositiveInt(value: unknown, options: {
45
+ /** Field name for error messages */
46
+ name: string;
47
+ /** Minimum allowed value (default: 1) */
48
+ min?: number;
49
+ /** Maximum allowed value (default: 10000) */
50
+ max?: number;
51
+ /** Default value if undefined */
52
+ defaultValue?: number;
53
+ }): {
54
+ valid: boolean;
55
+ value?: number;
56
+ error?: string;
57
+ };
58
+ /**
59
+ * Validate all inputs for a grep search operation.
60
+ * @param inputs - Grep inputs to validate
61
+ * @returns Combined validation result
62
+ */
63
+ export declare function validateGrepInputs(inputs: {
64
+ pattern: string;
65
+ path?: string;
66
+ include?: string;
67
+ exclude?: string;
68
+ maxResults?: number;
69
+ }): {
70
+ valid: boolean;
71
+ errors: string[];
72
+ validated?: {
73
+ pattern: string;
74
+ path: string;
75
+ include?: string;
76
+ exclude?: string;
77
+ maxResults: number;
78
+ };
79
+ };
80
+ /**
81
+ * Validate all inputs for a semantic search operation.
82
+ * @param inputs - Semantic search inputs to validate
83
+ * @returns Combined validation result
84
+ */
85
+ export declare function validateSemanticInputs(inputs: {
86
+ query: string;
87
+ path?: string;
88
+ topK?: number;
89
+ }): {
90
+ valid: boolean;
91
+ errors: string[];
92
+ validated?: {
93
+ query: string;
94
+ path: string;
95
+ topK: number;
96
+ };
97
+ };
98
+ /**
99
+ * Validate all inputs for a symbol usages operation.
100
+ * @param inputs - Usages inputs to validate
101
+ * @returns Combined validation result
102
+ */
103
+ export declare function validateUsagesInputs(inputs: {
104
+ path?: string;
105
+ symbolName: string;
106
+ symbolType?: string;
107
+ }): {
108
+ valid: boolean;
109
+ errors: string[];
110
+ validated?: {
111
+ path: string;
112
+ symbolName: string;
113
+ symbolType?: string;
114
+ };
115
+ };
116
+ /**
117
+ * Validate all inputs for an AST search operation.
118
+ * @param inputs - AST search inputs to validate
119
+ * @returns Combined validation result
120
+ */
121
+ export declare function validateAstSearchInputs(inputs: {
122
+ pattern: string;
123
+ mode?: string;
124
+ filePattern?: string;
125
+ path?: string;
126
+ maxResults?: number;
127
+ }): {
128
+ valid: boolean;
129
+ errors: string[];
130
+ validated?: {
131
+ pattern: string;
132
+ mode: 'simple' | 'pattern';
133
+ filePattern?: string;
134
+ path: string;
135
+ maxResults: number;
136
+ };
137
+ };
138
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/lib/validators.ts"],"names":[],"mappings":"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"}