FrootAI Contributor Guide
> Everything you need to contribute to FrootAI β from dev setup to PR review.
1. Development Environment Setup
1.1 Prerequisites
- Node.js 18+ β nodejs.orgΒ
- Git β git-scm.comΒ
- VS Code β code.visualstudio.comΒ
- Python 3.10+ (for evaluation scripts) β python.orgΒ
1.2 Clone & Install
# Clone the repository
git clone https://github.com/frootai/frootai.git
cd frootai
# Website
cd website && npm install && cd ..
# MCP Server
cd mcp-server && npm install && cd ..
# VS Code Extension
cd vscode-extension && npm install && cd ..1.3 Build Everything
# Website (Docusaurus)
cd website && npx docusaurus build
# MCP Server (no build step β plain Node.js)
# VS Code Extension
cd vscode-extension && npm run compile2. Repository Structure
frootai/
βββ docs/ # 18+ knowledge modules (Markdown)
βββ website/ # Docusaurus site
β βββ src/pages/ # React pages (landing, setup, plays...)
β βββ docusaurus.config.ts # Site config (baseUrl: /frootai/)
β βββ sidebars.ts # Docs sidebar structure
βββ mcp-server/ # MCP Server (Node.js, stdio)
β βββ src/
β β βββ index.js # Entry point
β β βββ tools/ # Tool implementations
β βββ package.json
βββ vscode-extension/ # VS Code Extension
β βββ src/
β β βββ extension.ts # Activation entry point
β β βββ commands/ # Command implementations
β β βββ panels/ # Sidebar webview panels
β βββ package.json # Extension manifest
βββ solution-plays/ # 20 solution play directories
β βββ 01-it-ticket-resolution/
β βββ 02-customer-support-agent/
β βββ ...
βββ config/ # Shared configuration
β βββ openai.json
β βββ guardrails.json
β βββ routing.json
βββ CONTRIBUTING.md # Quick contribution guide
βββ LICENSE # MIT
βββ README.md # Project overviewKey Files
| File | Role |
|---|---|
docs/*.md | Knowledge modules β the core content |
website/docusaurus.config.ts | Site configuration, plugins, theme |
website/sidebars.ts | Sidebar navigation tree |
mcp-server/src/index.js | MCP Server entry β tool registration |
vscode-extension/package.json | Extension manifest β commands, views, activation |
config/guardrails.json | Safety and content filtering rules |
3. Adding a New Solution Play
3.1 Step-by-Step
-
Choose a number and slug:
21-my-new-play -
Create the directory structure:
mkdir -p solution-plays/21-my-new-play/.github/prompts mkdir -p solution-plays/21-my-new-play/config mkdir -p solution-plays/21-my-new-play/evaluation -
Write the README.md β Overview, architecture, value proposition, deployment steps.
-
Write the agent.md (1500β5000 bytes):
# Agent Rules: My New Play ## Context You are an AI agent specializing in [scenario]. ## Rules 1. Use Managed Identity (no API keys) 2. Read config files from config/ for parameters 3. Follow these behavior rules: [specifics] 4. Include error handling + logging -
Write copilot-instructions.md β Project context for GitHub Copilot.
-
Add config files:
config/agents.jsonβ Model and routing parameters- Add other config files as needed
-
Create evaluation set:
evaluation/golden-set.jsonlβ At least 5 input/output pairsevaluation/evaluate.pyβ Scoring script
-
Add prompts:
prompts/init.prompt.mdβ Bootstrap prompt- Additional prompts as needed
3.2 Validation Checklist
Before submitting a PR, verify:
-
README.mdexists and is >500 bytes -
agent.mdexists and is 1500β5000 bytes -
copilot-instructions.mdexists - At least one config file in
config/ -
evaluation/golden-set.jsonlhas 5+ examples -
evaluation/evaluate.pyruns without errors - No API keys or secrets in any file
- All file names use kebab-case
3.3 CI Validation
The validate-plays.yml workflow automatically checks:
- Required file existence
agent.mdbyte-size range- JSON validity of config files
- JSONL validity of golden sets
4. Improving Existing Content
4.1 Knowledge Modules (docs/)
- Each module is a standalone Markdown file
- Front matter must include
sidebar_positionandtitle - Use Mermaid diagrams for architecture visuals
- Include practical examples, not just theory
- Target 800β3000 lines per module
4.2 Agent Rules (agent.md)
When improving a playβs agent.md:
- Keep it within 1500β5000 bytes
- Include: context, rules, tool references, error handling
- Be specific about what the agent should/shouldnβt do
- Reference config files by path
4.3 Config Files
- All JSON must be valid and formatted
- Include comments (via
_commentfields) for documentation - Default values should be production-safe
- Guardrails should be strict by default
5. MCP Server Development
5.1 Adding a New Tool
-
Create
mcp-server/src/tools/my-new-tool.js:module.exports = { name: "my_new_tool", description: "What this tool does", inputSchema: { type: "object", properties: { query: { type: "string", description: "The search query" } }, required: ["query"] }, handler: async ({ query }) => { // Implementation return { content: [{ type: "text", text: "Result" }] }; } }; -
Register in
mcp-server/src/index.js:const myNewTool = require("./tools/my-new-tool"); server.addTool(myNewTool); -
Test locally:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"my_new_tool","arguments":{"query":"test"}}}' | node src/index.js
5.2 Tool Categories
| Category | Convention | Network? |
|---|---|---|
| Static | Returns bundled data | No |
| Live | Fetches external data | Yes |
| Chain | Multi-step orchestration | Depends |
| AI Ecosystem | Model/pattern guidance | No |
5.3 Testing
cd mcp-server
npm test # Unit tests
npm run test:integration # Integration tests (requires network for live tools)6. VS Code Extension Development
6.1 Running in Dev Mode
- Open
vscode-extension/in VS Code - Press
F5β launches Extension Development Host - Changes hot-reload on recompile
6.2 Adding a Command
-
Register in
package.jsonundercontributes.commands:{ "command": "frootai.myCommand", "title": "FROOT: My Command", "category": "FROOT" } -
Implement in
src/commands/my-command.ts:import * as vscode from "vscode"; export function registerMyCommand(context: vscode.ExtensionContext) { context.subscriptions.push( vscode.commands.registerCommand("frootai.myCommand", async () => { // Implementation vscode.window.showInformationMessage("Done!"); }) ); } -
Wire up in
src/extension.ts:import { registerMyCommand } from "./commands/my-command"; registerMyCommand(context);
6.3 Sidebar Panels
Panels are implemented as webview providers in src/panels/. Each panel:
- Returns HTML content for the webview
- Uses message passing for interaction
- Follows the existing dark theme / green accent pattern
7. Website Development
7.1 Adding a Page
Create website/src/pages/my-page.tsx:
import React from "react";
import Layout from "@theme/Layout";
import Link from "@docusaurus/Link";
import styles from "./index.module.css";
export default function MyPage(): JSX.Element {
return (
<Layout title="My Page" description="Description for SEO">
<div style={{ maxWidth: "900px", margin: "0 auto", padding: "48px 24px 80px" }}>
<h1>My Page</h1>
{/* Content */}
</div>
</Layout>
);
}The page will be available at /frootai/my-page.
7.2 Docusaurus Conventions
- Pages β
website/src/pages/*.tsx(React) or.md(Markdown) - Docs β
docs/*.md(Markdown with front matter) - Styles β Use existing
index.module.cssclasses (glowCard,glowPill,ctaPrimary) - Sidebar β Edit
website/sidebars.tsto add docs to navigation - Config β
website/docusaurus.config.tsfor site-wide settings
7.3 Local Development
cd website
npx docusaurus start # Dev server with hot reload
npx docusaurus build # Production build
npx docusaurus serve # Serve production build locally8. Testing & CI
8.1 validate-plays.yml
Runs on every push that touches solution-plays/:
- Checks required files exist
- Validates
agent.mdsize (1500β5000 bytes) - Validates JSON/JSONL files
- Reports failures as PR checks
8.2 Manual Testing
Before submitting a PR:
# Website builds
cd website && npx docusaurus build
# MCP server starts
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | node mcp-server/src/index.js
# Extension compiles
cd vscode-extension && npm run compile
# Play validation passes
python scripts/validate-plays.py9. PR Review Process
9.1 What Reviewers Look For
- Completeness β All required files present
- Quality β agent.md is specific, not generic
- Security β No API keys, secrets, or PII
- Consistency β Naming follows conventions
- Testing β Evaluation set covers edge cases
- Documentation β README explains what and why
9.2 PR Template
Every PR fills out the template with:
- Summary of changes
- Type (feature / fix / docs / play)
- Checklist of validation steps completed
9.3 Review Timeline
- Small fixes: 1β2 days
- New plays: 3β5 days
- Architecture changes: require discussion first
10. Code Style
10.1 Naming
| Item | Convention | Example |
|---|---|---|
| Directories | kebab-case | solution-plays/01-it-ticket-resolution |
| Markdown files | PascalCase or kebab-case | RAG-Architecture.md, admin-guide.md |
| JSON files | kebab-case | model-comparison.json |
| TypeScript | camelCase (vars/functions), PascalCase (types) | fetchModule(), ToolConfig |
| CSS classes | camelCase (CSS modules) | glowCard, heroTitle |
10.2 Comments
- Use JSDoc for TypeScript functions
- Use
#comments in shell scripts - Use
//comments in JSON (via_commentfields) - Markdown files donβt need code comments β the content IS the documentation
10.3 Encoding
- All files: UTF-8
- Line endings: LF (not CRLF)
- Indentation: 2 spaces (TypeScript, JSON, YAML), 4 spaces (Python)
- Max line length: 120 characters (soft limit)
> Next: Admin Guide Β· User Guide Β· API Reference