From hw
Manage Hypo-Workflow Cycles with independent milestone sequences, state, progress, reports, archives, and summaries.
npx claudepluginhub hypoxanthineovo/hypo-workflow --plugin hwThis skill uses the workspace's default tool permissions.
📌 输出语言规则:
Manages project milestones: create new cycles with phases, complete/archive versions, preview changes, audit integration, analyze gaps. For structured delivery checkpoints.
Reports status of active development cycles including ID, task progress, current gate, metrics, and elapsed time; cancels cycles with confirmation. Reads current-cycle.json state files.
Orchestrates git-only agile workflows with checkpoint-based flow control for task cycles, daily standups, sprints, and retrospectives. Use for 'run workflow', 'what's next', or guided development steps.
Share bugs, ideas, or general feedback.
📌 输出语言规则: 读取 config.yaml → output.language
Use this skill when the user invokes /hw:cycle or /hypo-workflow:cycle.
Cycles are project-level delivery containers. Each Cycle owns its own milestone sequence, .pipeline/state.yaml, .pipeline/PROGRESS.md, .pipeline/prompts/, and .pipeline/reports/. Milestone numbers restart from M0 inside every Cycle. Cross-Cycle files stay in place.
All paths are relative to .pipeline/ unless a project-root path is explicitly named:
.pipeline/cycle.yaml.pipeline/archives/C{N}-{slug}/.pipeline/patches/PROJECT-SUMMARY.md.pipeline/architecture.md, .pipeline/config.yaml, .pipeline/log.yaml, .pipeline/patches/.pipeline/knowledge/Supported forms:
/hw:cycle new "名称" [--type feature|bugfix|refactor|spike|hotfix] [--context audit,patches,deferred,debug]/hw:cycle list/hw:cycle view C{N} or /hw:cycle view 0/hw:cycle close [--reason "..."] [--paused]/hw:accept/hw:reject "<feedback>"Create .pipeline/cycle.yaml with this shape:
cycle:
number: 1
name: "初始开发"
type: feature
status: active
started: "2026-04-28T12:00:00+08:00"
preset: tdd
context_sources: []
previous_cycle: null
summary: null
lessons: null
Use an ISO-8601 timestamp with timezone. Resolve timezone from output.timezone; default to Asia/Shanghai.
feature -> tddrefactor -> tddbugfix -> implement-onlyspike -> implement-onlyhotfix -> implement-onlyThe user may edit .pipeline/cycle.yaml to override cycle.preset. Do not overwrite a user override unless the user explicitly asks.
/hw:cycle new.pipeline/config.yaml and optional ~/.hypo-workflow/config.yaml..pipeline/cycle.yaml exists and cycle.status=active, first run the archive flow from this skill before creating the new Cycle..pipeline/cycle.yaml.pipeline/archives/C*/cycle.yamlC{N}-*C1.--type; default to feature if omitted.--context; store supported values in cycle.context_sources..pipeline/cycle.yaml..pipeline/state.yaml from assets/state-init.yaml.pipeline/prompts/.pipeline/reports/.pipeline/PROGRESS.md if it belongs to the prior Cycle.pipeline/architecture.md.pipeline/config.yaml.pipeline/log.yaml.pipeline/patches/.pipeline/archives/Compatibility: projects without .pipeline/cycle.yaml are treated as an implicit C1 only for display and migration context. /hw:init must not create .pipeline/cycle.yaml.
/hw:cycle closeClose the active Cycle and archive its local artifacts.
Cycle 0 Legacy is already closed by definition. If the user asks to close Cycle 0, stop and report that Legacy history cannot be closed again.
Status rules:
completed--reason "..." -> abandoned and record the reason as cycle.lessons--paused -> pausedpending_acceptance until /hw:accept or /hw:rejectExecution:
.pipeline/cycle.yaml. If it is missing, say there is no explicit active Cycle and keep old projects unchanged..pipeline/state.yaml if present.cycle.status, cycle.summary, cycle.lessons, and finish timestamp.compact.auto=true, regenerate compact views before archiving so the latest active Cycle context is represented.PROJECT-SUMMARY.md.compact.auto=true, regenerate compact views again after archiving so persistent files and closed patches have fresh summaries..pipeline/ containing only persistent files plus any newly generated summary.Create .pipeline/archives/C{N}-{slug}/ and move or copy files as follows:
.pipeline/PROGRESS.md -> archives/C{N}-{slug}/PROGRESS.md.pipeline/state.yaml -> archives/C{N}-{slug}/state.yaml.pipeline/cycle.yaml -> archives/C{N}-{slug}/cycle.yaml.pipeline/prompts/ -> archives/C{N}-{slug}/prompts/.pipeline/reports/ -> archives/C{N}-{slug}/reports/.pipeline/architecture.md -> archives/C{N}-{slug}/architecture-snapshot.md.pipeline/archives/C{N}-{slug}/knowledge-summary.md from .pipeline/knowledge/knowledge.compact.md when presentAfter moving directories, recreate empty .pipeline/prompts/ and .pipeline/reports/ only when a new Cycle is being created immediately. For close-only, leave them absent unless the project tooling requires empty directories.
Do not archive or delete:
.pipeline/architecture.md.pipeline/config.yaml.pipeline/log.yaml.pipeline/patches/.pipeline/knowledge/.pipeline/archives/PROJECT-SUMMARY.md.pipeline/*.compact.* regenerated by /hw:compactDo not archive, move, or delete .pipeline/knowledge/. It is persistent cross-Cycle memory. The archive may contain only a generated knowledge-summary.md snapshot.
When acceptance mode is manual, a completed Cycle enters pending_acceptance instead of archiving immediately. In timeout mode, status surfaces may deterministically show automatic acceptance after acceptance.timeout_hours; this is a read/check decision and must not be implemented as a background state mutation.
Authoritative state lives in .pipeline/cycle.yaml:
cycle:
status: pending_acceptance
acceptance:
mode: manual
state: pending
requested_at: "2026-05-03T00:10:00+08:00"
state.yaml may mirror compact status only:
acceptance:
scope: cycle
state: pending
cycle_id: C4
updated_at: "2026-05-03T00:10:00+08:00"
/hw:accept marks cycle.status: completed, cycle.acceptance.state: accepted, updates state.yaml, writes a cycle_accept log entry, and updates PROGRESS.md.
/hw:reject reopens the Cycle as active, writes structured feedback under .pipeline/acceptance/, stores only feedback_ref in state.yaml, writes a cycle_reject log entry, and updates PROGRESS.md. Feedback files should include problem, reproduce_steps, expected, actual, context, iteration, and created_at.
When closing, scan .pipeline/state.yaml before moving it. For every milestone with status: in_progress or status: pending, add an entry to .pipeline/archives/C{N}-{slug}/deferred.yaml:
- milestone: "M3"
name: "..."
reason: "cycle closed"
Also mark the archived state.yaml milestone status as deferred and set deferred_reason: cycle closed when feasible.
Generate .pipeline/archives/C{N}-{slug}/summary.md.
The summary must include:
lessons.pipeline/archives/C{N}-{slug}/knowledge-summary.md existsWrite the summary in output.language; default language is English.
/hw:cycle listList all Cycles from:
.pipeline/archives/cycle-0-legacy/cycle.yaml.pipeline/archives/*/cycle.yaml.pipeline/cycle.yaml when presentShow number, name, type, status, started/finished date, and one-line summary. Include implicit C1 only when there is no explicit Cycle metadata and the old project has .pipeline/state.yaml or prompts.
When .pipeline/archives/cycle-0-legacy/cycle.yaml exists, show it first as:
C0 [Legacy] Legacy (pre-Workflow) — closed — <total_commits> commits / <total_milestones> milestones
/hw:cycle view C{N}Find the Cycle in current metadata or archives. Display:
If the Cycle is missing, list available Cycle numbers.
For /hw:cycle view 0 or /hw:cycle view C0, read .pipeline/archives/cycle-0-legacy/cycle.yaml and display:
After every close or archive, regenerate project-root PROJECT-SUMMARY.md using the rules in /hypo-workflow:status and this skill. This file is cross-Cycle project context and should not be moved into Cycle archives.
PROJECT-SUMMARY.md must follow output.language for:
When output.language is missing, default to English for backward compatibility.
references/commands-spec.md — command parsing and unknown-command behaviorreferences/state-contract.md — milestone status fieldsreferences/progress-spec.md — PROGRESS relationshipreferences/config-spec.md — output language and timezone defaultsSKILL.md — full system context