add-a-feature

Scaffolds a new self-contained feature folder in the FoolProof Telegram bot codebase.

Updated Jul 28, 2026
One-click install
npx skills add https://github.com/oleg-vasilyev/FoolProof --skill add-a-feature-oleg-vasilyev
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: add-a-feature
Source: https://github.com/oleg-vasilyev/FoolProof/tree/main/.claude/skills/add-a-feature
Command: npx skills add https://github.com/oleg-vasilyev/FoolProof --skill add-a-feature-oleg-vasilyev

SYSTEM DOCUMENTATION & REQUIREMENTS

What problem does it solve? Adding a command or screen to the FoolProof Telegram bot requires touching many conventions at once — folder layering, the feature contract, import aliases, lint zones, and test placement — and missing any one of them silently breaks the rule that a feature folder must be deletable without breaking the build. ## Core Features & Use Cases - Feature folder scaffolding: Defines the layered structure (domain, render, bot, samples) with downward-only imports and a composition-root entry point. - Feature contract guidance: Specifies how commands, listeners, resume, and stop hooks are declared so the installer registers them safely and no handler swallows another feature's input. - Lint zone verification: Requires proving each new ESLint zone actually fails on a deliberate violation, covering flat-config replacement, minimatch comment pitfalls, and dynamic-import blind spots. - Use Case: When adding a new bot command like a player statistics screen, follow this Skill to create the folder, declare it in package.json and main.ts, fence it with lint zones, and wire tests and copy correctly. ## Quick Start Ask the AI to add a new feature folder for a new bot command following the add-a-feature conventions before writing any implementation code.

Frequently Asked Questions about add-a-feature

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I add a new command to a grammY Telegram bot feature?▼

Create a feature folder with an entry point that returns a Feature object declaring commands with menuDescription and help strings. The installer registers commands before text listeners, so /help and the command menu are generated from that single list.

How do I structure a feature folder so it stays deletable?▼

Use layered subfolders — domain, render, bot, and optional samples — with imports pointing downward only and no imports from other features. Verify deletability by removing the folder and running the typecheck; only main.ts and main.spec.ts should fail.

Why does my ESLint flat config zone never fire?▼

A later flat-config block replaces an earlier one for matching files, minimatch treats a leading # as a comment, and no-restricted-imports misses dynamic await import calls. Prove each zone by writing a deliberate violation and watching the lint fail.

Why does one bot feature's callback handler break another's buttons?▼

A bare bot.on("callback_query:data") handler sees every tap and answers for data it does not own. Pass a feature-owned pattern to onTap so each feature only matches its own callback_data, and let the installer answer unmatched taps.

When should a new feature update PLAN.md?▼

A feature that adds a repository method or a screen with states is a contract-changing phase and owes a PLAN.md section. Purely internal additions that change no declared contract do not require one.