用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/CodySwannGT/lisa --skill directory-structure命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
This skill should be used for any non-trivial request — features, bugs, stories, epics, spikes, or multi-step tasks. It accepts a ticket URL (Jira, Linear, GitHub), a file path containing a spec, or a plain-text prompt. It assembles an agent team, breaks the work into structured tasks, and manages the full lifecycle from research through implementation, code review, deploy, and empirical verification.
any non-trivial request —…
This skill should be used for any non-trivial request — features, bugs, stories, epics, spikes, or multi-step tasks. It accepts a ticket URL (Jira, Linear, GitHub), a file path containing a spec, or a plain-text prompt. It assembles an agent team, breaks the work into structured tasks, and manages the full lifecycle from research through implementation, code review, deploy, and empirical verification.
基于 SOC 职业分类
正在显示 SKILL.md
| name | directory-structure |
| description | This skill enforces the… |
This skill ensures all new code follows the documented directory structure standards. It validates file placement, enforces the Container/View pattern, and ensures proper organization of features, components, and tests.
Expo SDK 55+/56 adopts the /src convention: all application source lives
under src/, while config, assets, tests, and tooling stay at the project root.
Older projects keep source at the root. The structure below shows the /src
layout; for a root-layout project, read src/<dir> as <dir>. The @/*
TypeScript path alias points at ./src/* (or ./* for root layout), so imports
are identical either way. The validator and lint/coverage configs auto-detect a
src/ directory.
<project-root>/
├── src/ # APPLICATION SOURCE (SDK 55+/56 /src convention)
│ ├── app/ # Expo Router - THIN WRAPPERS ONLY
│ ├── features/ # Feature modules - PRIMARY CODE LOCATION
│ ├── components/ # Shared components
│ │ ├── ui/ # GlueStack UI primitives
│ │ ├── icons/ # Icon components
│ │ ├── custom/ # Custom UI components
│ │ └── [ComponentName]/ # Feature-agnostic components
│ ├── hooks/ # Global hooks (with __tests__/)
│ ├── providers/ # Global React context providers (with __tests__/)
│ ├── stores/ # Global state - Apollo reactive variables (with __tests__/)
│ ├── utils/ # Utility functions (with __tests__/)
│ ├── lib/ # Utility libraries / integrations
│ ├── types/ # Global TypeScript types
│ ├── generated/ # Auto-generated GraphQL types (DO NOT EDIT)
│ ├── config/ # Configuration files
│ └── constants/ # Global constants
├── assets/ # Static assets (fonts/, icons/, css/) — STAYS AT ROOT
├── e2e/ # End-to-end tests (fixtures/, pages/, tests/, utils/) — STAYS AT ROOT
├── scripts/ # Build and development scripts — STAYS AT ROOT
├── public/ # Public web assets — STAYS AT ROOT
├── __mocks__/ # Jest manual mocks — STAYS AT ROOT
├── docs/ # Documentation — STAYS AT ROOT
└── projects/ # Project-specific files (archive/) — STAYS AT ROOT
Each feature in features/ MUST follow this structure:
features/[feature-name]/
├── components/ # Feature-specific components
│ └── [ComponentName]/ # Each component in its own directory
│ ├── [ComponentName]Container.tsx
│ ├── [ComponentName]View.tsx
│ └── index.tsx
├── screens/ # Screen components (same pattern as components)
│ └── [ScreenName]/
│ ├── [ScreenName]Container.tsx
│ ├── [ScreenName]View.tsx
│ └── index.tsx
├── hooks/ # Feature-specific hooks
│ └── __tests__/ # Hook tests
├── stores/ # Feature state (Apollo reactive variables)
├── utils/ # Feature utilities
│ └── __tests__/ # Utility tests
├── types.ts # Feature TypeScript types
├── constants.ts # Feature constants
├── config/ # Feature configuration
└── operations.graphql # GraphQL queries/mutations
Components and screens MUST follow the Container/View pattern:
[Name]Container.tsx)[Name]View.tsx)memo()index.tsx)// PlayerCard/PlayerCardContainer.tsx
export const PlayerCardContainer = () => {
const { data, loading } = useQuery(GET_PLAYER);
const handleClick = useCallback(() => {}, []);
return <PlayerCardView data={data} loading={loading} onClick={handleClick} />;
};
// PlayerCard/PlayerCardView.tsx
export const PlayerCardView = memo(({ data, loading, onClick }: Props) => {
if (loading) return <Skeleton />;
return <Pressable onPress={onClick}>...</Pressable>;
});
// PlayerCard/index.tsx
export { PlayerCardContainer as default } from './PlayerCardContainer';
The app/ directory contains Expo Router file-based routing. Route files MUST be thin wrappers:
// app/(root)/(tabs)/players/[playerId]/index.tsx
import { Main } from "@/features/player-detail/screens/Main";
export default function PlayerDetailScreen() {
return <Main />;
}
Test files MUST be placed in __tests__/ subdirectories:
hooks/
├── usePlayer.ts
└── __tests__/
└── usePlayer.test.ts
utils/
├── formatDate.ts
└── __tests__/
└── formatDate.test.ts
*.test.ts or *.test.tsx*.spec.ts or *.spec.tsxTo validate directory structure, run the validation script:
python3 .claude/skills/directory-structure/scripts/validate_structure.py [path]
The script checks:
__tests__/ directories| File Type | Correct Location |
|---|---|
| Feature component | features/[feature]/components/[Name]/ |
| Feature screen | features/[feature]/screens/[Name]/ |
| Feature hook | features/[feature]/hooks/ |
| Feature test | features/[feature]/hooks/__tests__/ |
| Global hook | hooks/ |
| Global hook test | hooks/__tests__/ |
| Shared component | components/[Name]/ |
| UI primitive | components/ui/ |
| Global utility | utils/ |
| Global utility test | utils/__tests__/ |
| Route wrapper | app/(root)/... |
| GraphQL types | generated/ (auto-generated) |
app/ - Route files are wrappers only__tests__/ subdirectory