/** * Built-in pipeline templates for 1인 기업 모드. * * These are *blueprints*, not data — they're surfaced in the manage panel's * "템플릿에서 추가" dropdown so a non-developer user can stamp out a * working pipeline in one click and then tweak the labels / 지시 / agent * assignments in the card editor. Once stamped, the pipeline lives in * `state.pipelines` like any other; templates themselves stay read-only in * code so a future Astra version can ship improved defaults without * trampling user edits. * * Why ship a template at all: the user's own description of the desired * workflow ("작업 수락 → 기획 → 시장 조사 → … → QA → 배포") is exactly the * shape this codifies. Without the template they'd have to author 13 * cards from scratch the first time they open the editor — which is * exactly the friction we're trying to remove. */ import { PipelineDef } from './types'; export interface PipelineTemplate { /** Stable id used by the UI dropdown and `applyTemplate` call. */ templateId: string; /** Korean display name shown in the dropdown. */ name: string; /** One-line description of when this template fits. */ description: string; /** * Default pipeline id when stamping. The UI will suggest this and let * the user override before saving so two stamps don't collide. */ suggestedPipelineId: string; /** Default human-readable name for the stamped pipeline. */ suggestedPipelineName: string; /** Stage definitions — same shape as a saved PipelineDef.stages. */ stages: PipelineDef['stages']; } /** * "풀 프로덕트 개발" — the user's described workflow, codified: * 1. 작업 수락 — CEO 브리프 (자동, 별도 stage 아님) * 2. 기획 논의 — planner * 3. 시장 조사 — researcher * 4. 트렌드 조사 — researcher * 5. 방향성 정의 — planner * 6. 기획문서 작성 — planner * 7. 기획문서 검토 — inspector (재작업 발견 시 → 6번 loop-back) * 8. 기획문서 최종본 — planner * 9. 개발 설계 — developer * 10. 설계 검토 — inspector (재작업 발견 시 → 9번 loop-back) * 11. 개발 진행 — developer * 12. QA 진행 — qa (버그 발견 시 → 11번 loop-back) * 13. 라이브 배포 — developer * * 1번 "작업 수락"은 별도 stage가 아니라 CEO의 브리프 발신 — 모든 pipeline * turn은 자동으로 brief를 생성해 `{{brief}}` 토큰으로 사용 가능하다. * * 지시 템플릿은 작은 LLM이 가장 자주 어기는 두 가지 — (a) 기획 문맥 잊기, * (b) 단순 코드만 던지기 — 를 강하게 누른다. 사용자가 처음 보면 길어 * 보일 수 있는데, "이 단계에서 정확히 뭘 해야 하나" 가이드가 필요한 * 작은 모델 (gemma e2b·4b 등)에서 결과 품질을 크게 좌우한다. */ const FULL_PRODUCT_DEV: PipelineTemplate = { templateId: 'full-product-dev', name: '풀 프로덕트 개발 (13단계)', description: '기획 → 리서치 → 기획서 → 검토 → 설계 → 개발 → QA → 배포. 기획 누락 없이 풀 사이클을 도는 표준 워크플로.', suggestedPipelineId: 'product-dev', suggestedPipelineName: '제품 개발 파이프라인', stages: [ // 모든 stage가 *직군*만 지정하고 담당자는 비워둠 (agentId 생략). dispatcher가 // stage 진입 시 CEO에게 1회 LLM 콜로 적임자 선택. 활성 후보가 1명뿐이면 // 콜 없이 그 사람을 쓴다. 사용자의 의도("CEO가 배분 결정")와 일치. { id: 'plan-discuss', label: '기획 논의', roleCategory: 'planner', instructionTemplate: '사용자 요청: {{userPrompt}}\n\n' + '이번 작업의 목표·사용자·성공 기준을 정리하세요. 결정 사항이 아니라 *논의 정리* 단계입니다.\n' + '- 누구를 위한 결과물인가\n- 핵심 가치 한 줄\n- 우리가 모르는 것 / 더 알아봐야 할 것\n- 위험 요소', }, { id: 'market-research', label: '시장 조사', roleCategory: 'researcher', instructionTemplate: '기획 논의 정리: {{stage.plan-discuss}}\n\n' + '위 맥락에서 *시장 측면*을 조사하세요. 추측 금지, 데이터/사례 기반.\n' + '- 비슷한 시도가 이미 있나 (3개 이상)\n- 시장 크기·고객 페르소나\n- 가격대·수익화 패턴\n결과는 "출처(또는 일반론임을 명시)" 표시.', }, { id: 'trend-research', label: '트렌드 조사', roleCategory: 'researcher', instructionTemplate: '기획 논의: {{stage.plan-discuss}}\n시장 조사 결과: {{stage.market-research}}\n\n' + '*최근 트렌드*를 조사하세요. 6개월 이내 변화를 우선.\n' + '- 떠오르는 키워드/패턴\n- 사용자 기대치 변화\n- 우리가 활용할 수 있는 기술/문화 신호', }, { id: 'direction', label: '방향성 정의', roleCategory: 'planner', instructionTemplate: '기획 논의: {{stage.plan-discuss}}\n시장: {{stage.market-research}}\n트렌드: {{stage.trend-research}}\n\n' + '위 3개를 종합해 *우리가 갈 방향*을 한 문단으로 결론지어요.\n포함:\n' + '- 무엇을 만들 것인가 (제품 한 줄 설명)\n- 누가 첫 사용자인가\n- 안 만들 것 (out of scope)\n- 성공 판단 기준 1~3가지', }, { id: 'plan-draft', label: '기획문서 초안', roleCategory: 'planner', instructionTemplate: '방향성: {{stage.direction}}\n\n' + '이 방향에 맞는 *기획서 초안*을 마크다운으로 작성하세요.\n' + '필수 섹션:\n' + '## 배경\n## 목표\n## 핵심 사용자 시나리오 (3개 이상, 구체적)\n## 주요 기능 목록\n## 비기능 요구사항\n## 측정 지표 (KPI)\n## 미래 확장 / 비-목표\n\n' + '아직 *최종본 아님* — 검토자가 피드백 줄 수 있도록 가정·미확정 사항을 명시하세요.', }, { id: 'plan-review', label: '기획문서 검토', roleCategory: 'inspector', instructionTemplate: '검토 대상: {{stage.plan-draft}}\n\n' + '*감리* 관점에서 기획서를 검토하세요. 칭찬 X, 구체적 피드백 O.\n' + '확인 사항:\n- 시나리오가 구체적인가 ("사용자가 X를 한다" vs "사용자가 잘 쓴다")\n' + '- 기능 vs 시나리오 매핑이 1:1로 되는가\n- 측정 가능한 성공 기준이 있는가\n- 빠진 케이스/엣지 케이스\n\n' + '결론은 반드시 "✅ 승인" 또는 "❌ 재작업 필요: <항목 나열>" 로 시작.', loopBackPattern: '재작업 필요|reject|보완 필요', loopBackTo: 'plan-draft', maxIterations: 3, }, { id: 'plan-final', label: '기획문서 최종본', roleCategory: 'planner', instructionTemplate: '초안: {{stage.plan-draft}}\n검토 피드백: {{stage.plan-review}}\n\n' + '피드백을 모두 반영해 *최종 기획서*를 다시 쓰세요. 다음 단계(개발 설계)에서 그대로 사양서로 쓸 정도로 명확해야 합니다.', }, { id: 'dev-design', label: '개발 설계', roleCategory: 'developer', instructionTemplate: '최종 기획서: {{stage.plan-final}}\n\n' + '이 기획서 기준으로 *개발 설계 문서*를 작성하세요. 아직 코드는 쓰지 않습니다.\n' + '포함:\n## 데이터 모델\n## 컴포넌트/모듈 분할\n## 외부 의존성\n## 단계별 구현 순서 (체크리스트)\n## 테스트 전략\n## 알려진 리스크', }, { id: 'design-review', label: '설계 검토', roleCategory: 'inspector', instructionTemplate: '설계 문서: {{stage.dev-design}}\n기획서: {{stage.plan-final}}\n\n' + '설계가 기획 의도를 모두 커버하는지 *감리*하세요. 누락된 시나리오·과도한 over-engineering이 있나.\n' + '결론은 "✅ 승인" 또는 "❌ 재작업 필요: ..." 로 시작.', loopBackPattern: '재작업 필요|reject|보완 필요', loopBackTo: 'dev-design', maxIterations: 2, }, { id: 'dev-impl', label: '개발 진행', roleCategory: 'developer', instructionTemplate: '설계: {{stage.dev-design}}\n기획서: {{stage.plan-final}}\n\n' + '설계대로 *실제 코드를 작성*하세요. 반드시 ConnectAI 액션 태그(``, ``, ``)를 사용해 디스크에 떨어지도록.\n' + '코드 블록만 보여주고 "생성 완료"라고 말하면 디스크엔 아무것도 안 만들어집니다.\n\n' + '[빈 깡통 금지 — 가장 자주 발생하는 실패 패턴]\n' + '1. 파일은 **하나씩** 생성. 한 파일 안의 **모든 함수·메서드·클래스 본문을 완전히 구현** 후 다음 파일로.\n' + '2. **금지 패턴**: `def foo(): pass` · `def foo(): ...` · `def foo(): raise NotImplementedError` · `def foo(): # TODO` · 빈 class 본문 (`class Foo: pass`) · imports 만 있는 파일.\n' + '3. 함수 본문이 정말 비어도 되는 경우는 *인터페이스/추상 메서드* 만. 나머지는 **무조건 동작하는 코드** 작성. 단순화는 OK, 빈 깡통은 NO.\n' + '4. 각 파일 생성 직후 한 줄 자가 검증: "이 파일이 정말 동작하나? 빈 본문 없나?". 없으면 보강 후 `` 로 재기록.\n' + '5. 모든 파일 생성 끝나면 *최종 요약* 에 (a) 생성된 파일 수 (b) 각 파일의 핵심 함수 동작 한 줄씩 명시.\n\n' + '⚠️ "구조만 잡고 추후 구현" 패턴은 즉시 검출돼 자동 재작업이 트리거됩니다. 처음부터 본문까지 완전 구현하세요.', }, { id: 'qa', label: 'QA 진행', roleCategory: 'qa', instructionTemplate: '구현 결과: {{stage.dev-impl}}\n기획서: {{stage.plan-final}}\n\n' + '*테스트 시나리오를 직접 실행*해 기능을 검증하세요. 케이스별로 PASS/FAIL 명확히 적고, 실패 시 재현 방법을 적어요.\n' + '결론은 "✅ 모든 케이스 통과" 또는 "❌ 버그 발견: ..." 로 시작 (loop-back regex가 이걸 봅니다).', loopBackPattern: '버그 발견|❌|버그|오류|실패', loopBackTo: 'dev-impl', maxIterations: 4, }, { id: 'deploy', label: '라이브 배포', roleCategory: 'developer', instructionTemplate: 'QA 통과 결과: {{stage.qa}}\n\n' + '배포 절차를 *실행*하세요. README 갱신, 버전 태깅, 배포 스크립트 실행 등 필요한 명령은 `` 로.\n' + '마지막에 배포된 상태 요약과 사용자에게 안내할 한 줄 (📝 다음).', }, ], }; /** * 짧은 "기획만" 워크플로 — 사용자가 기획문서까지만 필요한 경우. 각 산출물 * stage에 3-way 검수 사이클을 켜서 셋(작업자 + 감리 + CEO) 합의로 통과 * 시키는 패턴을 보여준다. 풀-프로덕트와 달리 별도 review stage를 두지 않고 * 사이클로 합쳐서 빠르게 끝낸다. */ const PLAN_ONLY: PipelineTemplate = { templateId: 'plan-only', name: '기획서까지만 (검수 사이클)', description: '시장 조사 → 방향성 → 기획서. 각 산출물 stage에서 검수자 + CEO 합의로 통과시키는 짧은 워크플로.', suggestedPipelineId: 'plan-only', suggestedPipelineName: '기획서 작성', stages: [ { id: 'market-research', label: '시장 조사', roleCategory: 'researcher', instructionTemplate: '사용자 요청: {{userPrompt}}\n\n' + '이 요청 맥락에서 *시장 측면*을 조사하세요. 추측 금지, 데이터/사례 기반.\n' + '- 비슷한 시도가 이미 있나 (3개 이상)\n- 시장 크기·고객 페르소나\n- 가격대·수익화 패턴\n' + '결과는 "출처(또는 일반론임을 명시)" 표시.', }, { id: 'direction', label: '방향성 정의', roleCategory: 'planner', instructionTemplate: '사용자 요청: {{userPrompt}}\n시장 조사: {{stage.market-research}}\n\n' + '*우리가 갈 방향*을 한 문단으로 결론짓고 측정 가능한 성공 기준을 1~3개 적으세요.', reviewWith: 'inspector', reviewMaxRounds: 3, }, { id: 'plan-doc', label: '기획문서', roleCategory: 'planner', instructionTemplate: '방향성: {{stage.direction}}\n\n' + '아래 섹션 구조로 *기획서*를 마크다운으로 작성하세요. 합의 통과 후엔 사장님께 그대로 전달됩니다.\n\n' + '## 배경\n## 목표\n## 핵심 사용자 시나리오 (3개 이상, 구체적)\n## 주요 기능 목록\n## 비기능 요구사항\n## 측정 지표 (KPI)\n## 미래 확장 / 비-목표', reviewWith: 'inspector', reviewMaxRounds: 3, }, ], }; /** * "개발까지만" — FULL_PRODUCT_DEV 의 1~10 단계 (plan-discuss ~ dev-impl) 만 진행. * QA·배포는 사용자가 코드 받아본 뒤 수동 처리하길 원하는 경우. dev-impl 종료 * 직후 CEO 합산 보고로 turn 종료. design-review 의 dev-design loop-back 은 유지. * * stages 는 FULL_PRODUCT_DEV.stages.slice(0, 10) 으로 *참조 공유* — 사용자가 * 템플릿 stamp 시 deep-copy 되므로 본 정의 객체는 read-only 안전. */ const DEV_ONLY: PipelineTemplate = { templateId: 'dev-only', name: '개발까지만 (10단계)', description: '풀 워크플로에서 QA·배포 단계를 뺀 버전. 기획 → 개발까지 만들고 검증·배포는 사용자가 직접 챙깁니다.', suggestedPipelineId: 'dev-only', suggestedPipelineName: '기획→개발 파이프라인', stages: FULL_PRODUCT_DEV.stages.slice(0, 10), }; /** Read-only registry of templates the UI surfaces. */ export const PIPELINE_TEMPLATES: PipelineTemplate[] = [ PLAN_ONLY, DEV_ONLY, FULL_PRODUCT_DEV, ]; /** * 스코프 단축 표기 — 사용자가 사이드바에서 한 번에 보고 선택할 수 있는 3-way 라벨. * 각 키는 PIPELINE_TEMPLATES 의 templateId 와 1:1. 매핑 변경 시 UI 동기화 필요. */ export const SCOPE_PRESETS = [ { templateId: 'plan-only', shortLabel: '기획만', longLabel: '기획서까지만' }, { templateId: 'dev-only', shortLabel: '개발까지', longLabel: '개발까지만' }, { templateId: 'full-product-dev', shortLabel: '풀', longLabel: '배포까지 풀 파이프라인' }, ] as const; export function getPipelineTemplate(id: string): PipelineTemplate | undefined { return PIPELINE_TEMPLATES.find((t) => t.templateId === id); }