Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/highflame-ai/ai-factory --skill architect명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
Review and clean up the standing Claude Code permission grants that accumulate in .claude/settings.json and settings.local.json via "always allow" — classify each allow rule by risk (destructive commands, credential exposure, credential-store reads, broad wildcards), then interactively remove the ones you don't want as permanent grants. Use periodically, or when `aif doctor`'s permissions-audit check fails. Auditing is safe-by-default; every removal is confirmed.
Create or update a domain expert — a curated, path-scoped context bundle distilled from the org's own docs and code, injected only when a change touches its domain. Use to capture "what someone working in <area> needs to know" (a framework, a service, a data store, a product domain) so future work in that area starts with the right context instead of rediscovering it. Distinct from references/ (static global checklists) and lessons (per-incident).
Bootstrap .aif/ structure in a new repo or subdirectory
SOC 직업 분류 기준
SKILL.md 표시 중
| name | architect |
| description | Design architecture and break requirement into tasks |
| argument-hint | REQ-xxx ID or requirement description |
You are designing architecture and breaking a requirement into implementable tasks.
!sh .aif/partials/ethos-include.sh 2>/dev/null || sh ~/.claude/skills/partials/ethos-include.sh
cat .aif/templates/task-template.md 2>/dev/null || cat ~/.claude/skills/templates/task-template.md 2>/dev/null || echo "No task template found"grep -rl 'status: draft\|status: approved\|status: in-progress' .aif/specs/*/requirement.md 2>/dev/null | head -20 || echo "No active specs"Context files loaded on demand: .aif/context/architecture.md and .aif/context/conventions.md are loaded by Step 1 below — skip the Read if they are already in the current conversation (e.g., when invoked from /proceed, which preloads them at Phase 0).
Requirement: $ARGUMENTS
Before proceeding, verify that .aif/context/architecture.md and .aif/context/conventions.md exist. If either is missing, stop and tell the user: "The .aif/ structure hasn't been fully initialized. Run /init first to set up the project context."
.aif/specs/REQ-xxx-*/requirement.md.aif/specs/ for the matching requirementdraft or approved (not already complete).aif/context/architecture.md and .aif/context/conventions.md are NOT already in your conversation context (e.g., this skill is being run standalone, not from /proceed), Read them now. Otherwise skip — they're already loaded..aif/knowledge/assumptions/ for prior decisions that may affect design.aif/knowledge/lessons/ with patterns like component:.*<affected-area> or domain:.*<domain> to identify matching files. Then Read ONLY those matched files. Do NOT read all lessons. Note applicable lessons in your architecture rationale so past mistakes aren't repeated and proven patterns are reused.Launch 3 formal exploration agents in parallel using the Agent tool. Each agent is defined in ~/.claude/agents/ with model selection (haiku for fast exploration) and read-only tool restrictions.
Read the key files identified by agents
Retain the architecture-mapper affected-file list (the first column of its "Files to
Modify" + "Files to Create" tables, bare paths) as $MAPPER_PATHS — one path per line. This
is NOT the footprint source anymore (tasks are, per REQ-484); it is kept only as the BR-4
graceful-degradation fallback consumed by Step 5 when a task carries no file list.
Note (REQ-484): footprint publishing has moved to Step 5, which runs AFTER task creation. Per-repo attribution is derived from the task files'
repo:frontmatter, so the publish step MUST run once those files exist — not here during codebase exploration. The mapper output is retained (item 3) only as the BR-4 fallback.
.aif/specs/REQ-xxx-*/architecture.md.aif/context/architecture.md).aif/context/architecture.md with rationale.aif/specs/REQ-xxx-*/tasks/ directory.aif/config.yml exists in the primary repo and declares a repos: block with more than one entry.
repo: on each task to the primary repo id (or omit — /proceed will backfill). Files listed under "Files to Create/Modify" all live in the primary repo.repo: field naming one of the ids under repos:. Group files by repo — a single task should not modify files in multiple repos. If a piece of work spans repos (e.g., an API contract change requires matching backend and frontend edits), split it into at least two tasks with an explicit dependency between them.TASK-xxx-description.md for each task using the template from .aif/templates/task-template.mddraft), parent REQ, created/updated dates, dependencies, repo: (required in cross-repo mode)Runs AFTER task creation so per-repo repo: attribution from the task files is available
(REQ-484 ADR-2 / OQ-1). Under /proceed, a draft PR already exists per touched repo (Step 0),
each recorded in pipeline-state.json repos[<id>].prNumber. Publish each repo's own
footprint into that repo's draft PR — one fenced aif-footprint block per PR, each line
repo-qualified <repo-id>:<path-or-glob> (the schema /manifest parses; see
.aif/specs/REQ-483-*/architecture.md and .aif/specs/REQ-484-*/architecture.md). Idempotent
(replace any prior block). Skip with a one-line note if there is no draft PR (standalone
/architect, no /proceed).
Attribution (BR-1, BR-6, ADR-1). A repo's footprint is the union of
## Files to Create/Modify paths across tasks whose repo: frontmatter equals that repo id. A
task with no repo: field attributes to the primary repo (single-repo projects omit
repo:), so single-repo REQs derive from tasks via this same path — NOT via the BR-4
mapper-fallback. A path is attributed to a repo solely by its task's repo: tag — never
broadcast to all PRs, never inferred from the path string.
Iterate every PR (BR-2, BR-3). Loop over every touched repo's prNumber from
pipeline-state.json — do NOT use head -1. Each PR receives only its own repo's lines. In
single-repo mode the loop degenerates to one repo / one PR / one block, with no separate code
path and no "coarse" flag.
Sanitize on write (BR-5, LESSON-008). Every emitted line MUST pass the same validation the
read side applies — reject any line containing .., then charset-validate
^[A-Za-z0-9_.-]*:?[A-Za-z0-9_./*-]+$ — BEFORE it is written to any PR body.
Graceful degradation, never error (BR-4). A task with no file list, or a touched repo with
no tasks attributing files, falls back to the architecture-mapper paths attributed to the
primary repo, emitting a one-line source: mapper-fallback notice. A repo with genuinely
zero attributable files is skipped with a note — never publish an empty block silently.
# Forge adapter (REQ-520 BR-1): footprint publish reads/writes the PR body via
# pr_view/pr_edit, never direct gh. Sourced in THIS fence (shell state does not
# cross fences). GitHub backend forwards args verbatim, so the body read/write is
# byte-identical (BR-3).
. .aif/partials/forge.sh 2>/dev/null || . ~/.claude/skills/partials/forge.sh
# Scope to THIS REQ's spec dir. $REQ is the REQ id (e.g. REQ-484) the skill is operating on;
# fall back to the lone pipeline-state.json if $REQ is unset (resolve to its spec dir either way).
# find, not ls globs: zsh errors on unmatched globs ("no matches found") instead of
# passing the pattern through, so a glob here breaks sh/bash/zsh parity.
state=""
if [ -n "$REQ" ]; then
state=$(find .aif/specs -type f -path "*/${REQ}-*/pipeline-state.json" 2>/dev/null | sort | head -1)
fi
[ -n "$state" ] || state=$(find .aif/specs -type f -path "*/REQ-*/pipeline-state.json" 2>/dev/null | sort | head -1)
[ -n "$state" ] || { echo "architect: no pipeline-state.json — standalone run, skipping footprint publish"; exit 0; }
specdir=$(dirname "$state") # THIS REQ's spec dir — task glob is scoped here, not all specs.
tick=$(printf '\140\140\140')
tab=$(printf '\t')
# Primary repo id (tasks with no repo: attribute here). The parse targets the pretty-printed
primary=$(awk 2>/dev/null)
repos_prs=$(awk -v TAB= 2>/dev/null)
[ -n ] || { ; 0; }
| IFS= -r repo prnum;
[ -n ] && [ -n ] ||
lines=
IFS= -r tf;
[ -f ] ||
trepo=$(sed -nE | -1)
[ -n ] || trepo=
[ = ] ||
paths=$(awk \
| sed -nE )
[ -n ] && lines=$( )
<<
safe=$( | sed \
| IFS= -r p; ; \
| grep -vE | grep -E | -u)
[ -z ];
[ = ] && [ -n ];
safe=$( | sed \
| IFS= -r p; ; \
| grep -vE | grep -E | -u)
[ -n ] &&
[ -z ];
tmp=$( ) ||
base=$(aif_forge_pr_view --json body -q .body 2>/dev/null);
base=$( | sed )
{ ; ; ; } >
aif_forge_pr_edit --body-file >/dev/null 2>&1 &&
-f
$MAPPER_PATHS holds the architecture-mapper affected-file list (bare paths, no repo column)
captured during Step 2 — used only for the BR-4 primary-repo fallback when a task carries no file
list. Other sessions read each block via aif_forge_pr_view --json body (consumed by /manifest's
ordering verdict). The block is split-free (newline iteration, no unquoted word-splitting) so it
behaves identically under sh and zsh (LESSON-329), and uses mktemp + cleanup per PR.
draft to approvedupdated date/validate before starting implementationrepo: field naming a valid repo id from .aif/config.yml, and all files in that task live in that repo