zelari-code 0.2.2 → 0.6.2
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 +97 -2
- package/dist/agents/councilApi.js +7 -7
- package/dist/agents/councilApi.js.map +1 -1
- package/dist/agents/councilDirectives.js +3 -3
- package/dist/agents/promoteMember.js +2 -2
- package/dist/agents/roles.js +32 -32
- package/dist/agents/roles.js.map +1 -1
- package/dist/agents/skills/builtin/debugging.js +4 -4
- package/dist/agents/skills/builtin/debugging.js.map +1 -1
- package/dist/agents/skills/builtin/docs.js +13 -23
- package/dist/agents/skills/builtin/docs.js.map +1 -1
- package/dist/agents/skills/builtin/git-ops.js +3 -3
- package/dist/agents/skills/builtin/git-ops.js.map +1 -1
- package/dist/agents/skills/builtin/planning.js +4 -4
- package/dist/agents/skills/builtin/planning.js.map +1 -1
- package/dist/agents/skills/builtin/refactoring.js +3 -3
- package/dist/agents/skills/builtin/refactoring.js.map +1 -1
- package/dist/agents/skills/builtin/review.js +9 -9
- package/dist/agents/skills/builtin/review.js.map +1 -1
- package/dist/agents/skills/builtin/testing.js +3 -3
- package/dist/agents/skills/builtin/testing.js.map +1 -1
- package/dist/agents/tools.js +9 -2
- package/dist/agents/tools.js.map +1 -1
- package/dist/cli/app.js +94 -1861
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/compaction.js.map +1 -1
- package/dist/cli/components/ChatStream.js +81 -14
- package/dist/cli/components/ChatStream.js.map +1 -1
- package/dist/cli/components/CollapsibleToolOutput.js +26 -3
- package/dist/cli/components/CollapsibleToolOutput.js.map +1 -1
- package/dist/cli/components/Header.js +20 -1
- package/dist/cli/components/Header.js.map +1 -1
- package/dist/cli/components/InputBar.js +34 -2
- package/dist/cli/components/InputBar.js.map +1 -1
- package/dist/cli/components/Sidebar.js +30 -10
- package/dist/cli/components/Sidebar.js.map +1 -1
- package/dist/cli/councilDispatcher.js +10 -2
- package/dist/cli/councilDispatcher.js.map +1 -1
- package/dist/cli/headless.js +137 -0
- package/dist/cli/headless.js.map +1 -0
- package/dist/cli/hooks/chatStats.js +28 -0
- package/dist/cli/hooks/chatStats.js.map +1 -0
- package/dist/cli/hooks/eventsToMessages.js +111 -0
- package/dist/cli/hooks/eventsToMessages.js.map +1 -0
- package/dist/cli/hooks/messageHelpers.js +125 -0
- package/dist/cli/hooks/messageHelpers.js.map +1 -0
- package/dist/cli/hooks/skillCompare.js +69 -0
- package/dist/cli/hooks/skillCompare.js.map +1 -0
- package/dist/cli/hooks/steer.js +28 -0
- package/dist/cli/hooks/steer.js.map +1 -0
- package/dist/cli/hooks/useBatchedMessages.js +67 -0
- package/dist/cli/hooks/useBatchedMessages.js.map +1 -0
- package/dist/cli/hooks/useChatTurn.js +363 -0
- package/dist/cli/hooks/useChatTurn.js.map +1 -0
- package/dist/cli/hooks/useSession.js +116 -0
- package/dist/cli/hooks/useSession.js.map +1 -0
- package/dist/cli/hooks/useSlashDispatch.js +303 -0
- package/dist/cli/hooks/useSlashDispatch.js.map +1 -0
- package/dist/cli/hooks/useTerminalSize.js +60 -0
- package/dist/cli/hooks/useTerminalSize.js.map +1 -0
- package/dist/cli/main.bundled.js +25212 -21722
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/main.js +86 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/provider/openai-compatible.js +9 -2
- package/dist/cli/provider/openai-compatible.js.map +1 -1
- package/dist/cli/runHeadless.js +160 -0
- package/dist/cli/runHeadless.js.map +1 -0
- package/dist/cli/sessionManager.js +47 -1
- package/dist/cli/sessionManager.js.map +1 -1
- package/dist/cli/skillSuggest.js +1 -1
- package/dist/cli/slashCommands.js +72 -3
- package/dist/cli/slashCommands.js.map +1 -1
- package/dist/cli/slashHandlers/branch.js +57 -0
- package/dist/cli/slashHandlers/branch.js.map +1 -0
- package/dist/cli/slashHandlers/git.js +40 -0
- package/dist/cli/slashHandlers/git.js.map +1 -0
- package/dist/cli/slashHandlers/promoteMember.js +25 -0
- package/dist/cli/slashHandlers/promoteMember.js.map +1 -0
- package/dist/cli/slashHandlers/provider.js +199 -0
- package/dist/cli/slashHandlers/provider.js.map +1 -0
- package/dist/cli/slashHandlers/skills.js +82 -0
- package/dist/cli/slashHandlers/skills.js.map +1 -0
- package/dist/cli/slashHandlers/transcript.js +13 -0
- package/dist/cli/slashHandlers/transcript.js.map +1 -0
- package/dist/cli/slashHandlers/updater.js +40 -0
- package/dist/cli/slashHandlers/updater.js.map +1 -0
- package/dist/cli/slashHandlers/workspace.js +118 -0
- package/dist/cli/slashHandlers/workspace.js.map +1 -0
- package/dist/cli/toolRegistry.js +17 -8
- package/dist/cli/toolRegistry.js.map +1 -1
- package/dist/cli/utils/duration.js +34 -0
- package/dist/cli/utils/duration.js.map +1 -0
- package/dist/cli/wizard/firstRun.js +63 -0
- package/dist/cli/wizard/firstRun.js.map +1 -0
- package/dist/cli/wizard/index.js +150 -0
- package/dist/cli/wizard/index.js.map +1 -0
- package/dist/cli/wizard/runWizard.js +137 -0
- package/dist/cli/wizard/runWizard.js.map +1 -0
- package/dist/cli/wizard/useWizardState.js +151 -0
- package/dist/cli/wizard/useWizardState.js.map +1 -0
- package/dist/cli/workspace/agentsMd.js +314 -0
- package/dist/cli/workspace/agentsMd.js.map +1 -0
- package/dist/cli/workspace/index.js +24 -0
- package/dist/cli/workspace/index.js.map +1 -0
- package/dist/cli/workspace/paths.js +88 -0
- package/dist/cli/workspace/paths.js.map +1 -0
- package/dist/cli/workspace/postCouncilHook.js +38 -0
- package/dist/cli/workspace/postCouncilHook.js.map +1 -0
- package/dist/cli/workspace/storage.js +392 -0
- package/dist/cli/workspace/storage.js.map +1 -0
- package/dist/cli/workspace/stubs.js +528 -0
- package/dist/cli/workspace/stubs.js.map +1 -0
- package/dist/cli/workspace/toolRegistry.js +61 -0
- package/dist/cli/workspace/toolRegistry.js.map +1 -0
- package/dist/cli/workspace/types.js +10 -0
- package/dist/cli/workspace/types.js.map +1 -0
- package/dist/main/core/tools/builtin/_walk.js +129 -0
- package/dist/main/core/tools/builtin/_walk.js.map +1 -0
- package/dist/main/core/tools/builtin/diff.js +477 -0
- package/dist/main/core/tools/builtin/diff.js.map +1 -0
- package/dist/main/core/tools/builtin/listFiles.js +5 -43
- package/dist/main/core/tools/builtin/listFiles.js.map +1 -1
- package/dist/main/core/tools/builtin/search.js +120 -28
- package/dist/main/core/tools/builtin/search.js.map +1 -1
- package/package.json +10 -2
|
@@ -1,55 +1,15 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { promises as fs } from 'node:fs';
|
|
3
2
|
import path from 'node:path';
|
|
4
3
|
import { typedOk, typedErr } from '../toolTypes.js';
|
|
4
|
+
import { walk, DEFAULT_EXCLUDES, } from './_walk.js';
|
|
5
5
|
const ListFilesArgsSchema = z.object({
|
|
6
6
|
/** Directory to list (relative to cwd or absolute). Defaults to cwd. */
|
|
7
7
|
path: z.string().optional(),
|
|
8
8
|
/** Max traversal depth. 1 = immediate children only (default). */
|
|
9
9
|
maxDepth: z.number().int().positive().max(10).default(1),
|
|
10
10
|
/** Glob-style patterns to exclude (matched against each entry name). */
|
|
11
|
-
exclude: z.array(z.string()).default(
|
|
12
|
-
'node_modules', '.git', 'dist', 'build', '.next', '__pycache__', '.cache',
|
|
13
|
-
]),
|
|
11
|
+
exclude: z.array(z.string()).default(DEFAULT_EXCLUDES),
|
|
14
12
|
});
|
|
15
|
-
function matchesAny(name, patterns) {
|
|
16
|
-
return patterns.some((p) => {
|
|
17
|
-
// Simple glob: '*' wildcard.
|
|
18
|
-
if (p.includes('*')) {
|
|
19
|
-
const regex = new RegExp('^' + p.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*') + '$');
|
|
20
|
-
return regex.test(name);
|
|
21
|
-
}
|
|
22
|
-
return name === p;
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
async function walk(dir, baseRel, depth, maxDepth, exclude, entries, signal) {
|
|
26
|
-
if (depth > maxDepth)
|
|
27
|
-
return;
|
|
28
|
-
let dirents;
|
|
29
|
-
try {
|
|
30
|
-
dirents = await fs.readdir(dir, { withFileTypes: true });
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
return; // unreadable subdirectory — skip silently
|
|
34
|
-
}
|
|
35
|
-
// Honor the abort signal between reads (fs.readdir options.signal typing
|
|
36
|
-
// varies across Node versions, so we check manually here).
|
|
37
|
-
if (signal?.aborted)
|
|
38
|
-
return;
|
|
39
|
-
for (const dirent of dirents) {
|
|
40
|
-
if (matchesAny(dirent.name, exclude))
|
|
41
|
-
continue;
|
|
42
|
-
const rel = baseRel ? `${baseRel}/${dirent.name}` : dirent.name;
|
|
43
|
-
const isDir = dirent.isDirectory();
|
|
44
|
-
entries.push({
|
|
45
|
-
name: rel,
|
|
46
|
-
type: isDir ? 'directory' : dirent.isFile() ? 'file' : 'other',
|
|
47
|
-
});
|
|
48
|
-
if (isDir && depth < maxDepth) {
|
|
49
|
-
await walk(path.join(dir, dirent.name), rel, depth + 1, maxDepth, exclude, entries, signal);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
13
|
export const listFilesTool = {
|
|
54
14
|
name: 'list_files',
|
|
55
15
|
description: 'List files and directories in the given path (defaults to the working directory). ' +
|
|
@@ -65,7 +25,9 @@ export const listFilesTool = {
|
|
|
65
25
|
? (path.isAbsolute(args.path) ? args.path : path.join(ctx.cwd, args.path))
|
|
66
26
|
: ctx.cwd;
|
|
67
27
|
const entries = [];
|
|
68
|
-
|
|
28
|
+
// API: maxDepth=1 means "root only". Internally: depth=0 at root,
|
|
29
|
+
// so we subtract 1 from the user-facing maxDepth.
|
|
30
|
+
await walk(target, '', 0, args.maxDepth - 1, args.exclude, entries, ctx.signal);
|
|
69
31
|
// Sort: directories first, then files, alphabetically.
|
|
70
32
|
entries.sort((a, b) => {
|
|
71
33
|
if (a.type === 'directory' && b.type !== 'directory')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listFiles.js","sourceRoot":"","sources":["../../../../../src/main/core/tools/builtin/listFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"listFiles.js","sourceRoot":"","sources":["../../../../../src/main/core/tools/builtin/listFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAuB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,IAAI,EACJ,gBAAgB,GAEjB,MAAM,YAAY,CAAC;AAEpB,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,wEAAwE;IACxE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,kEAAkE;IAClE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,wEAAwE;IACxE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;CACvD,CAAC,CAAC;AAWH,MAAM,CAAC,MAAM,aAAa,GAAmD;IAC3E,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,oFAAoF;QACpF,wFAAwF;QACxF,wFAAwF;QACxF,iDAAiD;IACnD,WAAW,EAAE,CAAC,MAAM,CAAC;IACrB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,mBAAmB;IAChC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI;gBACtB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1E,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACZ,MAAM,OAAO,GAAgB,EAAE,CAAC;YAChC,kEAAkE;YAClE,kDAAkD;YAClD,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAChF,uDAAuD;YACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACpB,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;oBAAE,OAAO,CAAC,CAAC,CAAC;gBAChE,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;oBAAE,OAAO,CAAC,CAAC;gBAC/D,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,GAAG,CAAC;YACxB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC;YAC/C,OAAO,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3G,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -2,51 +2,143 @@ import { z } from 'zod';
|
|
|
2
2
|
import { promises as fs } from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { typedOk, typedErr } from '../toolTypes.js';
|
|
5
|
+
import { walk, filterByInclude, DEFAULT_EXCLUDES, } from './_walk.js';
|
|
6
|
+
/**
|
|
7
|
+
* grep_content — Regex search across one file OR a directory tree.
|
|
8
|
+
*
|
|
9
|
+
* Two modes:
|
|
10
|
+
* 1. Single-file: `path` is a regular file → search it.
|
|
11
|
+
* 2. Recursive: `path` is a directory → walk it (respecting `include` /
|
|
12
|
+
* `exclude` globs and `maxDepth`) and search each matched file.
|
|
13
|
+
*
|
|
14
|
+
* Backward-compatible: existing callers passing a single-file `path`
|
|
15
|
+
* keep the v0.3.x behavior unchanged.
|
|
16
|
+
*
|
|
17
|
+
* Glob syntax: `*`, `?`, `[abc]`, `**` (recursive). See _walk.ts.
|
|
18
|
+
*/
|
|
5
19
|
const GrepContentArgsSchema = z.object({
|
|
20
|
+
/** File OR directory to search (relative to cwd or absolute). */
|
|
6
21
|
path: z.string().min(1),
|
|
22
|
+
/** Regex pattern (no flags — gm is hardcoded). */
|
|
7
23
|
pattern: z.string().min(1),
|
|
24
|
+
/** Context lines before/after each match. */
|
|
8
25
|
contextLines: z.number().int().nonnegative().default(2),
|
|
26
|
+
/** Max matches returned (total matches still counted). */
|
|
9
27
|
maxMatches: z.number().int().positive().max(1000).default(50),
|
|
28
|
+
/**
|
|
29
|
+
* Glob patterns to INCLUDE when path is a directory (e.g. ['*.ts', '*.tsx']).
|
|
30
|
+
* Default ['*'] = all files. Ignored when path is a file.
|
|
31
|
+
*/
|
|
32
|
+
include: z.array(z.string()).default(['*']),
|
|
33
|
+
/**
|
|
34
|
+
* Glob patterns to EXCLUDE when path is a directory (e.g. ['*.test.ts']).
|
|
35
|
+
* Defaults to common noise dirs. Ignored when path is a file.
|
|
36
|
+
*/
|
|
37
|
+
exclude: z.array(z.string()).default(DEFAULT_EXCLUDES),
|
|
38
|
+
/** Max recursion depth when path is a directory (default 8). */
|
|
39
|
+
maxDepth: z.number().int().positive().max(15).default(8),
|
|
10
40
|
});
|
|
41
|
+
export { GrepContentArgsSchema };
|
|
42
|
+
async function searchFile(absPath, relPath, regex, contextLines, remainingSlots) {
|
|
43
|
+
let buf;
|
|
44
|
+
try {
|
|
45
|
+
buf = await fs.readFile(absPath, 'utf-8');
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return { matches: [], total: 0, truncated: false }; // unreadable file → skip
|
|
49
|
+
}
|
|
50
|
+
const lines = buf.split('\n');
|
|
51
|
+
const matches = [];
|
|
52
|
+
let total = 0;
|
|
53
|
+
let truncated = false;
|
|
54
|
+
for (let i = 0; i < lines.length; i++) {
|
|
55
|
+
regex.lastIndex = 0;
|
|
56
|
+
if (regex.test(lines[i])) {
|
|
57
|
+
total++;
|
|
58
|
+
if (matches.length < remainingSlots) {
|
|
59
|
+
const startBefore = Math.max(0, i - contextLines);
|
|
60
|
+
const endAfter = Math.min(lines.length - 1, i + contextLines);
|
|
61
|
+
matches.push({
|
|
62
|
+
file: absPath,
|
|
63
|
+
relPath,
|
|
64
|
+
line: i + 1,
|
|
65
|
+
text: lines[i],
|
|
66
|
+
context: {
|
|
67
|
+
before: lines.slice(startBefore, i),
|
|
68
|
+
after: lines.slice(i + 1, endAfter + 1),
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
truncated = true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { matches, total, truncated };
|
|
78
|
+
}
|
|
79
|
+
async function isDirectory(p) {
|
|
80
|
+
try {
|
|
81
|
+
const stat = await fs.stat(p);
|
|
82
|
+
return stat.isDirectory();
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
11
88
|
export const grepContentTool = {
|
|
12
89
|
name: 'grep_content',
|
|
13
|
-
description: 'Regex search for content in a file
|
|
90
|
+
description: 'Regex search for content in a file OR recursively in a directory. ' +
|
|
91
|
+
'When path is a directory, include/exclude globs filter which files are searched ' +
|
|
92
|
+
'(default: all files, excluding node_modules/dist/.git/etc.). Returns matches with ' +
|
|
93
|
+
'line numbers and surrounding context. Single-file mode preserves v0.3.x behavior.',
|
|
14
94
|
permissions: ['read'],
|
|
15
|
-
timeoutMs:
|
|
95
|
+
timeoutMs: 30000,
|
|
16
96
|
inputSchema: GrepContentArgsSchema,
|
|
17
97
|
execute: async (args, ctx) => {
|
|
18
98
|
try {
|
|
19
|
-
const
|
|
20
|
-
const content = await fs.readFile(absPath, { encoding: 'utf-8', signal: ctx.signal });
|
|
21
|
-
const text = typeof content === 'string' ? content : content.toString('utf-8');
|
|
22
|
-
const lines = text.split('\n');
|
|
99
|
+
const absRoot = path.isAbsolute(args.path) ? args.path : path.join(ctx.cwd, args.path);
|
|
23
100
|
const regex = new RegExp(args.pattern, 'gm');
|
|
24
|
-
|
|
101
|
+
// ── Single-file mode ────────────────────────────────────────
|
|
102
|
+
if (!(await isDirectory(absRoot))) {
|
|
103
|
+
const single = await searchFile(absRoot, args.path, regex, args.contextLines, args.maxMatches);
|
|
104
|
+
return typedOk({
|
|
105
|
+
matches: single.matches,
|
|
106
|
+
totalMatches: single.total,
|
|
107
|
+
truncated: single.truncated,
|
|
108
|
+
filesSearched: 1,
|
|
109
|
+
filesInTree: 1,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// ── Recursive (directory) mode ──────────────────────────────
|
|
113
|
+
const allEntries = [];
|
|
114
|
+
await walk(absRoot, '', 0, args.maxDepth, args.exclude, allEntries, ctx.signal);
|
|
115
|
+
const matchedFiles = filterByInclude(allEntries, args.include);
|
|
116
|
+
const allMatches = [];
|
|
25
117
|
let totalMatches = 0;
|
|
26
118
|
let truncated = false;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
matches.push({
|
|
35
|
-
file: absPath,
|
|
36
|
-
line: i + 1,
|
|
37
|
-
text: lines[i],
|
|
38
|
-
context: {
|
|
39
|
-
before: lines.slice(startBefore, i),
|
|
40
|
-
after: lines.slice(i + 1, endAfter + 1),
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
truncated = true;
|
|
46
|
-
}
|
|
119
|
+
let filesSearched = 0;
|
|
120
|
+
for (const entry of matchedFiles) {
|
|
121
|
+
if (ctx.signal?.aborted)
|
|
122
|
+
break;
|
|
123
|
+
if (allMatches.length >= args.maxMatches) {
|
|
124
|
+
truncated = true;
|
|
125
|
+
break;
|
|
47
126
|
}
|
|
127
|
+
const absFile = path.join(absRoot, entry.name);
|
|
128
|
+
const result = await searchFile(absFile, entry.name, regex, args.contextLines, args.maxMatches - allMatches.length);
|
|
129
|
+
filesSearched++;
|
|
130
|
+
totalMatches += result.total;
|
|
131
|
+
if (result.truncated)
|
|
132
|
+
truncated = true;
|
|
133
|
+
allMatches.push(...result.matches);
|
|
48
134
|
}
|
|
49
|
-
return typedOk({
|
|
135
|
+
return typedOk({
|
|
136
|
+
matches: allMatches,
|
|
137
|
+
totalMatches,
|
|
138
|
+
truncated,
|
|
139
|
+
filesSearched,
|
|
140
|
+
filesInTree: matchedFiles.length,
|
|
141
|
+
});
|
|
50
142
|
}
|
|
51
143
|
catch (err) {
|
|
52
144
|
return typedErr(err instanceof Error ? err.message : String(err));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../../src/main/core/tools/builtin/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAuB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../../src/main/core/tools/builtin/search.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zelari-code",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Zelari Code — AI Council coding agent CLI. Multi-agent orchestration (
|
|
3
|
+
"version": "0.6.2",
|
|
4
|
+
"description": "Zelari Code — AI Council coding agent CLI. Multi-agent orchestration (Caronte, Nettuno, Gerione, Plutone, Minosse, Lucifero) with slash commands, provider-agnostic LLM streaming, and self-update.",
|
|
5
5
|
"author": "N-THEM Studio",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
7
7
|
"type": "module",
|
|
8
|
+
"workspaces": [
|
|
9
|
+
"packages/*"
|
|
10
|
+
],
|
|
8
11
|
"main": "dist/cli/main.js",
|
|
9
12
|
"bin": {
|
|
10
13
|
"zelari-code": "./bin/zelari-code.js"
|
|
@@ -24,21 +27,26 @@
|
|
|
24
27
|
"build": "tsc -p tsconfig.json && node scripts/bundle-cli.mjs",
|
|
25
28
|
"build:cli": "tsc -p tsconfig.json && node scripts/bundle-cli.mjs",
|
|
26
29
|
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
30
|
+
"pretest": "npm run build --workspace=@zelari/core",
|
|
27
31
|
"test": "vitest run",
|
|
28
32
|
"test:watch": "vitest",
|
|
29
33
|
"smoke": "node bin/zelari-code.js --version",
|
|
30
34
|
"prepublishOnly": "node scripts/prepublish.mjs"
|
|
31
35
|
},
|
|
32
36
|
"dependencies": {
|
|
37
|
+
"@zelari/core": "0.6.2",
|
|
33
38
|
"ink": "^6.8.0",
|
|
34
39
|
"ink-text-input": "^6.0.0",
|
|
35
40
|
"react": "^19.2.7",
|
|
36
41
|
"zod": "^4.4.3"
|
|
37
42
|
},
|
|
38
43
|
"devDependencies": {
|
|
44
|
+
"@testing-library/react": "^16.3.2",
|
|
39
45
|
"@types/node": "^25.3.0",
|
|
40
46
|
"@types/react": "^19.0.10",
|
|
41
47
|
"esbuild": "^0.24.0",
|
|
48
|
+
"jsdom": "^29.1.1",
|
|
49
|
+
"react-dom": "^19.2.7",
|
|
42
50
|
"typescript": "~5.7.2",
|
|
43
51
|
"vitest": "^2.1.9"
|
|
44
52
|
},
|