.github/skills/new-feature/SKILL.md
Implements a new feature using vertical slice architecture and skeleton-first approach. Load when adding a new feature, route, or domain concept to the project. Covers file structure, colocation pattern, implementation order, and how to verify completion. Works regardless of framework.
npx skillsauth add poko8nada/pj_docs new-featureInstall 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.
Build in this order — each step must compile and type-check before proceeding:
Result<T,E> return typesThis order ensures the agent never declares completion without verification. Type errors and failing tests are the definition of "not done".
Every file that belongs to a feature lives alongside it. Never scatter related files across separate top-level directories.
[feature-name]/
├── index.ts # public API — only export what callers need
├── [feature].ts # core logic
├── [feature].types.ts # types and error definitions
├── [feature].schema.ts # validation schemas (Zod etc.) if needed
└── [feature].test.ts # tests colocated here, not in __tests__/
Place this slice wherever your framework dictates — inside app/, src/, routes/,
or a monorepo package. The internal structure above applies regardless.
// [feature].types.ts
import type { Result } from "@/shared/types";
export type [Feature] = {
id: string;
// ...
};
export type [Feature]Error =
| "not-found"
| "invalid-input"
| "unauthorized";
export type [Feature]Result = Result<[Feature], [Feature]Error>;
// [feature].ts — signatures only, no implementation yet
import type { [Feature]Result } from "./[feature].types";
export async function get[Feature](id: string): Promise<[Feature]Result> {
throw new Error("not implemented");
}
export async function create[Feature](
input: unknown,
): Promise<[Feature]Result> {
throw new Error("not implemented");
}
// [feature].test.ts
import { describe, it, expect } from "vitest";
import { get[Feature], create[Feature] } from "./[feature]";
describe("get[Feature]", () => {
it("returns feature when found", async () => {
const result = await get[Feature]("valid-id");
expect(result.ok).toBe(true);
});
it("returns not-found error for unknown id", async () => {
const result = await get[Feature]("unknown-id");
expect(result.ok).toBe(false);
if (!result.ok) expect(result.error).toBe("not-found");
});
});
Fill in logic until all tests pass. Use try-catch only for external I/O.
Return Result<T,E> — never throw across module boundaries.
// Only export what callers outside this slice need
export type { [Feature], [Feature]Error } from "./[feature].types";
export { get[Feature], create[Feature] } from "./[feature]";
Never import from inside a slice except through its index.ts.
This enforces the boundary and keeps grep-ability intact.
pnpm tsc --noEmit passespnpm test passes including all error pathspnpm oxlint . passesindex.tstools
Composite Skill. This skill is used for project planning. Users request that a project plan be created, particularly during the initial stages.
documentation
Core Skill. This skill is for document creation. User ask you to create planning documents, such as requirement and task breakdown.
development
Core Skill. Next.js 15+ App Router architecture guidelines including component patterns, state management with Zustand, server actions, and project structure. Use when developing Next.js applications.
development
Core Skill. HonoX architecture guidelines including file-based routing, Islands pattern, component types, performance optimization, and best practices for full-stack development.