with one click
add-tool-plugin
Add support for a new AI coding tool
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Add support for a new AI coding tool
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | add-tool-plugin |
| description | Add support for a new AI coding tool |
Guide for adding LNAI support for a new AI coding tool.
Each plugin implements the Plugin interface to transform unified .ai/ config into a tool's native format.
Search the official documentation for the target tool to understand its configuration format:
Update packages/core/src/constants.ts:
TOOL_IDS array (e.g., "newtool")TOOL_OUTPUT_DIRS mapOVERRIDE_DIRS mapCreate packages/core/src/plugins/<tool-name>/:
<tool-name>/
├── index.ts # Plugin implementation
├── types.ts # Tool-specific types (optional)
├── transforms.ts # Transformation functions (optional)
└── index.test.ts # Tests
In index.ts, implement the Plugin interface:
import type { Plugin } from "../types";
import type { OutputFile, UnifiedState, ValidationResult } from "../../types";
import { applyFileOverrides } from "../../utils/transforms";
export const newToolPlugin: Plugin = {
id: "newtool",
name: "New Tool",
async detect(rootDir: string): Promise<boolean> {
// Check if tool's config exists
return false;
},
async import(rootDir: string): Promise<Partial<UnifiedState> | null> {
// Import existing config to unified format
return null;
},
async export(state: UnifiedState, rootDir: string): Promise<OutputFile[]> {
const files: OutputFile[] = [];
// Add AGENTS.md symlink
if (state.agents) {
files.push({
path: ".newtool/AGENTS.md",
type: "symlink",
target: "../.ai/AGENTS.md",
});
}
// Add rules, settings, MCP servers...
return applyFileOverrides(files, rootDir, "newtool");
},
validate(state: UnifiedState): ValidationResult {
const warnings: ValidationWarningDetail[] = [];
const skipped: SkippedFeatureDetail[] = [];
// Add warnings for unsupported features
return { valid: true, errors: [], warnings, skipped };
},
};
In packages/core/src/plugins/index.ts:
import { newToolPlugin } from "./newtool/index";
pluginRegistry.register(newToolPlugin);
Create index.test.ts with tests for export() and validate().
Create apps/docs/src/content/docs/tools/<tool-name>.md documenting:
pnpm lint && pnpm typecheck && pnpm test
.ai/.<tool>/When implementing, refer to:
packages/core/src/plugins/ as examplespackages/core/src/plugins/types.tspackages/core/src/utils/transforms.ts