@nanocollective/nanocoder
Version:
A local-first CLI coding agent that brings the power of agentic coding tools like Claude Code and Gemini CLI to local models or controlled APIs like OpenRouter
59 lines • 2.75 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { existsSync } from 'node:fs';
import { mkdir } from 'node:fs/promises';
import { resolve } from 'node:path';
import { Box, Text } from 'ink';
import React from 'react';
import ToolMessage from '../../components/tool-message.js';
import { ThemeContext } from '../../hooks/useTheme.js';
import { jsonSchema, tool } from '../../types/core.js';
import { validatePath } from '../../utils/path-validators.js';
const executeCreateDirectory = async (args) => {
const absPath = resolve(args.path);
const alreadyExists = existsSync(absPath);
await mkdir(absPath, { recursive: true });
if (alreadyExists) {
return `Directory already exists: ${args.path}`;
}
return `Directory created: ${args.path}`;
};
const createDirectoryCoreTool = tool({
description: 'Create a directory, including parent directories if needed. Idempotent — succeeds if the directory already exists. AUTO-ACCEPTED (no user approval needed).',
inputSchema: jsonSchema({
type: 'object',
properties: {
path: {
type: 'string',
description: 'The relative path of the directory to create (e.g., "src/components/new-feature").',
},
},
required: ['path'],
}),
// Low risk: creating directories is non-destructive and idempotent
needsApproval: false,
execute: async (args, _options) => {
return await executeCreateDirectory(args);
},
});
const CreateDirectoryFormatter = React.memo(({ args, result }) => {
const themeContext = React.useContext(ThemeContext);
if (!themeContext) {
throw new Error('ThemeContext is required');
}
const { colors } = themeContext;
const messageContent = (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: colors.tool, children: "\u2692 create_directory" }), _jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: "Path: " }), _jsx(Text, { color: colors.text, children: args.path })] }), result && (_jsxs(Box, { children: [_jsx(Text, { color: colors.secondary, children: "Result: " }), _jsx(Text, { color: colors.text, children: result })] }))] }));
return _jsx(ToolMessage, { message: messageContent, hideBox: true });
});
const createDirectoryFormatter = (args, result) => {
return _jsx(CreateDirectoryFormatter, { args: args, result: result });
};
const createDirectoryValidator = async (args) => {
return validatePath(args.path);
};
export const createDirectoryTool = {
name: 'create_directory',
tool: createDirectoryCoreTool,
formatter: createDirectoryFormatter,
validator: createDirectoryValidator,
};
//# sourceMappingURL=create-directory.js.map