@jahanxu/trellis 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +235 -0
- package/README.md +212 -0
- package/bin/trellis.js +3 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +97 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/init.d.ts +21 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +527 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/update.d.ts +27 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +1289 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/configurators/antigravity.d.ts +8 -0
- package/dist/configurators/antigravity.d.ts.map +1 -0
- package/dist/configurators/antigravity.js +18 -0
- package/dist/configurators/antigravity.js.map +1 -0
- package/dist/configurators/claude.d.ts +32 -0
- package/dist/configurators/claude.d.ts.map +1 -0
- package/dist/configurators/claude.js +98 -0
- package/dist/configurators/claude.js.map +1 -0
- package/dist/configurators/codex.d.ts +8 -0
- package/dist/configurators/codex.d.ts.map +1 -0
- package/dist/configurators/codex.js +20 -0
- package/dist/configurators/codex.js.map +1 -0
- package/dist/configurators/cursor.d.ts +5 -0
- package/dist/configurators/cursor.d.ts.map +1 -0
- package/dist/configurators/cursor.js +52 -0
- package/dist/configurators/cursor.js.map +1 -0
- package/dist/configurators/gemini.d.ts +8 -0
- package/dist/configurators/gemini.d.ts.map +1 -0
- package/dist/configurators/gemini.js +52 -0
- package/dist/configurators/gemini.js.map +1 -0
- package/dist/configurators/iflow.d.ts +33 -0
- package/dist/configurators/iflow.d.ts.map +1 -0
- package/dist/configurators/iflow.js +99 -0
- package/dist/configurators/iflow.js.map +1 -0
- package/dist/configurators/index.d.ts +55 -0
- package/dist/configurators/index.d.ts.map +1 -0
- package/dist/configurators/index.js +220 -0
- package/dist/configurators/index.js.map +1 -0
- package/dist/configurators/kilo.d.ts +8 -0
- package/dist/configurators/kilo.d.ts.map +1 -0
- package/dist/configurators/kilo.js +51 -0
- package/dist/configurators/kilo.js.map +1 -0
- package/dist/configurators/kiro.d.ts +8 -0
- package/dist/configurators/kiro.d.ts.map +1 -0
- package/dist/configurators/kiro.js +20 -0
- package/dist/configurators/kiro.js.map +1 -0
- package/dist/configurators/opencode.d.ts +32 -0
- package/dist/configurators/opencode.d.ts.map +1 -0
- package/dist/configurators/opencode.js +92 -0
- package/dist/configurators/opencode.js.map +1 -0
- package/dist/configurators/shared.d.ts +12 -0
- package/dist/configurators/shared.d.ts.map +1 -0
- package/dist/configurators/shared.js +21 -0
- package/dist/configurators/shared.js.map +1 -0
- package/dist/configurators/workflow.d.ts +28 -0
- package/dist/configurators/workflow.d.ts.map +1 -0
- package/dist/configurators/workflow.js +134 -0
- package/dist/configurators/workflow.js.map +1 -0
- package/dist/constants/paths.d.ts +68 -0
- package/dist/constants/paths.d.ts.map +1 -0
- package/dist/constants/paths.js +77 -0
- package/dist/constants/paths.js.map +1 -0
- package/dist/constants/version.d.ts +9 -0
- package/dist/constants/version.d.ts.map +1 -0
- package/dist/constants/version.js +15 -0
- package/dist/constants/version.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/index.d.ts +54 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +160 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/manifests/0.1.9.json +30 -0
- package/dist/migrations/manifests/0.2.0.json +49 -0
- package/dist/migrations/manifests/0.2.12.json +9 -0
- package/dist/migrations/manifests/0.2.13.json +9 -0
- package/dist/migrations/manifests/0.2.14.json +175 -0
- package/dist/migrations/manifests/0.2.15.json +33 -0
- package/dist/migrations/manifests/0.3.0-beta.0.json +278 -0
- package/dist/migrations/manifests/0.3.0-beta.1.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.10.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.11.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.12.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.13.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.14.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.15.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.16.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.2.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.3.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.4.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.5.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.6.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.7.json +11 -0
- package/dist/migrations/manifests/0.3.0-beta.8.json +9 -0
- package/dist/migrations/manifests/0.3.0-beta.9.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.0.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.1.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.2.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.3.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.4.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.5.json +9 -0
- package/dist/migrations/manifests/0.3.0-rc.6.json +9 -0
- package/dist/migrations/manifests/0.3.0.json +11 -0
- package/dist/templates/antigravity/index.d.ts +12 -0
- package/dist/templates/antigravity/index.d.ts.map +1 -0
- package/dist/templates/antigravity/index.js +29 -0
- package/dist/templates/antigravity/index.js.map +1 -0
- package/dist/templates/claude/agents/check.md +122 -0
- package/dist/templates/claude/agents/debug.md +106 -0
- package/dist/templates/claude/agents/dispatch.md +214 -0
- package/dist/templates/claude/agents/implement.md +96 -0
- package/dist/templates/claude/agents/plan.md +396 -0
- package/dist/templates/claude/agents/research.md +120 -0
- package/dist/templates/claude/commands/trellis/before-backend-dev.md +13 -0
- package/dist/templates/claude/commands/trellis/before-frontend-dev.md +13 -0
- package/dist/templates/claude/commands/trellis/before-role-work.md +364 -0
- package/dist/templates/claude/commands/trellis/brainstorm.md +474 -0
- package/dist/templates/claude/commands/trellis/break-loop.md +125 -0
- package/dist/templates/claude/commands/trellis/check-backend.md +13 -0
- package/dist/templates/claude/commands/trellis/check-cross-layer.md +153 -0
- package/dist/templates/claude/commands/trellis/check-frontend.md +13 -0
- package/dist/templates/claude/commands/trellis/create-command.md +154 -0
- package/dist/templates/claude/commands/trellis/finish-work.md +153 -0
- package/dist/templates/claude/commands/trellis/handoff.md +445 -0
- package/dist/templates/claude/commands/trellis/integrate-skill.md +219 -0
- package/dist/templates/claude/commands/trellis/onboard.md +358 -0
- package/dist/templates/claude/commands/trellis/parallel.md +193 -0
- package/dist/templates/claude/commands/trellis/pick-task.md +515 -0
- package/dist/templates/claude/commands/trellis/record-session.md +62 -0
- package/dist/templates/claude/commands/trellis/start.md +373 -0
- package/dist/templates/claude/commands/trellis/update-spec.md +354 -0
- package/dist/templates/claude/hooks/inject-subagent-context.py +873 -0
- package/dist/templates/claude/hooks/ralph-loop.py +388 -0
- package/dist/templates/claude/hooks/session-start.py +200 -0
- package/dist/templates/claude/index.d.ts +54 -0
- package/dist/templates/claude/index.d.ts.map +1 -0
- package/dist/templates/claude/index.js +85 -0
- package/dist/templates/claude/index.js.map +1 -0
- package/dist/templates/claude/settings.json +41 -0
- package/dist/templates/codex/index.d.ts +18 -0
- package/dist/templates/codex/index.d.ts.map +1 -0
- package/dist/templates/codex/index.js +40 -0
- package/dist/templates/codex/index.js.map +1 -0
- package/dist/templates/codex/skills/before-backend-dev/SKILL.md +18 -0
- package/dist/templates/codex/skills/before-frontend-dev/SKILL.md +18 -0
- package/dist/templates/codex/skills/brainstorm/SKILL.md +479 -0
- package/dist/templates/codex/skills/break-loop/SKILL.md +130 -0
- package/dist/templates/codex/skills/check-backend/SKILL.md +18 -0
- package/dist/templates/codex/skills/check-cross-layer/SKILL.md +158 -0
- package/dist/templates/codex/skills/check-frontend/SKILL.md +18 -0
- package/dist/templates/codex/skills/create-command/SKILL.md +101 -0
- package/dist/templates/codex/skills/finish-work/SKILL.md +148 -0
- package/dist/templates/codex/skills/integrate-skill/SKILL.md +221 -0
- package/dist/templates/codex/skills/onboard/SKILL.md +363 -0
- package/dist/templates/codex/skills/record-session/SKILL.md +67 -0
- package/dist/templates/codex/skills/start/SKILL.md +330 -0
- package/dist/templates/codex/skills/update-spec/SKILL.md +335 -0
- package/dist/templates/cursor/commands/trellis-before-backend-dev.md +13 -0
- package/dist/templates/cursor/commands/trellis-before-frontend-dev.md +13 -0
- package/dist/templates/cursor/commands/trellis-brainstorm.md +474 -0
- package/dist/templates/cursor/commands/trellis-break-loop.md +107 -0
- package/dist/templates/cursor/commands/trellis-check-backend.md +13 -0
- package/dist/templates/cursor/commands/trellis-check-cross-layer.md +153 -0
- package/dist/templates/cursor/commands/trellis-check-frontend.md +13 -0
- package/dist/templates/cursor/commands/trellis-create-command.md +154 -0
- package/dist/templates/cursor/commands/trellis-finish-work.md +143 -0
- package/dist/templates/cursor/commands/trellis-integrate-skill.md +219 -0
- package/dist/templates/cursor/commands/trellis-onboard.md +358 -0
- package/dist/templates/cursor/commands/trellis-record-session.md +62 -0
- package/dist/templates/cursor/commands/trellis-start.md +366 -0
- package/dist/templates/cursor/commands/trellis-update-spec.md +354 -0
- package/dist/templates/cursor/index.d.ts +24 -0
- package/dist/templates/cursor/index.d.ts.map +1 -0
- package/dist/templates/cursor/index.js +44 -0
- package/dist/templates/cursor/index.js.map +1 -0
- package/dist/templates/extract.d.ts +166 -0
- package/dist/templates/extract.d.ts.map +1 -0
- package/dist/templates/extract.js +296 -0
- package/dist/templates/extract.js.map +1 -0
- package/dist/templates/gemini/commands/trellis/before-backend-dev.toml +17 -0
- package/dist/templates/gemini/commands/trellis/before-frontend-dev.toml +17 -0
- package/dist/templates/gemini/commands/trellis/brainstorm.toml +420 -0
- package/dist/templates/gemini/commands/trellis/break-loop.toml +129 -0
- package/dist/templates/gemini/commands/trellis/check-backend.toml +17 -0
- package/dist/templates/gemini/commands/trellis/check-cross-layer.toml +147 -0
- package/dist/templates/gemini/commands/trellis/check-frontend.toml +17 -0
- package/dist/templates/gemini/commands/trellis/create-command.toml +119 -0
- package/dist/templates/gemini/commands/trellis/finish-work.toml +133 -0
- package/dist/templates/gemini/commands/trellis/integrate-skill.toml +104 -0
- package/dist/templates/gemini/commands/trellis/onboard.toml +111 -0
- package/dist/templates/gemini/commands/trellis/record-session.toml +66 -0
- package/dist/templates/gemini/commands/trellis/start.toml +292 -0
- package/dist/templates/gemini/commands/trellis/update-spec.toml +132 -0
- package/dist/templates/gemini/index.d.ts +21 -0
- package/dist/templates/gemini/index.d.ts.map +1 -0
- package/dist/templates/gemini/index.js +44 -0
- package/dist/templates/gemini/index.js.map +1 -0
- package/dist/templates/iflow/agents/check.md +122 -0
- package/dist/templates/iflow/agents/debug.md +106 -0
- package/dist/templates/iflow/agents/dispatch.md +214 -0
- package/dist/templates/iflow/agents/implement.md +96 -0
- package/dist/templates/iflow/agents/plan.md +396 -0
- package/dist/templates/iflow/agents/research.md +120 -0
- package/dist/templates/iflow/commands/trellis/before-backend-dev.md +13 -0
- package/dist/templates/iflow/commands/trellis/before-frontend-dev.md +13 -0
- package/dist/templates/iflow/commands/trellis/brainstorm.md +474 -0
- package/dist/templates/iflow/commands/trellis/break-loop.md +125 -0
- package/dist/templates/iflow/commands/trellis/check-backend.md +13 -0
- package/dist/templates/iflow/commands/trellis/check-cross-layer.md +153 -0
- package/dist/templates/iflow/commands/trellis/check-frontend.md +13 -0
- package/dist/templates/iflow/commands/trellis/create-command.md +152 -0
- package/dist/templates/iflow/commands/trellis/finish-work.md +153 -0
- package/dist/templates/iflow/commands/trellis/integrate-skill.md +219 -0
- package/dist/templates/iflow/commands/trellis/onboard.md +358 -0
- package/dist/templates/iflow/commands/trellis/parallel.md +193 -0
- package/dist/templates/iflow/commands/trellis/record-session.md +62 -0
- package/dist/templates/iflow/commands/trellis/start.md +373 -0
- package/dist/templates/iflow/commands/trellis/update-spec.md +354 -0
- package/dist/templates/iflow/hooks/inject-subagent-context.py +788 -0
- package/dist/templates/iflow/hooks/ralph-loop.py +388 -0
- package/dist/templates/iflow/hooks/session-start.py +143 -0
- package/dist/templates/iflow/index.d.ts +54 -0
- package/dist/templates/iflow/index.d.ts.map +1 -0
- package/dist/templates/iflow/index.js +85 -0
- package/dist/templates/iflow/index.js.map +1 -0
- package/dist/templates/iflow/settings.json +40 -0
- package/dist/templates/kilo/commands/trellis/before-backend-dev.md +13 -0
- package/dist/templates/kilo/commands/trellis/before-frontend-dev.md +13 -0
- package/dist/templates/kilo/commands/trellis/brainstorm.md +474 -0
- package/dist/templates/kilo/commands/trellis/break-loop.md +125 -0
- package/dist/templates/kilo/commands/trellis/check-backend.md +13 -0
- package/dist/templates/kilo/commands/trellis/check-cross-layer.md +153 -0
- package/dist/templates/kilo/commands/trellis/check-frontend.md +13 -0
- package/dist/templates/kilo/commands/trellis/create-command.md +152 -0
- package/dist/templates/kilo/commands/trellis/finish-work.md +129 -0
- package/dist/templates/kilo/commands/trellis/integrate-skill.md +219 -0
- package/dist/templates/kilo/commands/trellis/onboard.md +358 -0
- package/dist/templates/kilo/commands/trellis/parallel.md +194 -0
- package/dist/templates/kilo/commands/trellis/record-session.md +62 -0
- package/dist/templates/kilo/commands/trellis/start.md +321 -0
- package/dist/templates/kilo/commands/trellis/update-spec.md +285 -0
- package/dist/templates/kilo/index.d.ts +16 -0
- package/dist/templates/kilo/index.d.ts.map +1 -0
- package/dist/templates/kilo/index.js +39 -0
- package/dist/templates/kilo/index.js.map +1 -0
- package/dist/templates/kiro/index.d.ts +18 -0
- package/dist/templates/kiro/index.d.ts.map +1 -0
- package/dist/templates/kiro/index.js +40 -0
- package/dist/templates/kiro/index.js.map +1 -0
- package/dist/templates/kiro/skills/before-backend-dev/SKILL.md +18 -0
- package/dist/templates/kiro/skills/before-frontend-dev/SKILL.md +18 -0
- package/dist/templates/kiro/skills/brainstorm/SKILL.md +479 -0
- package/dist/templates/kiro/skills/break-loop/SKILL.md +130 -0
- package/dist/templates/kiro/skills/check-backend/SKILL.md +18 -0
- package/dist/templates/kiro/skills/check-cross-layer/SKILL.md +158 -0
- package/dist/templates/kiro/skills/check-frontend/SKILL.md +18 -0
- package/dist/templates/kiro/skills/create-command/SKILL.md +101 -0
- package/dist/templates/kiro/skills/finish-work/SKILL.md +148 -0
- package/dist/templates/kiro/skills/integrate-skill/SKILL.md +221 -0
- package/dist/templates/kiro/skills/onboard/SKILL.md +363 -0
- package/dist/templates/kiro/skills/record-session/SKILL.md +67 -0
- package/dist/templates/kiro/skills/start/SKILL.md +330 -0
- package/dist/templates/kiro/skills/update-spec/SKILL.md +335 -0
- package/dist/templates/markdown/agents.md +18 -0
- package/dist/templates/markdown/gitignore.txt +12 -0
- package/dist/templates/markdown/index.d.ts +27 -0
- package/dist/templates/markdown/index.d.ts.map +1 -0
- package/dist/templates/markdown/index.js +52 -0
- package/dist/templates/markdown/index.js.map +1 -0
- package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/index.md +40 -0
- package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
- package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/backend/script-conventions.md +467 -0
- package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
- package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
- package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
- package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
- package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md +118 -0
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +92 -0
- package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +94 -0
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md +394 -0
- package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +319 -0
- package/dist/templates/markdown/spec/guides/index.md.txt +79 -0
- package/dist/templates/markdown/workspace-index.md +123 -0
- package/dist/templates/markdown/worktree.yaml.txt +58 -0
- package/dist/templates/opencode/agents/check.md +146 -0
- package/dist/templates/opencode/agents/debug.md +129 -0
- package/dist/templates/opencode/agents/dispatch.md +223 -0
- package/dist/templates/opencode/agents/implement.md +120 -0
- package/dist/templates/opencode/agents/research.md +147 -0
- package/dist/templates/opencode/agents/trellis-plan.md +427 -0
- package/dist/templates/opencode/commands/trellis/before-backend-dev.md +13 -0
- package/dist/templates/opencode/commands/trellis/before-frontend-dev.md +13 -0
- package/dist/templates/opencode/commands/trellis/brainstorm.md +474 -0
- package/dist/templates/opencode/commands/trellis/break-loop.md +125 -0
- package/dist/templates/opencode/commands/trellis/check-backend.md +13 -0
- package/dist/templates/opencode/commands/trellis/check-cross-layer.md +153 -0
- package/dist/templates/opencode/commands/trellis/check-frontend.md +13 -0
- package/dist/templates/opencode/commands/trellis/create-command.md +154 -0
- package/dist/templates/opencode/commands/trellis/finish-work.md +144 -0
- package/dist/templates/opencode/commands/trellis/integrate-skill.md +219 -0
- package/dist/templates/opencode/commands/trellis/migrate-specs.md +0 -0
- package/dist/templates/opencode/commands/trellis/onboard.md +358 -0
- package/dist/templates/opencode/commands/trellis/parallel.md +194 -0
- package/dist/templates/opencode/commands/trellis/record-session.md +62 -0
- package/dist/templates/opencode/commands/trellis/start.md +338 -0
- package/dist/templates/opencode/commands/trellis/update-spec.md +354 -0
- package/dist/templates/opencode/lib/trellis-context.js +436 -0
- package/dist/templates/opencode/package.json +5 -0
- package/dist/templates/opencode/plugin/inject-subagent-context.js +538 -0
- package/dist/templates/opencode/plugin/session-start.js +192 -0
- package/dist/templates/trellis/VERSION +1 -0
- package/dist/templates/trellis/deliverables/README.md +51 -0
- package/dist/templates/trellis/gitignore.txt +29 -0
- package/dist/templates/trellis/index.d.ts +49 -0
- package/dist/templates/trellis/index.d.ts.map +1 -0
- package/dist/templates/trellis/index.js +92 -0
- package/dist/templates/trellis/index.js.map +1 -0
- package/dist/templates/trellis/paths.README.md +277 -0
- package/dist/templates/trellis/paths.yaml +41 -0
- package/dist/templates/trellis/pool/implementations.json +5 -0
- package/dist/templates/trellis/pool/prototypes.json +5 -0
- package/dist/templates/trellis/pool/requirements.json +5 -0
- package/dist/templates/trellis/scripts/__init__.py +5 -0
- package/dist/templates/trellis/scripts/add_session.py +391 -0
- package/dist/templates/trellis/scripts/common/__init__.py +80 -0
- package/dist/templates/trellis/scripts/common/cli_adapter.py +522 -0
- package/dist/templates/trellis/scripts/common/developer.py +189 -0
- package/dist/templates/trellis/scripts/common/git_context.py +383 -0
- package/dist/templates/trellis/scripts/common/paths.py +346 -0
- package/dist/templates/trellis/scripts/common/phase.py +253 -0
- package/dist/templates/trellis/scripts/common/project_paths.py +189 -0
- package/dist/templates/trellis/scripts/common/registry.py +365 -0
- package/dist/templates/trellis/scripts/common/task_queue.py +255 -0
- package/dist/templates/trellis/scripts/common/task_utils.py +177 -0
- package/dist/templates/trellis/scripts/common/worktree.py +218 -0
- package/dist/templates/trellis/scripts/create_bootstrap.py +290 -0
- package/dist/templates/trellis/scripts/get_context.py +16 -0
- package/dist/templates/trellis/scripts/get_developer.py +26 -0
- package/dist/templates/trellis/scripts/handoff_generator.py +380 -0
- package/dist/templates/trellis/scripts/init_developer.py +51 -0
- package/dist/templates/trellis/scripts/multi_agent/__init__.py +5 -0
- package/dist/templates/trellis/scripts/multi_agent/cleanup.py +403 -0
- package/dist/templates/trellis/scripts/multi_agent/create_pr.py +329 -0
- package/dist/templates/trellis/scripts/multi_agent/plan.py +233 -0
- package/dist/templates/trellis/scripts/multi_agent/start.py +461 -0
- package/dist/templates/trellis/scripts/multi_agent/status.py +817 -0
- package/dist/templates/trellis/scripts/pool.py +373 -0
- package/dist/templates/trellis/scripts/task.py +1162 -0
- package/dist/templates/trellis/scripts-shell-archive/add-session.sh +384 -0
- package/dist/templates/trellis/scripts-shell-archive/common/developer.sh +129 -0
- package/dist/templates/trellis/scripts-shell-archive/common/git-context.sh +263 -0
- package/dist/templates/trellis/scripts-shell-archive/common/paths.sh +208 -0
- package/dist/templates/trellis/scripts-shell-archive/common/phase.sh +150 -0
- package/dist/templates/trellis/scripts-shell-archive/common/registry.sh +247 -0
- package/dist/templates/trellis/scripts-shell-archive/common/task-queue.sh +142 -0
- package/dist/templates/trellis/scripts-shell-archive/common/task-utils.sh +151 -0
- package/dist/templates/trellis/scripts-shell-archive/common/worktree.sh +128 -0
- package/dist/templates/trellis/scripts-shell-archive/create-bootstrap.sh +299 -0
- package/dist/templates/trellis/scripts-shell-archive/get-context.sh +7 -0
- package/dist/templates/trellis/scripts-shell-archive/get-developer.sh +15 -0
- package/dist/templates/trellis/scripts-shell-archive/init-developer.sh +34 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/cleanup.sh +396 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/create-pr.sh +241 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/plan.sh +207 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/start.sh +317 -0
- package/dist/templates/trellis/scripts-shell-archive/multi-agent/status.sh +828 -0
- package/dist/templates/trellis/scripts-shell-archive/task.sh +1204 -0
- package/dist/templates/trellis/spec/roles/designer/index.md +243 -0
- package/dist/templates/trellis/spec/roles/designer/mock-data-standards.md +481 -0
- package/dist/templates/trellis/spec/roles/designer/prototype-guidelines.md +429 -0
- package/dist/templates/trellis/spec/roles/frontend-impl/api-integration.md +565 -0
- package/dist/templates/trellis/spec/roles/frontend-impl/index.md +321 -0
- package/dist/templates/trellis/spec/roles/frontend-impl/state-management.md +599 -0
- package/dist/templates/trellis/spec/roles/pm/index.md +112 -0
- package/dist/templates/trellis/spec/roles/pm/prd-template.md +124 -0
- package/dist/templates/trellis/tasks/.gitkeep +0 -0
- package/dist/templates/trellis/workflow.md +416 -0
- package/dist/templates/trellis/worktree.yaml +47 -0
- package/dist/types/ai-tools.d.ts +56 -0
- package/dist/types/ai-tools.d.ts.map +1 -0
- package/dist/types/ai-tools.js +103 -0
- package/dist/types/ai-tools.js.map +1 -0
- package/dist/types/migration.d.ts +86 -0
- package/dist/types/migration.d.ts.map +1 -0
- package/dist/types/migration.js +8 -0
- package/dist/types/migration.js.map +1 -0
- package/dist/utils/compare-versions.d.ts +12 -0
- package/dist/utils/compare-versions.d.ts.map +1 -0
- package/dist/utils/compare-versions.js +76 -0
- package/dist/utils/compare-versions.js.map +1 -0
- package/dist/utils/file-writer.d.ts +23 -0
- package/dist/utils/file-writer.d.ts.map +1 -0
- package/dist/utils/file-writer.js +140 -0
- package/dist/utils/file-writer.js.map +1 -0
- package/dist/utils/project-detector.d.ts +16 -0
- package/dist/utils/project-detector.d.ts.map +1 -0
- package/dist/utils/project-detector.js +186 -0
- package/dist/utils/project-detector.js.map +1 -0
- package/dist/utils/template-fetcher.d.ts +51 -0
- package/dist/utils/template-fetcher.d.ts.map +1 -0
- package/dist/utils/template-fetcher.js +174 -0
- package/dist/utils/template-fetcher.js.map +1 -0
- package/dist/utils/template-hash.d.ts +78 -0
- package/dist/utils/template-hash.d.ts.map +1 -0
- package/dist/utils/template-hash.js +233 -0
- package/dist/utils/template-hash.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Create Bootstrap Task for First-Time Setup.
|
|
4
|
+
|
|
5
|
+
Creates a guided task to help users fill in project guidelines
|
|
6
|
+
after initializing Trellis for the first time.
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
python3 create_bootstrap.py [project-type]
|
|
10
|
+
|
|
11
|
+
Arguments:
|
|
12
|
+
project-type: frontend | backend | fullstack (default: fullstack)
|
|
13
|
+
|
|
14
|
+
Prerequisites:
|
|
15
|
+
- .trellis/.developer must exist (run init_developer.py first)
|
|
16
|
+
|
|
17
|
+
Creates:
|
|
18
|
+
.trellis/tasks/00-bootstrap-guidelines/
|
|
19
|
+
- task.json # Task metadata
|
|
20
|
+
- prd.md # Task description and guidance
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import json
|
|
26
|
+
import sys
|
|
27
|
+
from datetime import datetime
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
|
|
30
|
+
from common.paths import (
|
|
31
|
+
DIR_WORKFLOW,
|
|
32
|
+
DIR_SCRIPTS,
|
|
33
|
+
DIR_TASKS,
|
|
34
|
+
get_repo_root,
|
|
35
|
+
get_developer,
|
|
36
|
+
get_tasks_dir,
|
|
37
|
+
set_current_task,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# =============================================================================
|
|
42
|
+
# Constants
|
|
43
|
+
# =============================================================================
|
|
44
|
+
|
|
45
|
+
TASK_NAME = "00-bootstrap-guidelines"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# =============================================================================
|
|
49
|
+
# PRD Content
|
|
50
|
+
# =============================================================================
|
|
51
|
+
|
|
52
|
+
def write_prd_header() -> str:
|
|
53
|
+
"""Write PRD header section."""
|
|
54
|
+
return """# Bootstrap: Fill Project Development Guidelines
|
|
55
|
+
|
|
56
|
+
## Purpose
|
|
57
|
+
|
|
58
|
+
Welcome to Trellis! This is your first task.
|
|
59
|
+
|
|
60
|
+
AI agents use `.trellis/spec/` to understand YOUR project's coding conventions.
|
|
61
|
+
**Empty templates = AI writes generic code that doesn't match your project style.**
|
|
62
|
+
|
|
63
|
+
Filling these guidelines is a one-time setup that pays off for every future AI session.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Your Task
|
|
68
|
+
|
|
69
|
+
Fill in the guideline files based on your **existing codebase**.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def write_prd_backend_section() -> str:
|
|
74
|
+
"""Write PRD backend section."""
|
|
75
|
+
return """
|
|
76
|
+
|
|
77
|
+
### Backend Guidelines
|
|
78
|
+
|
|
79
|
+
| File | What to Document |
|
|
80
|
+
|------|------------------|
|
|
81
|
+
| `.trellis/spec/backend/directory-structure.md` | Where different file types go (routes, services, utils) |
|
|
82
|
+
| `.trellis/spec/backend/database-guidelines.md` | ORM, migrations, query patterns, naming conventions |
|
|
83
|
+
| `.trellis/spec/backend/error-handling.md` | How errors are caught, logged, and returned |
|
|
84
|
+
| `.trellis/spec/backend/logging-guidelines.md` | Log levels, format, what to log |
|
|
85
|
+
| `.trellis/spec/backend/quality-guidelines.md` | Code review standards, testing requirements |
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def write_prd_frontend_section() -> str:
|
|
90
|
+
"""Write PRD frontend section."""
|
|
91
|
+
return """
|
|
92
|
+
|
|
93
|
+
### Frontend Guidelines
|
|
94
|
+
|
|
95
|
+
| File | What to Document |
|
|
96
|
+
|------|------------------|
|
|
97
|
+
| `.trellis/spec/frontend/directory-structure.md` | Component/page/hook organization |
|
|
98
|
+
| `.trellis/spec/frontend/component-guidelines.md` | Component patterns, props conventions |
|
|
99
|
+
| `.trellis/spec/frontend/hook-guidelines.md` | Custom hook naming, patterns |
|
|
100
|
+
| `.trellis/spec/frontend/state-management.md` | State library, patterns, what goes where |
|
|
101
|
+
| `.trellis/spec/frontend/type-safety.md` | TypeScript conventions, type organization |
|
|
102
|
+
| `.trellis/spec/frontend/quality-guidelines.md` | Linting, testing, accessibility |
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def write_prd_footer() -> str:
|
|
107
|
+
"""Write PRD footer section."""
|
|
108
|
+
return """
|
|
109
|
+
|
|
110
|
+
### Thinking Guides (Optional)
|
|
111
|
+
|
|
112
|
+
The `.trellis/spec/guides/` directory contains thinking guides that are already
|
|
113
|
+
filled with general best practices. You can customize them for your project if needed.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## How to Fill Guidelines
|
|
118
|
+
|
|
119
|
+
### Principle: Document Reality, Not Ideals
|
|
120
|
+
|
|
121
|
+
Write what your codebase **actually does**, not what you wish it did.
|
|
122
|
+
AI needs to match existing patterns, not introduce new ones.
|
|
123
|
+
|
|
124
|
+
### Steps
|
|
125
|
+
|
|
126
|
+
1. **Look at existing code** - Find 2-3 examples of each pattern
|
|
127
|
+
2. **Document the pattern** - Describe what you see
|
|
128
|
+
3. **Include file paths** - Reference real files as examples
|
|
129
|
+
4. **List anti-patterns** - What does your team avoid?
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Tips for Using AI
|
|
134
|
+
|
|
135
|
+
Ask AI to help analyze your codebase:
|
|
136
|
+
|
|
137
|
+
- "Look at my codebase and document the patterns you see"
|
|
138
|
+
- "Analyze my code structure and summarize the conventions"
|
|
139
|
+
- "Find error handling patterns and document them"
|
|
140
|
+
|
|
141
|
+
The AI will read your code and help you document it.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Completion Checklist
|
|
146
|
+
|
|
147
|
+
- [ ] Guidelines filled for your project type
|
|
148
|
+
- [ ] At least 2-3 real code examples in each guideline
|
|
149
|
+
- [ ] Anti-patterns documented
|
|
150
|
+
|
|
151
|
+
When done:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
python3 ./.trellis/scripts/task.py finish
|
|
155
|
+
python3 ./.trellis/scripts/task.py archive 00-bootstrap-guidelines
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Why This Matters
|
|
161
|
+
|
|
162
|
+
After completing this task:
|
|
163
|
+
|
|
164
|
+
1. AI will write code that matches your project style
|
|
165
|
+
2. Relevant `/trellis:before-*-dev` commands will inject real context
|
|
166
|
+
3. `/trellis:check-*` commands will validate against your actual standards
|
|
167
|
+
4. Future developers (human or AI) will onboard faster
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def write_prd(task_dir: Path, project_type: str) -> None:
|
|
172
|
+
"""Write prd.md file."""
|
|
173
|
+
content = write_prd_header()
|
|
174
|
+
|
|
175
|
+
if project_type == "frontend":
|
|
176
|
+
content += write_prd_frontend_section()
|
|
177
|
+
elif project_type == "backend":
|
|
178
|
+
content += write_prd_backend_section()
|
|
179
|
+
else: # fullstack
|
|
180
|
+
content += write_prd_backend_section()
|
|
181
|
+
content += write_prd_frontend_section()
|
|
182
|
+
|
|
183
|
+
content += write_prd_footer()
|
|
184
|
+
|
|
185
|
+
prd_file = task_dir / "prd.md"
|
|
186
|
+
prd_file.write_text(content, encoding="utf-8")
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
# =============================================================================
|
|
190
|
+
# Task JSON
|
|
191
|
+
# =============================================================================
|
|
192
|
+
|
|
193
|
+
def write_task_json(task_dir: Path, developer: str, project_type: str) -> None:
|
|
194
|
+
"""Write task.json file."""
|
|
195
|
+
today = datetime.now().strftime("%Y-%m-%d")
|
|
196
|
+
|
|
197
|
+
# Generate subtasks and related files based on project type
|
|
198
|
+
if project_type == "frontend":
|
|
199
|
+
subtasks = [
|
|
200
|
+
{"name": "Fill frontend guidelines", "status": "pending"},
|
|
201
|
+
{"name": "Add code examples", "status": "pending"},
|
|
202
|
+
]
|
|
203
|
+
related_files = [".trellis/spec/frontend/"]
|
|
204
|
+
elif project_type == "backend":
|
|
205
|
+
subtasks = [
|
|
206
|
+
{"name": "Fill backend guidelines", "status": "pending"},
|
|
207
|
+
{"name": "Add code examples", "status": "pending"},
|
|
208
|
+
]
|
|
209
|
+
related_files = [".trellis/spec/backend/"]
|
|
210
|
+
else: # fullstack
|
|
211
|
+
subtasks = [
|
|
212
|
+
{"name": "Fill backend guidelines", "status": "pending"},
|
|
213
|
+
{"name": "Fill frontend guidelines", "status": "pending"},
|
|
214
|
+
{"name": "Add code examples", "status": "pending"},
|
|
215
|
+
]
|
|
216
|
+
related_files = [".trellis/spec/backend/", ".trellis/spec/frontend/"]
|
|
217
|
+
|
|
218
|
+
task_data = {
|
|
219
|
+
"id": TASK_NAME,
|
|
220
|
+
"name": "Bootstrap Guidelines",
|
|
221
|
+
"description": "Fill in project development guidelines for AI agents",
|
|
222
|
+
"status": "in_progress",
|
|
223
|
+
"dev_type": "docs",
|
|
224
|
+
"priority": "P1",
|
|
225
|
+
"creator": developer,
|
|
226
|
+
"assignee": developer,
|
|
227
|
+
"createdAt": today,
|
|
228
|
+
"completedAt": None,
|
|
229
|
+
"commit": None,
|
|
230
|
+
"subtasks": subtasks,
|
|
231
|
+
"relatedFiles": related_files,
|
|
232
|
+
"notes": f"First-time setup task created by trellis init ({project_type} project)",
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
task_json = task_dir / "task.json"
|
|
236
|
+
task_json.write_text(json.dumps(task_data, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
# =============================================================================
|
|
240
|
+
# Main
|
|
241
|
+
# =============================================================================
|
|
242
|
+
|
|
243
|
+
def main() -> int:
|
|
244
|
+
"""Main entry point."""
|
|
245
|
+
# Parse project type argument
|
|
246
|
+
project_type = "fullstack"
|
|
247
|
+
if len(sys.argv) > 1:
|
|
248
|
+
project_type = sys.argv[1]
|
|
249
|
+
|
|
250
|
+
# Validate project type
|
|
251
|
+
if project_type not in ("frontend", "backend", "fullstack"):
|
|
252
|
+
print(f"Unknown project type: {project_type}, defaulting to fullstack")
|
|
253
|
+
project_type = "fullstack"
|
|
254
|
+
|
|
255
|
+
repo_root = get_repo_root()
|
|
256
|
+
developer = get_developer(repo_root)
|
|
257
|
+
|
|
258
|
+
# Check developer initialized
|
|
259
|
+
if not developer:
|
|
260
|
+
print("Error: Developer not initialized")
|
|
261
|
+
print(f"Run: python3 ./{DIR_WORKFLOW}/{DIR_SCRIPTS}/init_developer.py <your-name>")
|
|
262
|
+
return 1
|
|
263
|
+
|
|
264
|
+
tasks_dir = get_tasks_dir(repo_root)
|
|
265
|
+
task_dir = tasks_dir / TASK_NAME
|
|
266
|
+
relative_path = f"{DIR_WORKFLOW}/{DIR_TASKS}/{TASK_NAME}"
|
|
267
|
+
|
|
268
|
+
# Check if already exists
|
|
269
|
+
if task_dir.exists():
|
|
270
|
+
print(f"Bootstrap task already exists: {relative_path}")
|
|
271
|
+
return 0
|
|
272
|
+
|
|
273
|
+
# Create task directory
|
|
274
|
+
task_dir.mkdir(parents=True, exist_ok=True)
|
|
275
|
+
|
|
276
|
+
# Write files
|
|
277
|
+
write_task_json(task_dir, developer, project_type)
|
|
278
|
+
write_prd(task_dir, project_type)
|
|
279
|
+
|
|
280
|
+
# Set as current task
|
|
281
|
+
set_current_task(relative_path, repo_root)
|
|
282
|
+
|
|
283
|
+
# Silent output - init command handles user-facing messages
|
|
284
|
+
# Only output the task path for programmatic use
|
|
285
|
+
print(relative_path)
|
|
286
|
+
return 0
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
if __name__ == "__main__":
|
|
290
|
+
sys.exit(main())
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Get Session Context for AI Agent.
|
|
4
|
+
|
|
5
|
+
Usage:
|
|
6
|
+
python3 get_context.py Output context in text format
|
|
7
|
+
python3 get_context.py --json Output context in JSON format
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from common.git_context import main
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
if __name__ == "__main__":
|
|
16
|
+
main()
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Get current developer name.
|
|
4
|
+
|
|
5
|
+
This is a wrapper that uses common/paths.py
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import sys
|
|
11
|
+
|
|
12
|
+
from common.paths import get_developer
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def main() -> None:
|
|
16
|
+
"""CLI entry point."""
|
|
17
|
+
developer = get_developer()
|
|
18
|
+
if developer:
|
|
19
|
+
print(developer)
|
|
20
|
+
else:
|
|
21
|
+
print("Developer not initialized", file=sys.stderr)
|
|
22
|
+
sys.exit(1)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if __name__ == "__main__":
|
|
26
|
+
main()
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
HANDOFF Document Generator
|
|
5
|
+
|
|
6
|
+
Generates role-specific handoff documents for three-role collaboration.
|
|
7
|
+
|
|
8
|
+
Templates:
|
|
9
|
+
- PM: Summarize PRD core requirements
|
|
10
|
+
- Designer: Design rationale + Mock data locations
|
|
11
|
+
- Frontend: Implementation details + API integration points
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import sys
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Optional
|
|
18
|
+
|
|
19
|
+
# Add parent directory to path for imports
|
|
20
|
+
sys.path.insert(0, str(Path(__file__).parent))
|
|
21
|
+
|
|
22
|
+
from common.paths import get_developer, get_repo_root
|
|
23
|
+
|
|
24
|
+
# =============================================================================
|
|
25
|
+
# Template Functions
|
|
26
|
+
# =============================================================================
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def generate_handoff_pm(task_dir: Path, task_data: dict) -> str:
|
|
30
|
+
"""Generate HANDOFF.md for PM role."""
|
|
31
|
+
task_id = task_data.get("id", "unknown")
|
|
32
|
+
title = task_data.get("title", "未命名任务")
|
|
33
|
+
developer = get_developer(get_repo_root()) or "unknown"
|
|
34
|
+
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
35
|
+
|
|
36
|
+
# Read PRD content
|
|
37
|
+
prd_file = task_dir / "prd.md"
|
|
38
|
+
prd_content = ""
|
|
39
|
+
if prd_file.exists():
|
|
40
|
+
prd_content = prd_file.read_text(encoding="utf-8")
|
|
41
|
+
|
|
42
|
+
template = f"""# {title} - 需求交接文档
|
|
43
|
+
|
|
44
|
+
## 📋 任务信息
|
|
45
|
+
- **功能ID**: {task_id}
|
|
46
|
+
- **功能名称**: {title}
|
|
47
|
+
- **完成人**: {developer}
|
|
48
|
+
- **完成时间**: {now}
|
|
49
|
+
|
|
50
|
+
## 🎯 核心需求
|
|
51
|
+
|
|
52
|
+
**请AI根据PRD总结核心要点(2-3段)**
|
|
53
|
+
|
|
54
|
+
PRD位置:`{task_dir.name}/prd.md`
|
|
55
|
+
|
|
56
|
+
## 📄 产出文件
|
|
57
|
+
|
|
58
|
+
- `prd.md` - 产品需求文档
|
|
59
|
+
- `user-stories.md` - 用户故事(如有)
|
|
60
|
+
- 其他补充文档(如有)
|
|
61
|
+
|
|
62
|
+
## 🔑 关键设计要点
|
|
63
|
+
|
|
64
|
+
**请Designer重点关注**:
|
|
65
|
+
|
|
66
|
+
1. [TODO: AI填写关键功能点1]
|
|
67
|
+
2. [TODO: AI填写关键功能点2]
|
|
68
|
+
3. [TODO: AI填写关键功能点3]
|
|
69
|
+
|
|
70
|
+
## ⚠️ 特别注意事项
|
|
71
|
+
|
|
72
|
+
**设计实现时需要注意**:
|
|
73
|
+
|
|
74
|
+
- [TODO: AI填写注意事项1 - 如UI布局要求]
|
|
75
|
+
- [TODO: AI填写注意事项2 - 如交互特殊要求]
|
|
76
|
+
- [TODO: AI填写注意事项3 - 如性能要求]
|
|
77
|
+
|
|
78
|
+
## 🔗 相关资源
|
|
79
|
+
|
|
80
|
+
- 设计稿: [TODO: 填写Figma链接]
|
|
81
|
+
- API文档: [TODO: 填写API文档链接]
|
|
82
|
+
- 参考资料: [TODO: 填写其他资源]
|
|
83
|
+
|
|
84
|
+
## 📞 联系方式
|
|
85
|
+
|
|
86
|
+
如有疑问,请联系 {developer}
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 附录:PRD内容摘要
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
{prd_content[:500]}...
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
> 完整PRD请查看 `{task_dir.name}/prd.md`
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
return template
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def generate_handoff_designer(task_dir: Path, task_data: dict, source_data: Optional[dict] = None) -> str:
|
|
103
|
+
"""Generate HANDOFF.md for Designer role."""
|
|
104
|
+
task_id = task_data.get("id", "unknown")
|
|
105
|
+
title = task_data.get("title", "未命名任务")
|
|
106
|
+
developer = get_developer(get_repo_root()) or "unknown"
|
|
107
|
+
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
108
|
+
|
|
109
|
+
# Get upstream info
|
|
110
|
+
based_on = "N/A"
|
|
111
|
+
if source_data and "based_on" in source_data:
|
|
112
|
+
based_on = f"{source_data['based_on']['type']}/{source_data['based_on']['id']}"
|
|
113
|
+
|
|
114
|
+
template = f"""# {title} - 原型交接文档
|
|
115
|
+
|
|
116
|
+
## 📋 任务信息
|
|
117
|
+
- **功能ID**: {task_id}
|
|
118
|
+
- **基于需求**: {based_on}
|
|
119
|
+
- **完成人**: {developer}
|
|
120
|
+
- **完成时间**: {now}
|
|
121
|
+
|
|
122
|
+
## 🎨 设计说明
|
|
123
|
+
|
|
124
|
+
**请AI总结设计思路(2-3段)**:
|
|
125
|
+
|
|
126
|
+
- 整体布局思路
|
|
127
|
+
- 主要组件设计
|
|
128
|
+
- 交互流程设计
|
|
129
|
+
|
|
130
|
+
## 📄 产出文件
|
|
131
|
+
|
|
132
|
+
**请列出所有组件文件**:
|
|
133
|
+
|
|
134
|
+
- `[ComponentName].tsx` - 组件说明
|
|
135
|
+
- `[ComponentName].tsx` - 组件说明
|
|
136
|
+
- ...
|
|
137
|
+
|
|
138
|
+
## 🧩 组件结构
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
[TODO: AI绘制组件树]
|
|
142
|
+
App
|
|
143
|
+
├── LoginPage
|
|
144
|
+
│ ├── LoginForm
|
|
145
|
+
│ │ ├── EmailInput
|
|
146
|
+
│ │ └── PasswordInput
|
|
147
|
+
│ └── SocialLoginButtons
|
|
148
|
+
└── ...
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## 💾 Mock数据说明
|
|
152
|
+
|
|
153
|
+
**当前使用的Mock数据**:
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
// [TODO: AI填写Mock数据示例]
|
|
157
|
+
const mockUser = {{
|
|
158
|
+
id: "1",
|
|
159
|
+
email: "test@example.com",
|
|
160
|
+
name: "Test User"
|
|
161
|
+
}};
|
|
162
|
+
|
|
163
|
+
// Mock登录逻辑位置:[TODO: 文件名:行号]
|
|
164
|
+
const handleLogin = async () => {{
|
|
165
|
+
// TODO: 替换为真实API调用
|
|
166
|
+
setTimeout(() => setUser(mockUser), 1000);
|
|
167
|
+
}};
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## 🔄 需要Frontend补充的逻辑
|
|
171
|
+
|
|
172
|
+
**请Frontend开发重点处理**:
|
|
173
|
+
|
|
174
|
+
1. **API集成** - 替换Mock为真实API调用
|
|
175
|
+
- 位置: [TODO: 文件名:行号]
|
|
176
|
+
- 需要调用: [TODO: API端点]
|
|
177
|
+
|
|
178
|
+
2. **错误处理** - 添加网络错误和业务错误处理
|
|
179
|
+
- 网络超时
|
|
180
|
+
- 登录失败提示
|
|
181
|
+
- 表单验证错误
|
|
182
|
+
|
|
183
|
+
3. **状态管理** - 添加全局状态管理(如需要)
|
|
184
|
+
- 用户登录状态
|
|
185
|
+
- Token存储
|
|
186
|
+
|
|
187
|
+
4. **持久化** - 实现"记住我"功能
|
|
188
|
+
- localStorage/Cookie
|
|
189
|
+
- Token刷新逻辑
|
|
190
|
+
|
|
191
|
+
## ⚠️ 特别注意事项
|
|
192
|
+
|
|
193
|
+
**保留以下设计**:
|
|
194
|
+
|
|
195
|
+
- [TODO: 需要保留的交互细节]
|
|
196
|
+
- [TODO: 需要保留的UI元素]
|
|
197
|
+
- [TODO: 需要保留的样式]
|
|
198
|
+
|
|
199
|
+
**可以优化的部分**:
|
|
200
|
+
|
|
201
|
+
- [TODO: 可以优化的性能点]
|
|
202
|
+
- [TODO: 可以调整的代码结构]
|
|
203
|
+
|
|
204
|
+
## 📞 联系方式
|
|
205
|
+
|
|
206
|
+
如有疑问,请联系 {developer}
|
|
207
|
+
"""
|
|
208
|
+
|
|
209
|
+
return template
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def generate_handoff_frontend(task_dir: Path, task_data: dict, source_data: Optional[dict] = None) -> str:
|
|
213
|
+
"""Generate HANDOFF.md for Frontend role."""
|
|
214
|
+
task_id = task_data.get("id", "unknown")
|
|
215
|
+
title = task_data.get("title", "未命名任务")
|
|
216
|
+
developer = get_developer(get_repo_root()) or "unknown"
|
|
217
|
+
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
218
|
+
|
|
219
|
+
# Get upstream info
|
|
220
|
+
based_on = "N/A"
|
|
221
|
+
if source_data and "based_on" in source_data:
|
|
222
|
+
based_on = f"{source_data['based_on']['type']}/{source_data['based_on']['id']}"
|
|
223
|
+
|
|
224
|
+
template = f"""# {title} - 生产代码交接文档
|
|
225
|
+
|
|
226
|
+
## 📋 任务信息
|
|
227
|
+
- **功能ID**: {task_id}
|
|
228
|
+
- **基于原型**: {based_on}
|
|
229
|
+
- **完成人**: {developer}
|
|
230
|
+
- **完成时间**: {now}
|
|
231
|
+
|
|
232
|
+
## 🎯 实现总结
|
|
233
|
+
|
|
234
|
+
**请AI总结实现要点(2-3段)**:
|
|
235
|
+
|
|
236
|
+
- 主要功能实现
|
|
237
|
+
- API集成情况
|
|
238
|
+
- 状态管理方案
|
|
239
|
+
|
|
240
|
+
## 📄 产出文件
|
|
241
|
+
|
|
242
|
+
**请列出修改的文件**:
|
|
243
|
+
|
|
244
|
+
- `[FileName].tsx` - 修改说明
|
|
245
|
+
- `[FileName].ts` - 修改说明
|
|
246
|
+
- ...
|
|
247
|
+
|
|
248
|
+
## 🔌 API集成
|
|
249
|
+
|
|
250
|
+
**已集成的API**:
|
|
251
|
+
|
|
252
|
+
| 端点 | 方法 | 用途 | 位置 |
|
|
253
|
+
|------|------|------|------|
|
|
254
|
+
| [TODO] | POST | [TODO] | [TODO:文件:行号] |
|
|
255
|
+
|
|
256
|
+
## 🧪 测试说明
|
|
257
|
+
|
|
258
|
+
**已添加的测试**:
|
|
259
|
+
|
|
260
|
+
- [ ] 单元测试: [TODO: 测试文件]
|
|
261
|
+
- [ ] 集成测试: [TODO: 测试文件]
|
|
262
|
+
- [ ] E2E测试: [TODO: 测试文件]
|
|
263
|
+
|
|
264
|
+
**测试覆盖率**: [TODO: X%]
|
|
265
|
+
|
|
266
|
+
## 🐛 已知问题
|
|
267
|
+
|
|
268
|
+
**遗留问题**(如有):
|
|
269
|
+
|
|
270
|
+
1. [TODO: 问题描述]
|
|
271
|
+
- 影响: [TODO]
|
|
272
|
+
- 计划修复时间: [TODO]
|
|
273
|
+
|
|
274
|
+
## ⚠️ 部署注意事项
|
|
275
|
+
|
|
276
|
+
**环境变量**:
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
# [TODO: 列出需要的环境变量]
|
|
280
|
+
VITE_API_BASE_URL=https://api.example.com
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**依赖项**:
|
|
284
|
+
|
|
285
|
+
- [TODO: 新增的npm包]
|
|
286
|
+
|
|
287
|
+
**数据库迁移**(如需要):
|
|
288
|
+
|
|
289
|
+
- [TODO: 迁移脚本]
|
|
290
|
+
|
|
291
|
+
## 📞 联系方式
|
|
292
|
+
|
|
293
|
+
如有疑问,请联系 {developer}
|
|
294
|
+
"""
|
|
295
|
+
|
|
296
|
+
return template
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
# =============================================================================
|
|
300
|
+
# Main Function
|
|
301
|
+
# =============================================================================
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def generate_handoff(task_dir: Path, role: str, task_data: dict, source_data: Optional[dict] = None) -> str:
|
|
305
|
+
"""Generate HANDOFF.md based on role.
|
|
306
|
+
|
|
307
|
+
Args:
|
|
308
|
+
task_dir: Task directory path
|
|
309
|
+
role: Role type (pm, designer, frontend)
|
|
310
|
+
task_data: Task metadata from task.json
|
|
311
|
+
source_data: Source reference from source.json (optional)
|
|
312
|
+
|
|
313
|
+
Returns:
|
|
314
|
+
HANDOFF.md content
|
|
315
|
+
"""
|
|
316
|
+
generators = {
|
|
317
|
+
"pm": generate_handoff_pm,
|
|
318
|
+
"designer": generate_handoff_designer,
|
|
319
|
+
"frontend": generate_handoff_frontend,
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if role not in generators:
|
|
323
|
+
raise ValueError(f"Invalid role: {role}. Must be one of {list(generators.keys())}")
|
|
324
|
+
|
|
325
|
+
# Designer and Frontend can use source_data
|
|
326
|
+
if role in ("designer", "frontend"):
|
|
327
|
+
return generators[role](task_dir, task_data, source_data)
|
|
328
|
+
else:
|
|
329
|
+
return generators[role](task_dir, task_data)
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
# =============================================================================
|
|
333
|
+
# CLI Entry Point
|
|
334
|
+
# =============================================================================
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
def main() -> int:
|
|
338
|
+
"""CLI entry point for testing."""
|
|
339
|
+
import argparse
|
|
340
|
+
import json
|
|
341
|
+
|
|
342
|
+
parser = argparse.ArgumentParser(description="HANDOFF Document Generator")
|
|
343
|
+
parser.add_argument("task_dir", help="Task directory path")
|
|
344
|
+
parser.add_argument("role", choices=["pm", "designer", "frontend"], help="Role type")
|
|
345
|
+
parser.add_argument("--output", "-o", help="Output file path (default: HANDOFF.md in task dir)")
|
|
346
|
+
|
|
347
|
+
args = parser.parse_args()
|
|
348
|
+
|
|
349
|
+
task_dir = Path(args.task_dir)
|
|
350
|
+
if not task_dir.exists():
|
|
351
|
+
print(f"Error: Task directory not found: {task_dir}", file=sys.stderr)
|
|
352
|
+
return 1
|
|
353
|
+
|
|
354
|
+
# Read task.json
|
|
355
|
+
task_json = task_dir / "task.json"
|
|
356
|
+
if not task_json.exists():
|
|
357
|
+
print(f"Error: task.json not found in {task_dir}", file=sys.stderr)
|
|
358
|
+
return 1
|
|
359
|
+
|
|
360
|
+
task_data = json.loads(task_json.read_text(encoding="utf-8"))
|
|
361
|
+
|
|
362
|
+
# Read source.json (optional)
|
|
363
|
+
source_json = task_dir / "source.json"
|
|
364
|
+
source_data = None
|
|
365
|
+
if source_json.exists():
|
|
366
|
+
source_data = json.loads(source_json.read_text(encoding="utf-8"))
|
|
367
|
+
|
|
368
|
+
# Generate HANDOFF
|
|
369
|
+
handoff_content = generate_handoff(task_dir, args.role, task_data, source_data)
|
|
370
|
+
|
|
371
|
+
# Output
|
|
372
|
+
output_file = Path(args.output) if args.output else task_dir / "HANDOFF.md"
|
|
373
|
+
output_file.write_text(handoff_content, encoding="utf-8")
|
|
374
|
+
|
|
375
|
+
print(f"✓ Generated HANDOFF.md: {output_file}")
|
|
376
|
+
return 0
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
if __name__ == "__main__":
|
|
380
|
+
sys.exit(main())
|