Skip to main content

Naming Conventions

All FrootAI primitives follow strict naming conventions enforced by npm run validate:primitives. The golden rule: lowercase-hyphen for everything.

General Rulesโ€‹

  • All files and folders use lowercase-hyphen (kebab-case)
  • No underscores, no camelCase, no PascalCase
  • No spaces in file or folder names
  • UTF-8 encoding (no BOM) on all files

Primitives by Typeโ€‹

Agents (.agent.md)โ€‹

agents/
โ”œโ”€โ”€ fai-rag-architect.agent.md โœ… lowercase-hyphen
โ”œโ”€โ”€ fai-security-reviewer.agent.md โœ… lowercase-hyphen
โ”œโ”€โ”€ fai-play-01-builder.agent.md โœ… play-specific agent
โ”œโ”€โ”€ RagArchitect.agent.md โŒ PascalCase
โ””โ”€โ”€ rag_architect.agent.md โŒ underscore

Naming pattern: fai-{name}.agent.md

Frontmatter requirements:

---
description: "10+ character description" # Required
tools: ["codebase", "terminal"] # Optional
model: ["gpt-4o", "gpt-4o-mini"] # Optional (array)
waf: ["security", "reliability"] # Optional
plays: ["01-enterprise-rag"] # Optional
---

Instructions (.instructions.md)โ€‹

instructions/
โ”œโ”€โ”€ waf-security.instructions.md โœ…
โ”œโ”€โ”€ python-coding.instructions.md โœ…
โ”œโ”€โ”€ rag-patterns.instructions.md โœ…
โ”œโ”€โ”€ WAF_Security.instructions.md โŒ PascalCase + underscore
โ””โ”€โ”€ security.md โŒ missing .instructions suffix

Naming pattern: {name}.instructions.md

Frontmatter requirements:

---
description: "10+ character description" # Required
applyTo: "**/*.{ts,js,py}" # Required โ€” glob pattern
waf: ["security"] # Optional
---

Skills (SKILL.md in folder)โ€‹

skills/
โ”œโ”€โ”€ fai-play-initializer/
โ”‚ โ””โ”€โ”€ SKILL.md โœ… name matches folder
โ”œโ”€โ”€ fai-rag-indexer/
โ”‚ โ”œโ”€โ”€ SKILL.md โœ…
โ”‚ โ””โ”€โ”€ index.sh โœ… optional bundled assets
โ”œโ”€โ”€ PlayInitializer/
โ”‚ โ””โ”€โ”€ SKILL.md โŒ PascalCase folder
โ””โ”€โ”€ fai-play-initializer.md โŒ not in a folder

Naming pattern: fai-{name}/SKILL.md (folder name = skill name)

Frontmatter requirements:

---
name: fai-play-initializer # Required โ€” must match folder
description: "10-1024 char description" # Required
---
warning

The name field in SKILL.md frontmatter must exactly match the parent folder name. This is validated by CI.

Hooks (hooks.json in folder)โ€‹

hooks/
โ”œโ”€โ”€ frootai-secrets-scanner/
โ”‚ โ”œโ”€โ”€ hooks.json โœ…
โ”‚ โ””โ”€โ”€ scan-secrets.sh โœ… referenced script
โ”œโ”€โ”€ frootai-tool-guardian/
โ”‚ โ”œโ”€โ”€ hooks.json โœ…
โ”‚ โ””โ”€โ”€ guard-tools.sh โœ…
โ””โ”€โ”€ SecretsScanner/
โ””โ”€โ”€ hooks.json โŒ PascalCase folder

Naming pattern: {name}/hooks.json

Required fields:

{
"version": 1,
"hooks": [
{
"event": "SessionStart",
"steps": [
{
"type": "shell",
"command": "bash ${__dirname}/scan-secrets.sh"
}
]
}
]
}

Plugins (plugin.json in folder)โ€‹

plugins/
โ”œโ”€โ”€ enterprise-rag/
โ”‚ โ”œโ”€โ”€ plugin.json โœ…
โ”‚ โ””โ”€โ”€ README.md โœ… recommended
โ”œโ”€โ”€ EnterpriseRAG/
โ”‚ โ””โ”€โ”€ plugin.json โŒ PascalCase folder
โ””โ”€โ”€ enterprise_rag/
โ””โ”€โ”€ plugin.json โŒ underscore

Naming pattern: {name}/plugin.json (folder name = plugin name)

Required fields:

{
"name": "enterprise-rag",
"description": "Complete RAG pipeline with security hooks",
"version": "1.0.0",
"author": { "name": "Your Name" },
"license": "MIT"
}
info

The name field in plugin.json must match the parent folder name.

FAI Manifest (fai-manifest.json)โ€‹

{
"play": "01-enterprise-rag",
"version": "1.0.0"
}
  • play field must match the folder name: NN-kebab-case
  • version must be valid semver: X.Y.Z

FAI Context (fai-context.json)โ€‹

Placed as a sibling to standalone primitives:

agents/
โ”œโ”€โ”€ fai-rag-architect.agent.md
โ””โ”€โ”€ fai-rag-architect/
โ””โ”€โ”€ fai-context.json

Solution Play Foldersโ€‹

solution-plays/
โ”œโ”€โ”€ 01-enterprise-rag/ โœ… NN-kebab-case
โ”œโ”€โ”€ 02-ai-landing-zone/ โœ…
โ”œโ”€โ”€ enterprise-rag/ โŒ missing number prefix
โ””โ”€โ”€ 01_enterprise_rag/ โŒ underscore

Pattern: NN-kebab-case where NN is a two-digit number (01โ€“99).

Validationโ€‹

Run the validation script to check all naming conventions:

npm run validate:primitives

This checks every primitive file in the repository for:

  • Correct file extensions and naming patterns
  • Required frontmatter fields
  • Name-to-folder matching for skills and plugins
  • Valid lifecycle events for hooks

Next Stepsโ€‹