use list-dir instead of list-files. move function related functions to the center
This commit is contained in:
1 parent
62f5fa87a9
commit
1e35028148
4 files changed
+49
-21
No files matched your search
@@ -0,0 +1,49 @@
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
|
||||
export const spec = {
|
||||
name: 'list-dir',
|
||||
description: 'List items in a directory. Takes a path argument and returns a list of strings representing the items in that directory.',
|
||||
parameters: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
path: {
|
||||
type: 'string',
|
||||
description: 'Directory path relative to the space directory'
|
||||
}
|
||||
},
|
||||
required: ['path']
|
||||
}
|
||||
};
|
||||
|
||||
function resolveIn(base, relPath) {
|
||||
const resolved = path.resolve(base, relPath);
|
||||
if (resolved !== base && !resolved.startsWith(base + path.sep)) {
|
||||
throw new Error('Path escapes the space directory');
|
||||
}
|
||||
return resolved;
|
||||
}
|
||||
|
||||
export default async function (args, ctx) {
|
||||
const dirPath = resolveIn(ctx.dir, args.path);
|
||||
|
||||
// Check if path exists and is a directory
|
||||
if (!fs.existsSync(dirPath)) {
|
||||
throw new Error(`Directory not found: ${args.path}`);
|
||||
}
|
||||
|
||||
if (!fs.statSync(dirPath).isDirectory()) {
|
||||
throw new Error(`Path is not a directory: ${args.path}`);
|
||||
}
|
||||
|
||||
// Read directory and format paths with trailing slash for directories
|
||||
const items = [];
|
||||
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
||||
|
||||
for (const entry of entries) {
|
||||
const relPath = args.path ? `${args.path}/${entry.name}` : entry.name;
|
||||
items.push(entry.isDirectory() ? `${relPath}/` : relPath);
|
||||
}
|
||||
|
||||
return { items };
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
|
||||
export const spec = {
|
||||
name: 'list-files',
|
||||
description: 'List every file in the space, as paths relative to the space directory.',
|
||||
parameters: { type: 'object', properties: {} },
|
||||
};
|
||||
|
||||
export default async function (args, ctx) {
|
||||
const files = [];
|
||||
const walk = (dir, prefix) => {
|
||||
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
||||
const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
|
||||
if (entry.isDirectory()) walk(path.join(dir, entry.name), rel);
|
||||
else files.push(rel);
|
||||
}
|
||||
};
|
||||
walk(ctx.dir, '');
|
||||
return { files };
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
Reference in new issue
Block a user