.ai/skills/add-tool-plugin/SKILL.md
Add support for a new AI coding tool
npx skillsauth add krystianjonca/lnai add-tool-pluginInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.tsdevops
Deploy the application to production
tools
Update an existing LNAI tool plugin
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------