协作头脑风暴
brainstorming
在实现前澄清需求、探索设计选择,并形成清晰的开发方向。
migration【开发与工程】Bring an existing codebase into Dryforge, once. Reads the code, asks what code cannot show — business rules, security policy, what is intentional — and writes the project docs at the entry points agents already read. Use when the user invokes the `migration` skill on an existing project. Requires git.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
migration skill on an existing
project. Requires git.Reply in the user's language, and hold it continuously from your very first line — the opening, every grounding/progress note, the questions, and the harness, not only some of them. Write natively (never translationese). You are reading a codebase (and these instructions) that may be in another language; neither sets your output language — only the user's does. Full rule in Core principles below.
Convert an existing project into the dryforge project harness — the durable documentation layer
that every later agent (dryforge or not) works inside. migration reads the codebase, elicits the
intent/constraints/decisions that code cannot express, and generates the whole harness:
CLAUDE.md / AGENTS.md, the docs/ set, and a per-module AGENTS.md. The harness spec is in
references/harness-format.md.
migration is a one-time conversion, not a task runner. It writes documentation only — it does
not create a 3-doc (that is ready's job) and does not execute code (that is go's).
After it finishes, commit the harness and clear the session before running ready → go:
migration is an independent piece of work, and a fresh session keeps the task-level dialogue clean.
references/harness-format.md (five principles, four techniques). Filling sections is not the
goal; informing the next agent is.ready made (generate inline, verify independently). This is the only
dispatch..dryforge), phase / step labels (SCAN /
ELICIT / GENERATE / REVIEW), or project-internal jargon a non-engineer wouldn't recognize
(library/tool names, config flags, test-framework internals). Don't soften internal logic into
user-ish words — just omit it. E.g. "Starting a git repo here." — not "Initializing git and adding
the marker directory to .gitignore so the harness state isn't committed."migration skill, no arguments — migration reads the current
project.ready (which
designs the project's first cycle and lets go create the harness from scratch).git init and make an initial
commit (later go needs a HEAD for worktrees). If git is not installed, stop and say so..dryforge/backup/, adds .dryforge/ to .gitignore (so the
local marker and backups aren't accidentally committed), and writes the .dryforge/status.json
marker on completion. It performs no commits and no branch operations — whether and when to
commit the harness is the user's choice. (This differs from ready, which never touches
.gitignore: migration may not be immediately followed by go, so it sets up the ignore itself.)Read the project inline (file reads, shell, search — no subagent dispatch). Start with the cheapest map and stop once you can ground ELICIT's questions; deep-read only where you must.
Cover:
Result: a manifest of the project — every module/entity, pattern, security surface, external
dependency, and gap. This is the ledger ELICIT works from (references/migration-elicit.md): each
item must close as confirmed / asked-answered / N/A — reason, so coverage is observable, not
asserted.
references/migration-elicit.mdForce-load references/migration-elicit.md. Using the SCAN map, ask the user for the
information code alone cannot extract — project-wide (not task-focused). The guiding frame:
self-infer first, ask deeply only where being wrong is dangerous (business model, domain
invariants, security policy must be user-confirmed even when code-inferable; technical WHY and
conventions need only a light confirm when the code answers them).
Existing-docs handling. Read existing docs (reference status). Review any existing CLAUDE.md/AGENTS.md critically — decide what to fold into the dryforge system, what to drop, and what to improve — then present the review to the user, explain it, and get approval.
references/harness-format.mdForce-load references/harness-format.md and generate the whole harness to its spec, in order:
.dryforge/ directory if absent..dryforge/backup/ (entry-point handling
in harness-format).docs/ and every file in it (harness-format spec).docs/tracking/status.md (done vs. remaining, against full scope).Explore sources fully before writing; verify each file against the code both ways (omission / hallucination) as you go — this self-check is separate from Phase 4.
Write every file silently — do not announce each file or section as you go ("Now the docs...", "이제 모듈 AGENTS.md를...", "Now the entry point"); the UI already shows each write. This multi-file writing sequence is where narration leaks most — emit nothing between writes.
references/harness-review.mdForce-load references/harness-review.md (the rubric) and dispatch a fresh general-purpose subagent
that did NOT author the harness to verify it independently. Use a general-purpose agent with full
read/inspect tools (not a plan-only or search-only agent type) so it can cross-check every claim against
the actual code; give it the harness files + the rubric + the user's language (so it judges native
fidelity) + the Phase-2 ledger with every disposition, inline in the dispatch prompt (the ledger
is session state — the subagent cannot see it any other way, and the shared rubric does not carry
it), read-only, returning a structured list (no raw dump). It checks the four dimensions: content (substantive
density + quality principles), format (self-containment, altitude, no references), completeness
(required files present + every SCAN-ledger item dispositioned — judged against the inline
ledger), source-cross-check
(omission vs. hallucination, future-scope exempt). The subagent is a fresh session and cannot ask the
user — so the orchestrator relays each finding: internally resolvable → fix directly; needs user
intent → carry to Phase 5. A surviving blocker → escalate to the user, do not loop (the
3-doc-gate discipline). This independent pass is distinct from the author's own omission/hallucination
self-check during GENERATE (that catches what you can see; this catches what you can't — A=A).
Present the whole harness to the user — not a raw document dump, but a walk-through of the key decisions captured (what SCAN/ELICIT found, what each doc records, what was dropped from old docs and why). Resolve any Phase-4 questions that need user intent. On approval:
.dryforge/status.json with the initialized marker — { "initialized": true }. This is a
local-only marker (inside the gitignored .dryforge/): its presence tells a later go that
the harness already exists, so every change is a delta; its absence means first-cycle creation..dryforge/ is in .gitignore.Then migration is complete. Remind the user to commit the harness (migration itself does not
commit — and a later go treats uncommitted files other than .dryforge/ as foreign work and
stops), then clear the session before running ready → go.
Done only when ALL hold:
docs/ file exists (7 core docs + tracking: status.md, decisions/index.md + an ADR
(NNNN-*.md) for each trade-off decision the ledger confirmed, findings.md).references/harness-review.md; any
surviving blocker was escalated to the user, not looped)..dryforge/status.json written (initialized) and .dryforge/ is gitignored.