원클릭으로
Project scaffolding — template copy, Claude-powered placeholder filling, git init
npx skills add https://github.com/seanchiuai/psi --skill scaffold이 명령을 Claude Code에 복사하여 붙여넣어 스킬을 설치하세요
Project scaffolding — template copy, Claude-powered placeholder filling, git init
npx skills add https://github.com/seanchiuai/psi --skill scaffold이 명령을 Claude Code에 복사하여 붙여넣어 스킬을 설치하세요
Patterns learned and validated by Psi
Multi-phase loop that runs Claude Code sessions with signal detection and state management
Click-based CLI entry points — psi new and psi run commands
Two-tier learning system — Tier 1 fast capture via LEARNINGS.md, Tier 2 validated promotion to expertise.yaml
| name | scaffold |
| description | Project scaffolding — template copy, Claude-powered placeholder filling, git init |
psi new copies bundled templates and uses Claude to fill {{PLACEHOLDER}} values. Implemented in src/psi/scaffold.py.
The scaffold flow:
src/psi/template/ tree into target directory{{PLACEHOLDER}} patternsclaude -p (via stdin) to fill every placeholder — output as JSONprompts/phase-1.md from filled development-progress.yamlgit init + initial commitTemplates are bundled in the package at src/psi/template/. Located at runtime via importlib.resources (Python 3.9+ API):
from importlib import resources as importlib_resources
ref = importlib_resources.files("psi") / "template"
For editable installs, this resolves to the real filesystem path. The importlib.resources.files() API is the modern replacement for the deprecated pkg_resources.
All templates use {{UPPERCASE_WITH_UNDERSCORES}} syntax. The scaffold collects all files containing {{...}} patterns, excluding:
skills/create-skill/ directory (its placeholders are instructional, not project-specific)Single prompt, single call. The prompt includes all template file contents and asks Claude to return a JSON object: {"file/path.md": "filled content", ...}.
Claude's response is parsed with json.loads(). If Claude wraps output in markdown code fences, those are stripped first.
| File | Key Placeholders |
|---|---|
CLAUDE.md | APP_DESCRIPTION_ONE_LINE, TECH_STACK_LIST, COMMANDS, SKILLS_LIST, ENV_VARS |
TASKS.md | APP_NAME, task items |
docs/PRD.md | APP_NAME, user stories, acceptance criteria, tech stack, data schema |
docs/design.md | Wireframes, component hierarchy, colors, responsive behavior |
docs/development-progress.yaml | Phase definitions with integer keys (1, 2, 3...) |
prompts/phase-1.md | Phase 1 deliverables and criteria (regenerated from YAML after fill) |
After Claude fills the templates, scaffold.py reads the filled development-progress.yaml, extracts phase 1's definition, and uses PromptGenerator.generate() to create prompts/phase-1.md. This ensures the prompt matches the actual phase definition.
```json ``` wrappingpyproject.toml sets include-package-data = true for git-tracked files[tool.setuptools.package-data] has explicit globs for the .claude/ dot-directory tree since **/* doesn't reliably traverse dot-directories in setuptoolstemplate/.claude/**, template/.claude/hooks/*, template/.claude/skills/**/*src/psi/scaffold.py — Main scaffold logicsrc/psi/template/ — Bundled template treesrc/psi/prompt_generator.py — Phase-1 prompt generationpyproject.toml — Package data configuration