dsh-plugin-teamflow 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.mjs","names":[],"sources":["../host/constants.ts","../host/util.ts","../host/core/context.ts","../host/core/backlog.ts","../host/core/teams.ts","../host/core/metering.ts","../host/core/guard.ts","../host/core/runner.ts","../host/core/state.ts","../host/prompts/index.ts","../host/core/triage.ts","../host/core/report.ts","../host/core/sanity.ts","../host/core/pipeline.ts","../host/index.ts"],"sourcesContent":["/**\n * dsh-plugin-teamflow — 常量与阶段映射(稳定底座,无依赖;被 util/core 引用)。\n */\n\n/** 单阶段连续失败重试上限。 */\nexport const RETRY_LIMIT = 2\n/** QA→开发→复验 打回闭环的最大轮数(QA 发现缺陷 → 打回开发修复 → 复验;超过则需人工介入,防无限循环)。 */\nexport const QA_REWORK_LIMIT = 2\n/** 单阶段 token 熔断预算(官方口径总消耗:input+cacheRead+cacheWrite+output 累计)。 */\nexport const STAGE_TOKEN_BUDGET = 60000\n/* ── 子代理单调用护栏(进行中退化检测;纯进度信号,无时间配额——慢吞吐的合法任务不受影响)── */\n/** 护栏轮询间隔 ms。 */\nexport const GUARD_POLL_MS = 15000\n/** 复读判定:滑动窗口内同一规范化流式片段出现次数上限(正常 agent 措辞有变化,几乎不可能逐字重复)。 */\nexport const GUARD_REPEAT_LIMIT = 12\n/** 复读检测滑动窗口大小(条)。 */\nexport const GUARD_WINDOW_SIZE = 400\n/** 挂死判定:连续这么久没有任何新会话事件(provider 挂起/静默死亡)→ stalled(走预算门转人工)。 */\nexport const GUARD_SILENCE_MS = 10 * 60_000\n/** 空转判定:会话仍在产出事件但连续这么久没有任何工具调用(纯推理打转/改写式循环)→ stalled。要求已见过至少一次工具调用。 */\nexport const GUARD_NO_TOOL_MS = 15 * 60_000\n/** 假阳性完成检测:明确拒绝/放弃模式的输出视为未产出。 */\nexport const REFUSAL_PATTERN = /(无法完成|不能完成|无法继续|抱歉|对不起|我(无法|不能)|无法执行|cannot complete|unable to)/i\n/** 各阶段最小产出长度(防\"假完成\":空话/一句话冒充交付)。 */\nexport const STAGE_MIN_LENGTH = { prd: 400, design: 250, arch: 250, tech: 350, dev: 60, qa: 250, acceptance: 150 }\n/** backlog 状态机(需求/任务/缺陷)。 */\nexport const STATUS = {\n req: ['created', 'in-progress', 'pending-acceptance', 'accepted', 'needs-human', 'closed'],\n task: ['pending', 'running', 'testable', 'testing', 'pending-acceptance', 'accepted', 'rework', 'needs-human', 'cancelled'],\n bug: ['open', 'claimed', 'fixed', 'verified', 'reopened', 'needs-human'],\n}\n/** 流水线阶段顺序与 key 映射(resume/pipeline 用)。 */\nexport const PHASE_ORDER = ['PRD 产品需求', 'UI/UX 设计', '架构规划', '技术方案', '开发', 'QA 测试', '产品验收']\nexport const PHASE_KEY_OF = { prd: 'PRD 产品需求', design: 'UI/UX 设计', scaffold: '架构规划', tech: '技术方案', dev: '开发', qa: 'QA 测试', acceptance: '产品验收' }\nexport const PHASE_KEY_BY_NAME = { 'PRD 产品需求': 'prd', 'UI/UX 设计': 'design', '架构规划': 'scaffold', '技术方案': 'tech', '开发': 'dev', 'QA 测试': 'qa', '产品验收': 'acceptance' }\n\n/**\n * 角色键单一事实来源(byRole token 分段 / stateSliceFor 切片 / noteTaskAssign 写入共用)。\n * 对应 PHASE_ORDER 各阶段;'design'/'arch' 为条件阶段(needDesign/needScaffold),无对应阶段则不累计。\n */\nexport const ROLE_KEYS = ['pm', 'design', 'arch', 'tech', 'dev', 'qa', 'acceptance'] as const\nexport type RoleKey = (typeof ROLE_KEYS)[number]\n/** 阶段显示名 → 角色键(任务卡 byRole 累计用;未知阶段归 'other')。 */\nexport const PHASE_ROLE: Record<string, RoleKey> = {\n 'PRD 产品需求': 'pm',\n 'UI/UX 设计': 'design',\n '架构规划': 'arch',\n '技术方案': 'tech',\n '开发': 'dev',\n 'QA 测试': 'qa',\n '产品验收': 'acceptance',\n}\n\n/**\n * 档位→阶段集策略表(ADR-0004「阶段集差异执行」的单一事实来源)。\n * 每个档位声明执行顺序的阶段规则;`when` 为条件阶段(满足才含入)。\n * ⚠ 设计要点:design/scaffold 在所有档位都按**显式 flag**(needDesign/needScaffold)条件化,\n * 显式请求永不被档位吞掉(v0.8.1「lite 不再吞显式设计」原则的泛化)。\n * 档位之间的真正差异由 pipeline 的 prompt 形态承担:PRD 形态(prd/techChange/patchConfirm)、\n * tech 文档形态(isHeavy/architect 蓝图)、patch 无独立 QA。\n * - patch:无独立 QA(单点修复,开发自测兜底);显式 needDesign/needScaffold 仍有效。\n * - full 的 PM 前置评估、medium 强制设计为后续待办(见 AGENTS §6),非本表范围。\n */\nexport type StageKey = 'prd' | 'design' | 'scaffold' | 'tech' | 'dev' | 'qa' | 'acceptance'\nexport type StageMode = 'full' | 'medium' | 'lite' | 'tech' | 'patch'\nexport interface StagePolicyOpts {\n needDesign?: boolean\n needScaffold?: boolean\n}\nexport interface StageRule {\n key: StageKey\n /** 条件阶段:满足才含入执行集;缺省为恒含。 */\n when?: (o: StagePolicyOpts) => boolean\n}\nexport const STAGE_POLICY: Record<StageMode, StageRule[]> = {\n full: [\n { key: 'prd' },\n { key: 'design', when: (o) => !!o.needDesign },\n { key: 'scaffold', when: (o) => !!o.needScaffold },\n { key: 'tech' },\n { key: 'dev' },\n { key: 'qa' },\n { key: 'acceptance' },\n ],\n medium: [\n { key: 'prd' },\n { key: 'design', when: (o) => !!o.needDesign },\n { key: 'scaffold', when: (o) => !!o.needScaffold },\n { key: 'tech' },\n { key: 'dev' },\n { key: 'qa' },\n { key: 'acceptance' },\n ],\n lite: [\n { key: 'prd' },\n { key: 'design', when: (o) => !!o.needDesign },\n { key: 'scaffold', when: (o) => !!o.needScaffold },\n { key: 'tech' },\n { key: 'dev' },\n { key: 'qa' },\n { key: 'acceptance' },\n ],\n tech: [\n { key: 'prd' },\n { key: 'design', when: (o) => !!o.needDesign },\n { key: 'scaffold', when: (o) => !!o.needScaffold },\n { key: 'tech' },\n { key: 'dev' },\n { key: 'qa' },\n { key: 'acceptance' },\n ],\n patch: [\n { key: 'prd' },\n { key: 'design', when: (o) => !!o.needDesign },\n { key: 'scaffold', when: (o) => !!o.needScaffold },\n { key: 'tech' },\n { key: 'dev' },\n { key: 'acceptance' },\n ],\n}\n\n/** 按档位 + 条件展开实际执行阶段集(纯函数;未知档回退 full)。 */\nexport function resolveStages(mode: StageMode | string | null | undefined, opts: StagePolicyOpts = {}): StageKey[] {\n const rules = STAGE_POLICY[(mode || 'full') as StageMode] || STAGE_POLICY.full\n return rules.filter((r) => !r.when || r.when(opts)).map((r) => r.key)\n}\n","/**\n * dsh-plugin-teamflow — 通用纯工具(底座;依赖 constants.ts,无其他依赖)。\n */\nimport { REFUSAL_PATTERN, STAGE_MIN_LENGTH } from './constants.ts'\n\nexport function toText(v) {\n if (v === null || v === undefined) return ''\n return typeof v === 'string' ? v : JSON.stringify(v)\n}\nexport function clip(text, n) {\n const s = toText(text)\n return s.length > n ? s.slice(0, n) + `\\n…[已截断 ${s.length - n} 字符]` : s\n}\n/** 干净截断(无「已截断」后缀、压平空白):用于持久化展示字段——截断后缀会烙进数据,实体越存越脏。 */\nexport function snippet(text, n) {\n return String(text === null || text === undefined ? '' : text).replace(/\\s+/g, ' ').trim().slice(0, n)\n}\nexport function extractText(blocks) {\n if (!Array.isArray(blocks)) return ''\n return blocks.filter((b) => b && b.type === 'text' && typeof b.text === 'string').map((b) => b.text).join('\\n')\n}\n\n/**\n * ADR-0008 任务夹命名:<yyyyMMdd>-r<N>[-<slug>]。\n * - date 用本地时区(用户在东八区晚上建的需求不能落到\"明天\")\n * - reqId 形如 req-8 → 段 r8(防撞兜底:slug 缺失/非法时夹名退化为 <date>-r<N>)\n * - slug 由 triage 模型给出并经 host 校验([a-z0-9-]{3,24}),此处再做一次防御性清洗\n */\nexport function runFolderName(date: Date, reqId: string, slug?: string | null): string {\n const ymd = `${date.getFullYear()}${String(date.getMonth() + 1).padStart(2, '0')}${String(date.getDate()).padStart(2, '0')}`\n const n = String(reqId || '').replace(/^req[-_]/i, 'r')\n const clean = String(slug || '').toLowerCase().replace(/[^a-z0-9-]+/g, '-').replace(/^-+|-+$/g, '')\n const valid = /^[a-z0-9][a-z0-9-]{2,23}$/.test(clean) ? clean : ''\n return valid ? `${ymd}-${n}-${valid}` : `${ymd}-${n}`\n}\n/**\n * 产品名白名单归一化:只允许 [a-zA-Z0-9_-] 组成的路径段(可含 / 分隔)。\n * 拒绝:绝对路径、盘符、. / .. 段、空段、空白字符 —— 防止穿越 $DSH_HOME 写任意目录。\n * @returns {string|null} 归一化后的安全产品名,非法输入返回 null。\n */\nexport function normalizeRoot(v: unknown): string | null {\n if (typeof v !== 'string' || !v.trim()) return null\n const s = v.trim().replace(/\\\\/g, '/')\n if (s.startsWith('/') || s.startsWith('.')) return null // 绝对路径、./、../、..\n if (/^[a-zA-Z]:/.test(s)) return null // 盘符(C:\\x)\n if (s.includes('//') || s.includes('..')) return null // 空段、穿越段\n const segments = s.split('/')\n for (const seg of segments) {\n if (!/^[a-zA-Z0-9_-]+$/.test(seg)) return null // 每段仅字母数字下划线连字符\n }\n return segments.join('/')\n}\nexport function normalizeTasks(tasks: unknown): Array<{ title: string; spec: string }> {\n if (!Array.isArray(tasks)) return []\n const out = []\n for (const t of tasks) {\n if (t === null || t === undefined) continue\n if (typeof t === 'string') {\n const s = t.trim()\n if (s) out.push({ title: s, spec: '' })\n } else if (typeof t === 'object') {\n const title = typeof t.title === 'string' && t.title.trim() ? t.title.trim() : null\n if (title) out.push({ title, spec: typeof t.spec === 'string' ? t.spec : '' })\n }\n if (out.length >= 8) break\n }\n return out\n}\nexport function sanitizeSnapOptions(o) {\n const opts = (o && typeof o === 'object') ? o : {}\n return {\n needDesign: opts.needDesign === true,\n needScaffold: opts.needScaffold === true,\n lite: opts.lite === true,\n mode: (typeof opts.mode === 'string' && opts.mode) ? opts.mode : undefined,\n productRoot: typeof opts.productRoot === 'string' ? opts.productRoot : null,\n maxConcurrency: (Number.isFinite(opts.maxConcurrency) && opts.maxConcurrency > 0) ? Math.min(opts.maxConcurrency, 8) : null,\n tasks: Array.isArray(opts.tasks) ? opts.tasks.map((t) => ({ title: String((t && t.title) || ''), spec: String((t && t.spec) || '') })) : [],\n }\n}\nexport const SAFE_SIGNAL = { aborted: false, addEventListener: () => {}, removeEventListener: () => {} }\nexport function normalizeSignal(s) {\n return (s && typeof s === 'object' && typeof s.addEventListener === 'function' && typeof s.aborted === 'boolean') ? s : SAFE_SIGNAL\n}\n\n/** 产出物实质校验:非空 + 无拒绝词 + 达到阶段长度下限。 */\nexport function hasSubstance(phase: string, text: string | null | undefined): boolean {\n if (!text || !text.trim()) return false\n if (REFUSAL_PATTERN.test(text)) return false\n const min = STAGE_MIN_LENGTH[phase] ?? 100\n return text.trim().length >= min\n}\n\n/** 不可重试的失败原因(上下文耗尽/超长等——重试同一 prompt 大概率复现)。 */\nexport function isUnretryable(reason: unknown, outcome: unknown): boolean {\n const r = String(reason || outcome || '')\n return /context|limit|max-token|token|tool-error/i.test(r)\n}\n\n/** 阶段产出 → 精简交接摘要(供审计/展示;产出含显式 <!-- handoff --> 块则优先取块内内容)。 */\nexport function handoffBrief(text: string | null | undefined): string {\n if (!text || !String(text).trim()) return ''\n const m = String(text).match(/<!--\\s*handoff\\s*-->([\\s\\S]*?)(?:<!--\\s*\\/handoff\\s*-->|$)/)\n const brief = (m && m[1] ? m[1] : String(text)).trim()\n return clip(brief, 2000)\n}\n\n/**\n * 验收结论解析:只以显式「验收结论 / 整体结论」行为准(acceptancePrompt 强制 4 档固定话术),\n * 不做正文散文朴素子串匹配。历史误报实锤(run tf-msytlok5):验收报告 ✅ 通过,其记忆回写段一句\n * 「SUMMARY.md 结构无需改动」(= 结构无需变更)被旧正则「无需改动」子串命中 → 误判 reject →\n * 整条流水线置 failed。reject 词在正文里常以否定/引用/对照形式出现,故:\n * - 「📝 需求不适用」是验收负责人专用的强结论词,允许全文命中;\n * - 其余 reject 词(需求与实际不符/站不住/无效/无需改动等)仅在结论行且该行不含「通过/✅/⚠️」时才算;\n * - rework 词仅认结论行(且不与「✅ 通过」同现)。\n * @param {unknown} text 验收报告全文\n * @returns {'accepted'|'rework'|'reject'}\n */\nexport function parseAcceptanceVerdict(text) {\n const acc = String(text || '')\n const accLine = (acc.split('\\n').find((l) => /验收结论|整体结论/.test(l)) || '').replace(/\\|.*/, '').trim()\n // M3 架构门禁:明确的架构打回信号 → rework(无论结论行写没写「通过」)。\n // 修正误杀(tf-mt1pulkw):验收正文「架构一致性核验 — PASS,无返工项」被朴素正则\n // 当成打回信号 → 误判 rework。现在改为「独立断言词 + 否定保护」:\n // 打回信号 = 出现明确的架构缺陷断言词(重复实现/偏离蓝图/该拆未拆… 或 架构…返工/打回/需重构),\n // 且未被否定保护(无返工/非漂移/M3 PASS/架构一致性良好/无该抽象未抽象…)覆盖时。\n const hasArchRedFlag =\n /重复实现|重复适配|偏离蓝图|未按蓝图|该拆未拆|该抽象未抽象|破坏既有结构|结构性.*问题|架构(打回|需重构)|需.*返工|返工.*项.*(存在|仍)|仍.*(返工|重构)/.test(acc)\n const archNegated =\n /无返工|无.*返工|不返工|无架构打回|无.*打回|非漂移|无.*重复|无.*偏离|无.*抽象.*问题|无.*蓝图.*问题|架构一致性.*(PASS|良好|达标|通过|无问题)|M3.*(PASS|通过|达标)|架构.*(达标|无问题|良好)/.test(acc)\n if (hasArchRedFlag && !archNegated) return 'rework'\n if (/❌\\s*不通过|需返工|未通过/.test(accLine) && !/✅\\s*通过/.test(accLine)) return 'rework'\n if (/📝\\s*需求不适用/.test(acc)) return 'reject'\n if (!/通过|✅|⚠️/.test(accLine) && /需求不适用|需求与实际不符|需求站不住|需求无效|无需改动|无需修改/.test(accLine)) return 'reject'\n return 'accepted'\n}\n\n/** 架构蓝图(M1/M2):tech/architect 阶段的产物契约,host 解析注入 dev。 */\nexport interface BlueprintModule {\n responsibility: string\n dependsOn?: string[]\n assemblyOrder?: number\n why?: string\n}\nexport interface BlueprintTask {\n title: string\n files?: string[]\n spec?: string\n}\nexport interface Blueprint {\n summary: string\n modules?: Record<string, BlueprintModule>\n duplications?: string[]\n tasks?: BlueprintTask[]\n /** 人读渲染文本(注入 dev/QA 用的简版) */\n render: string\n}\n\nconst bdOpen = '<!-- blueprint -->'\nconst bdClose = '<!-- /blueprint -->'\n\n/**\n * 从 tech/architect 产出中提取架构蓝图 JSON 块。\n * 约定:产出内嵌 `<!-- blueprint -->{...json...}<!-- /blueprint -->`。\n * 解析失败返回 null(不影响主流程)。\n */\n/**\n * 抢救「顶层值提前闭合」类畸形蓝图 JSON。\n * 实锤(run tf-mt85o5jj):模型在 duplications 数组后多写一个 `}`,根对象提前闭合,\n * 后续 `,\"tasks\":[…]` 被判为 JSON 外内容 → 整块解析失败 → 开发任务回退单任务「整体开发」,并行度丢失。\n * 修复策略:定位 parse 报错位置;若 head 是完整对象(以 } 收尾)且 tail 是 `,\"key\":` 续写形态,\n * 删掉 head 末尾那个提前闭合的根括号后拼接重试(最多 3 轮)。\n */\nfunction repairBlueprintJson(raw: string): string | null {\n let cur = raw\n for (let round = 0; round < 3; round++) {\n let err: unknown = null\n try { JSON.parse(cur); return cur } catch (e) { err = e }\n const m = String(((err as Error) && (err as Error).message) || '').match(/position (\\d+)/)\n if (!m) return null\n const pos = Number(m[1])\n const head = cur.slice(0, pos)\n const tail = cur.slice(pos)\n if (!/^\\s*,?\\s*\"/.test(tail)) return null\n if (!/\\}\\s*$/.test(head)) return null\n cur = head.replace(/\\}\\s*$/, '') + tail.replace(/^\\s*,\\s*/, ',')\n }\n return null\n}\n\nexport function extractBlueprint(text: string | null | undefined): Blueprint | null {\n const s = String(text || '')\n const i = s.indexOf(bdOpen)\n const j = s.indexOf(bdClose)\n if (i === -1 || j === -1 || j <= i) return null\n const raw = s.slice(i + bdOpen.length, j).trim()\n let parsed: { summary?: string; modules?: Record<string, BlueprintModule>; duplications?: string[]; tasks?: BlueprintTask[] } | null = null\n try { parsed = JSON.parse(raw) } catch (e) {\n const repaired = repairBlueprintJson(raw)\n if (repaired) { try { parsed = JSON.parse(repaired) } catch (e2) { parsed = null } }\n }\n if (!parsed || typeof parsed !== 'object') return null\n const summary = typeof parsed.summary === 'string' ? parsed.summary : ''\n const modules = parsed.modules || {}\n const duplications = Array.isArray(parsed.duplications) ? parsed.duplications : []\n const tasks = Array.isArray(parsed.tasks) ? parsed.tasks : []\n const parts: string[] = []\n if (summary) parts.push(`架构判断:${summary}`)\n const modEntries = Object.entries(modules)\n if (modEntries.length) parts.push(`模块蓝图:${modEntries.map(([f, m]) => `${f}→${m.responsibility || ''}${m.why ? `(${m.why})` : ''}`).join(';')}`)\n if (duplications.length) parts.push(`重复风险:${duplications.join(';')}`)\n if (tasks.length) parts.push(`架构拆解任务:${tasks.map((t) => t.title).join(',')}`)\n return { summary, modules, duplications, tasks, render: `【架构蓝图(tech 阶段产出,dev 须在既有架构上实现,勿重建)】\\n${parts.join('\\n')}` }\n}\n","/**\n * dsh-plugin-teamflow core — 运行期共享状态(进程单例)。\n * - runtime(agents/subagents/tokenMeter/workspaceRegistry/agentDefaultModel):由 index=TeamflowService 的 static inject 注入(setRuntime)。\n * - runs/inFlight/activeProducts:流水线运行期 Map(跨 runner/pipeline/report/服务共享)。\n * 这是 ADR-0004「共享状态」在编排层的落点:共享对象集中、单向被 core 各模块 import(不反向)。\n */\nimport { slugPath } from '../../store.ts'\n\n/** 子代理/计量等宿主能力(由 TeamflowService 装配时 setRuntime 注入)。字段为鸭子类型:消费方自行窄化。 */\nexport const runtime: {\n agents?: any\n subagents?: any\n tokenMeter?: any\n workspaceRegistry?: any\n agentDefaultModel?: any\n} = {}\n\nexport function setRuntime(agents: unknown, subagents: unknown, tokenMeter: unknown, workspaceRegistry?: unknown, agentDefaultModel?: unknown): void {\n runtime.agents = agents\n runtime.subagents = subagents\n runtime.tokenMeter = tokenMeter\n runtime.workspaceRegistry = workspaceRegistry\n runtime.agentDefaultModel = agentDefaultModel\n}\n\n/** 运行期 run 注册表(runId → Journal)。 */\nexport const runs = new Map()\n/** 进行中的 stage 注册表(runId → { run, stage }),供取消/完成清理。 */\nexport const inFlight = new Map()\n/** 产品级 backlog 缓存(product → BacklogStore)。 */\nexport const stores = new Map()\n/** 产品级并发锁:product → 活跃 runId(同一产品同时只允许一条流水线)。 */\nexport const activeProducts = new Map()\n\n/** 可用的子代理 provider 名(优先 spawn)。 */\nexport function providerName(): string | null {\n const subagents = runtime.subagents as { list?: () => string[] } | undefined\n if (!subagents || typeof subagents.list !== 'function') return null\n const names = subagents.list()\n if (names.indexOf('spawn') !== -1) return 'spawn'\n return names.length > 0 ? names[0] : null\n}\n\n/** 会话/Agent 鸭子形状(只读所需叶子字段)。 */\ninterface AgentSessionLike { header?: { cwd?: string }; id?: string }\ninterface AgentLike { session?: AgentSessionLike }\n\n/** workspaceRegistry.resolveByPath 返回的鸭子形状。 */\ninterface DshWorkspace { id: string; title: string; path: string }\n\n/**\n * 从发起会话推导工作区作用域。\n *\n * 优先级:\n * 1. workspaceRegistry.resolveByPath(cwd) → 用 workspace.id(UUID,稳定)作 projectKey\n * 2. 回退到 session cwd 的 basename + 短 hash(兼容无 workspaceRegistry 的场景)\n * 3. 兜底 'default'\n *\n * projectKey 用于 $DSH_HOME/teamflow/<projectKey>/ 目录,要求:\n * - 同一 workspace 永远解析到同一个 key(UUID 天然满足)\n * - 不同 workspace 即使 basename 相同也不碰撞(UUID 天然满足)\n * - 目录名安全(只含 [a-zA-Z0-9_-])\n */\nexport function workspaceScopeOf(agent: unknown): { projectKey: string; workspaceId: string | null; path: string | null } {\n const session = (agent as AgentLike | null | undefined)?.session\n const cwd = session && session.header && typeof session.header.cwd === 'string' && session.header.cwd ? session.header.cwd : undefined\n\n // 优先:通过 workspaceRegistry 拿稳定 workspace UUID\n if (cwd && runtime.workspaceRegistry && typeof runtime.workspaceRegistry.resolveByPath === 'function') {\n try {\n const ws = runtime.workspaceRegistry.resolveByPath(cwd) as DshWorkspace | undefined\n if (ws && typeof ws.id === 'string') {\n // 目录名:workspace title(basename)+ workspace id 前 8 位(防同名碰撞)\n const safe = (ws.title || 'ws').replace(/[^a-zA-Z0-9_-]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 24) || 'ws'\n const idTag = ws.id.replace(/-/g, '').slice(0, 8)\n return { projectKey: `${safe}-${idTag}`, workspaceId: ws.id, path: cwd }\n }\n } catch (e) { /* resolveByPath 失败时走回退 */ }\n }\n\n // 回退:basename + hash(路径)\n if (cwd) {\n return { projectKey: slugPath(cwd), workspaceId: null, path: cwd }\n }\n\n // 兜底\n const sid = session && typeof session.id === 'string' && session.id ? session.id : null\n if (sid) {\n return { projectKey: slugPath(`session:${sid}`), workspaceId: null, path: null }\n }\n return { projectKey: 'default', workspaceId: null, path: null }\n}\n","/**\n * dsh-plugin-teamflow core — Backlog 数据层与状态机($DSH_HOME/teamflow/<product>/backlog/*)。\n * 依赖:store.ts(原子读写)、context.ts(stores 缓存)。\n */\nimport { fileFor, readJson, writeJson, teamflowRoot, persistJournal } from '../../store.ts'\nimport type { BacklogItem } from '../types.ts'\nimport { stores } from './context.ts'\nimport { STATUS, PHASE_ROLE } from '../constants.ts'\nimport { clip, snippet } from '../util.ts'\n\nexport class BacklogStore {\n product: string\n fileReq: string\n fileTask: string\n fileBug: string\n requirements: BacklogItem[]\n tasks: BacklogItem[]\n bugs: BacklogItem[]\n\n constructor(product: string | null | undefined) {\n this.product = product || 'default'\n this.fileReq = fileFor(this.product, 'requirements.json')\n this.fileTask = fileFor(this.product, 'tasks.json')\n this.fileBug = fileFor(this.product, 'bugs.json')\n this.requirements = readJson(this.fileReq, [])\n this.tasks = readJson(this.fileTask, [])\n this.bugs = readJson(this.fileBug, [])\n }\n persist(): void {\n writeJson(this.fileReq, this.requirements)\n writeJson(this.fileTask, this.tasks)\n writeJson(this.fileBug, this.bugs)\n }\n nextId(prefix: string): string {\n const used = new Set()\n for (const r of this.requirements) used.add(r.id)\n for (const t of this.tasks) used.add(t.id)\n for (const b of this.bugs) used.add(b.id)\n let n = 1\n while (used.has(`${prefix}-${n}`)) n++\n return `${prefix}-${n}`\n }\n find(kind: string, id: string): BacklogItem | undefined {\n const list = kind === 'req' ? this.requirements : kind === 'task' ? this.tasks : this.bugs\n return list.find((x) => x.id === id)\n }\n pushEvent(item: BacklogItem, from: string | null, to: string, reason: string | null | undefined): void {\n item.status = to\n item.updatedAt = Date.now()\n item.events = item.events || []\n item.events.push({ at: Date.now(), by: 'teamflow', from, to, reason: reason || '' })\n if (item.events.length > 50) item.events = item.events.slice(-50)\n this.persist()\n }\n}\n\n/** 获取(并缓存)某产品的 BacklogStore。 */\nexport function storeFor(product: string | null | undefined): BacklogStore {\n const key = product || 'default'\n let s = stores.get(key) as BacklogStore | undefined\n if (!s) { s = new BacklogStore(key); stores.set(key, s) }\n return s\n}\n\n/** backlog 摘要视图(Remote/工具层展示用,含持久化落盘路径)。 */\nexport function backlogSummary(product: string | null | undefined) {\n const store = storeFor(product)\n return {\n product: product || null,\n persistence: {\n mode: 'fs',\n durable: true,\n root: teamflowRoot(),\n files: {\n requirements: store.fileReq,\n tasks: store.fileTask,\n bugs: store.fileBug,\n },\n },\n requirements: store.requirements.slice(-20).map((r) => ({ id: r.id, title: r.title, status: r.status, humanIntervention: !!r.humanIntervention, taskIds: (r.taskIds || []).slice(-20), bugIds: (r.bugIds || []).slice(-20), createdAt: r.createdAt, updatedAt: r.updatedAt })).reverse(),\n tasks: store.tasks.slice(-80).map((t) => ({\n id: t.id, type: t.type || 'task', title: t.title, status: t.status,\n reqId: t.reqId || null, bugId: t.bugId || null, owner: t.owner || null,\n devAssign: t.devAssign || null, qaAssign: t.qaAssign || null, acceptBy: t.acceptBy || null,\n retries: t.retries || 0, humanIntervention: !!t.humanIntervention,\n usage: t.usage || null, byRole: t.byRole || {},\n subtaskIds: t.subtaskIds || [],\n parentId: t.parentId || null,\n failed: !!t.failed, childId: t.childId || null,\n spec: t.spec || null,\n startedAt: t.startedAt || null, endedAt: t.endedAt || null, updatedAt: t.updatedAt || null,\n summary: t.summary || '',\n })).reverse(),\n bugs: store.bugs.slice(-30).map((b) => ({ id: b.id, reqId: b.reqId || null, severity: b.severity || null, title: b.title, status: b.status, owner: b.owner || null, retries: b.retries || 0, humanIntervention: !!b.humanIntervention, updatedAt: b.updatedAt })).reverse(),\n }\n}\n\n/** backlog 状态流转(校验目标状态合法性,合法的终态自动清 needs-human)。\n * 只做 status + humanIntervention,不碰 assign——assign 是独立操作,由 teamflow_assign 工具或 noteTaskAssign 处理。 */\nexport function transitionBacklog(product: string | null | undefined, kind, id: string, to: string, reason: string | null | undefined, _meta?) {\n const store = storeFor(product)\n const item = store.find(kind, id)\n if (!item) return { ok: false, error: `找不到 ${kind} #${id}` }\n if (STATUS[kind].indexOf(to) === -1) return { ok: false, error: `非法状态 ${to}` }\n if (to === 'needs-human') item.humanIntervention = true\n if (to === 'accepted' || to === 'verified' || to === 'closed') item.humanIntervention = false\n store.pushEvent(item, item.status, to, reason || '')\n store.persist()\n return { ok: true, item: { id: item.id, status: item.status, humanIntervention: item.humanIntervention } }\n}\n\n/**\n * 解析 QA 报告中的结构化缺陷行(| 编号 | P0-3 | 模块 |...),跳过表头与 OBS 观察项。\n * 按管道单元格解析(不依赖固定列数),容忍 markdown 加粗/反引号(如 **P1** / `P1`),\n * 且只认三要素齐全 + 严重级为 P0-P3 的行——修正历史「QA 标 **P1** 却解析不到」的漏登记。\n */\nexport function parseDefects(qaText: string) {\n const defects = []\n const lines = qaText.split('\\n')\n for (const line of lines) {\n if (line.indexOf('|') === -1) continue\n const cells = line.split('|').map((s) => (s || '').trim())\n // 行首可能以 `|` 开头 → 第一个空单元格;去掉\n if (cells.length && cells[0] === '') cells.shift()\n if (cells.length < 3) continue\n const id = cells[0]\n const sev = (cells[1] || '').replace(/[*`>]/g, '')\n const mod = (cells[2] || '').replace(/[*`]/g, '').trim()\n if (!/^P[0-3]$/.test(sev)) continue\n if (!id || id === '编号' || id.indexOf('OBS') === 0) continue\n if (!mod) continue\n defects.push({ id, severity: sev, module: mod })\n }\n return defects\n}\n\n/** 流水线启动时建立需求 backlog(req + 唯一轮转任务卡;任务不再按角色拆分)。 */\nexport function initPipelineBacklog(journal, requirement, options) {\n const key = journal.workspace || 'default'\n const store = storeFor(key)\n const reqId = store.nextId('req')\n const req = {\n id: reqId, product: key, productRoot: options.productRoot || null,\n title: String(requirement || '未命名需求').replace(/\\s+/g, ' ').trim().slice(0, 120), status: 'created',\n createdAt: Date.now(), updatedAt: Date.now(), events: [], taskIds: [], bugIds: [], humanIntervention: false,\n }\n store.requirements.push(req)\n store.pushEvent(req, null, 'created', '流水线立项')\n // 单任务模型:一个需求 = 一个轮转任务(dev/qa/验收 在同一张卡上流转)\n const taskId = store.nextId('task')\n const task = {\n id: taskId, reqId, product: key, type: 'task',\n title: `需求任务 · ${snippet(requirement, 100)}`,\n status: 'pending', owner: null, devAssign: null, qaAssign: null, acceptBy: null,\n retries: 0, humanIntervention: false, createdAt: Date.now(), updatedAt: Date.now(),\n events: [], bugIds: [], usage: null, byRole: {},\n subtaskIds: [],\n }\n store.tasks.push(task)\n req.taskIds = [taskId]\n journal.reqId = reqId\n journal.taskId = taskId\n journal.taskMap = {} // 保留字段(单任务模型下为空;兼容旧序列化)\n store.pushEvent(req, 'created', 'in-progress', '流水线启动')\n store.persist()\n return { reqId, req, taskId }\n}\n\n/** 阶段 → 角色键(单一事实来源 constants.PHASE_ROLE;任务卡按角色累计 token 用)。 */\n\n\n/** 把单次 stage 的真实 usage 累计到任务卡(按角色拆分;单任务模型下所有阶段都属于该任务)。 */\nfunction applyStageUsage(task, role, stage) {\n if (!task || !stage) return\n const u = stage && stage.usage\n if (u && (u.input || u.cacheRead || u.cacheWrite || u.output)) {\n const merge = (acc) => {\n acc.input += u.input || 0\n acc.cacheRead += u.cacheRead || 0\n acc.cacheWrite += u.cacheWrite || 0\n acc.output += u.output || 0\n acc.calls += u.calls || 0\n return acc\n }\n if (!task.usage) task.usage = { input: 0, cacheRead: 0, cacheWrite: 0, output: 0, calls: 0 }\n task.usage = merge(task.usage)\n task.byRole = task.byRole || {}\n task.byRole[role] = merge(task.byRole[role] || { input: 0, cacheRead: 0, cacheWrite: 0, output: 0, calls: 0 })\n }\n}\n\n/**\n * 把 journal 中「新出现」的已完成阶段 usage 累计到唯一任务卡(按角色拆分)。\n * 幂等:task.accruedSeq 记录已累计的最大 stage.seq,断点续跑不会重复累计。\n */\nexport function noteTaskStageUsage(journal) {\n const store = storeFor(journal.workspace || 'default')\n const task = journal.taskId ? store.find('task', journal.taskId) : null\n if (!task) return\n let from = typeof task.accruedSeq === 'number' ? task.accruedSeq : 0\n const stages = (journal.stages || []).filter((s) => (s.seq || 0) > from)\n let touched = false\n for (const s of stages) {\n if (!s.usage) continue\n applyStageUsage(task, PHASE_ROLE[s.phase] || 'other', s)\n if ((s.seq || 0) > from) from = s.seq\n touched = true\n }\n if (touched) {\n task.accruedSeq = from\n store.persist()\n persistJournal(journal)\n }\n}\n\n/**\n * 阶段任务卡流转 + journal checkpoint(阶段状态变化立即落盘)。\n * 单任务模型:按 journal.taskId 定位唯一轮转任务;token 累计走 noteTaskStageUsage。\n * 只做 status + summary + humanIntervention,不碰 assign——assign 由 noteTaskAssign 独立处理。\n * meta: { by: 'dev'|'qa'|'pm' }(仅用于事件日志标注)\n */\nexport function advanceTask(journal, to, summary, reason, meta) {\n const store = storeFor(journal.workspace || 'default')\n const task = journal.taskId ? store.find('task', journal.taskId) : null\n if (!task) { persistJournal(journal); return }\n const from = task.status\n store.pushEvent(task, from, to, reason || '')\n if (summary) task.summary = snippet(summary, 2000)\n if (to === 'needs-human') task.humanIntervention = true\n if (to === 'accepted') task.humanIntervention = false\n store.persist()\n persistJournal(journal) // 阶段状态变化 → checkpoint\n}\n\n/** 为唯一任务卡记录某角色的分配人(只写 assign 字段,不碰 status)。\n * role='dev' → devAssign;role='qa' → qaAssign;role='accept' → acceptBy。 */\nexport function noteTaskAssign(journal, role: string, assignee) {\n const store = storeFor(journal.workspace || 'default')\n const task = journal.taskId ? store.find('task', journal.taskId) : null\n if (!task) return\n if (role === 'dev' && assignee) {\n task.devAssign = String(assignee)\n // 级联刷新 dev 子卡(子卡创建早于赋值的时序缺口:实锤 r9 run dev-17 devAssign 为空)\n for (const sid of task.subtaskIds || []) {\n const sub = store.find('task', sid)\n if (sub && !sub.devAssign) sub.devAssign = String(assignee)\n }\n }\n if (role === 'qa' && assignee) task.qaAssign = String(assignee)\n if (role === 'accept' && assignee) task.acceptBy = String(assignee)\n store.persist()\n persistJournal(journal)\n}\n\n/* ── Dev 子卡(每个并行 dev agent 一张) ───────────────────────────── */\n\n/** 创建 dev 子卡:流水线 dev 阶段开始时,为每个 devTaskDef 建一张子卡。 */\nexport function createSubtask(journal, title, spec) {\n const store = storeFor(journal.workspace || 'default')\n const mainTask = journal.taskId ? store.find('task', journal.taskId) : null\n if (!mainTask) return null\n const id = store.nextId('dev')\n const sub = {\n id, reqId: journal.reqId, parentId: journal.taskId, product: journal.workspace || 'default',\n type: 'subtask', title: `开发 · ${title}`, spec: spec || '',\n status: 'pending', devAssign: (mainTask && mainTask.devAssign) || null, owner: null,\n retries: 0, humanIntervention: false, createdAt: Date.now(), updatedAt: Date.now(),\n events: [], bugIds: [], usage: null, byRole: {},\n startedAt: null, endedAt: null, summary: null, childId: null, failed: false,\n }\n store.tasks.push(sub)\n mainTask.subtaskIds = mainTask.subtaskIds || []\n mainTask.subtaskIds.push(id)\n store.persist()\n persistJournal(journal)\n return sub\n}\n\n/** 完成 dev 子卡:设置 status=done/failed、时间戳、摘要、childId。 */\nexport function completeSubtask(journal, subId, failed, summary, childId) {\n const store = storeFor(journal.workspace || 'default')\n const sub = store.find('task', subId)\n if (!sub) return\n sub.status = failed ? 'failed' : 'done'\n sub.failed = !!failed\n sub.endedAt = Date.now()\n if (summary) sub.summary = snippet(summary, 1000)\n if (childId) sub.childId = childId\n sub.updatedAt = Date.now()\n store.persist()\n persistJournal(journal)\n}\n\n/** 累计 dev 子卡的 token usage(从对应的 journal stage 累计)。 */\nexport function noteSubtaskUsage(journal, subId, stage) {\n const store = storeFor(journal.workspace || 'default')\n const sub = store.find('task', subId)\n if (!sub || !stage) return\n applyStageUsage(sub, 'dev', stage)\n sub.updatedAt = Date.now()\n store.persist()\n persistJournal(journal)\n}\n\n/** 获取某需求下所有子卡。 */\nexport function getSubtasks(journal) {\n const store = storeFor(journal.workspace || 'default')\n const mainTask = journal.taskId ? store.find('task', journal.taskId) : null\n if (!mainTask || !mainTask.subtaskIds) return []\n return mainTask.subtaskIds.map((id) => store.find('task', id)).filter(Boolean)\n}\n\n/** 独立的分配操作(teamflow_assign 工具的后端):只写 assign 字段,不碰 status。 */\nexport function assignTask(product: string | null | undefined, kind: string, id: string, role: string, assignee: string) {\n const store = storeFor(product)\n const item = store.find(kind, id)\n if (!item) return { ok: false, error: `找不到 ${kind} #${id}` }\n if (kind === 'task') {\n if (role === 'dev') item.devAssign = assignee\n else if (role === 'qa') item.qaAssign = assignee\n else if (role === 'accept') item.acceptBy = assignee\n else return { ok: false, error: `未知角色 ${role}(支持 dev/qa/accept)` }\n } else {\n item.owner = assignee\n }\n item.updatedAt = Date.now()\n store.persist()\n return { ok: true, item: { id: item.id, devAssign: item.devAssign || null, qaAssign: item.qaAssign || null, acceptBy: item.acceptBy || null, owner: item.owner || null } }\n}\n\n/**\n * QA 复验循环的缺陷登记(幂等):把本次 QA 报告解析出的缺陷登记/更新到要求下的 bug 列表。\n * - 按「reqId + defect.id」幂等:已登记过的同一缺陷(rework 多轮复现)不重复建卡,只刷新状态。\n * - severity 缺失/未知的缺陷行不建卡(防御性:只认明确 P0-P3 的缺陷)。\n * @returns 本次新增的 bug 记录(仅本轮新创建,不含续跑命中已存在者)\n */\nexport function syncQaDefects(journal, defects) {\n const store = storeFor(journal.workspace || 'default')\n const req = journal.reqId ? store.find('req', journal.reqId) : null\n const created = []\n for (const d of defects || []) {\n const id = String(d && d.id || '').trim()\n if (!id || !/^P[0-3]$/.test(String(d && d.severity || ''))) continue\n const exist = store.bugs.find((b) => b.reqId === journal.reqId && b.defectId === id)\n if (exist) {\n // 幂等:只刷新严重级与状态(若复验仍出现 → 保持 open/reopened 信号)\n exist.severity = String(d.severity)\n exist.module = String(d.module || '')\n exist.updatedAt = Date.now()\n } else {\n const bug = {\n id: store.nextId('bug'), defectId: id, reqId: journal.reqId, taskId: journal.taskId || null,\n severity: String(d.severity), module: String(d.module || ''), title: `QA 缺陷:${id}`,\n reproduce: '', expected: '', actual: '', ac: '', status: 'open', owner: null,\n retries: 0, humanIntervention: false, createdAt: Date.now(), updatedAt: Date.now(), events: [],\n }\n store.bugs.push(bug)\n if (req) { req.bugIds = req.bugIds || []; if (!req.bugIds.includes(bug.id)) { req.bugIds.push(bug.id); req.updatedAt = Date.now() } }\n created.push(bug)\n }\n }\n store.persist()\n persistJournal(journal)\n return created\n}\n\n/** 把某需求下全部 open 的阻断缺陷(P0/P1/P2)标记为已验证关闭(QA 复验通过或验收通过后调用;P3 观察项保留 open 待登记,不误关)。 */\nexport function verifyReqBugs(journal) {\n const store = storeFor(journal.workspace || 'default')\n let touched = false\n for (const b of store.bugs) {\n if (b.reqId === journal.reqId && b.status === 'open' && b.severity !== 'P3') {\n b.status = 'verified'\n b.updatedAt = Date.now()\n touched = true\n }\n }\n if (touched) store.persist()\n}\n","/**\n * dsh-plugin-teamflow core — 团队注册表(多团队配置管理)。\n * 每个 workspace 一份 teams.json,定义可用团队及其流水线配置。\n * TeamRegistry 负责加载/解析/提供团队配置。\n */\nimport { join, dirname } from 'node:path'\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs'\nimport { teamflowRoot } from '../../store.ts'\n\n/** 团队阶段定义。 */\nexport interface TeamStage {\n key: string\n label: string\n role: string\n optional?: boolean\n promptKey?: string\n}\n\n/** 团队配置。 */\nexport interface TeamConfig {\n id: string\n name: string\n icon: string\n description: string\n stages: TeamStage[]\n mode?: string\n needDesign?: boolean\n needScaffold?: boolean\n}\n\n/** 团队配置文件的顶层结构。 */\ninterface TeamsFile {\n version: number\n teams: TeamConfig[]\n}\n\n/** 内置默认团队:软件开发(当前完整流水线)。 */\nconst BUILTIN_DEV_TEAM: TeamConfig = {\n id: 'dev',\n name: '软件开发',\n icon: '💻',\n description: 'PRD→设计→技术→开发→QA→验收',\n stages: [\n { key: 'prd', label: 'PRD 产品需求', role: '产品经理', promptKey: 'prd' },\n { key: 'design', label: 'UI/UX 设计', role: 'UI/UX 设计师', optional: true, promptKey: 'design' },\n { key: 'scaffold', label: '架构规划', role: '架构师', optional: true, promptKey: 'scaffold' },\n { key: 'tech', label: '技术方案', role: '高级全栈工程师', promptKey: 'tech' },\n { key: 'dev', label: '开发', role: '高级全栈工程师', promptKey: 'dev' },\n { key: 'qa', label: 'QA 测试', role: 'QA 测试工程师', promptKey: 'qa' },\n { key: 'acceptance', label: '产品验收', role: '产品经理', promptKey: 'acceptance' },\n ],\n mode: 'auto',\n}\n\n/** 默认团队配置文件内容。 */\nconst DEFAULT_TEAMS_FILE: TeamsFile = {\n version: 1,\n teams: [BUILTIN_DEV_TEAM],\n}\n\n/** 获取团队配置文件路径。 */\nfunction teamsFile(projectKey: string): string {\n return join(teamflowRoot(), projectKey, 'teams.json')\n}\n\n/** 加载团队配置。不存在时创建默认。 */\nexport function loadTeams(projectKey: string): TeamConfig[] {\n const file = teamsFile(projectKey)\n try {\n if (existsSync(file)) {\n const raw = JSON.parse(readFileSync(file, 'utf8')) as TeamsFile\n if (raw && Array.isArray(raw.teams)) return raw.teams\n }\n } catch (e) { /* 解析失败走默认 */ }\n // 创建默认配置\n saveTeams(projectKey, DEFAULT_TEAMS_FILE.teams)\n return DEFAULT_TEAMS_FILE.teams\n}\n\n/** 保存团队配置。 */\nexport function saveTeams(projectKey: string, teams: TeamConfig[]): void {\n const file = teamsFile(projectKey)\n try {\n mkdirSync(dirname(file), { recursive: true })\n writeFileSync(file, JSON.stringify({ version: 1, teams }, null, 2), 'utf8')\n } catch (e) { /* 写入失败静默 */ }\n}\n\n/** 从团队列表中查找指定 id 的团队。 */\nexport function findTeam(teams: TeamConfig[], teamId: string): TeamConfig | undefined {\n return teams.find((t) => t.id === teamId)\n}\n\n/** 获取团队的可运行阶段(过滤掉 optional 且未启用的)。 */\nexport function getActiveStages(team: TeamConfig, options?: { needDesign?: boolean; needScaffold?: boolean }): TeamStage[] {\n return team.stages.filter((s) => {\n if (!s.optional) return true\n if (s.key === 'design') return !!options?.needDesign\n if (s.key === 'scaffold') return !!options?.needScaffold\n return false\n })\n}\n\n/** 导出内置团队定义(供 UI 和描述符使用)。 */\nexport { BUILTIN_DEV_TEAM }\n","/**\n * dsh-plugin-teamflow core — token 计量(官方口径)。\n * 依赖:types.ts、context.ts(runtime.tokenMeter)。\n *\n * 口径与模型 provider 账单一致(模型无关):\n * - input : 输入(缓存未命中)\n * - cacheRead : 输入(缓存命中)\n * - cacheWrite : 输入写入缓存\n * - output : 输出\n * billed input = input + cacheRead + cacheWrite。\n * 缓存命中率 = cacheRead / (input + cacheRead)。\n */\nimport type { SubagentRunLike, UsageBuckets } from '../types.ts'\n\n/**\n * 累计子代理会话中所有 LLM 调用的真实 usage(官方三桶 + 调用数)。\n * 返回 null 表示拿不到 usage(会话未暴露 events / 无数据)。\n */\nexport function accumulateSessionUsage(run: SubagentRunLike | null | undefined): UsageBuckets | null {\n const local = run && run.localAgent\n const session = (local && local.session) as { events?: unknown } | null | undefined\n if (!session) return null\n const rawEvents = session.events\n const events = Array.isArray(rawEvents) ? (rawEvents as unknown[]) : (typeof rawEvents === 'function' ? (rawEvents as () => unknown[] | null)() : null)\n if (!Array.isArray(events)) return null\n const buckets: UsageBuckets = { input: 0, cacheRead: 0, cacheWrite: 0, output: 0, calls: 0 }\n const seen = new Set<string>()\n for (const ev of events) {\n const e = ev as { type?: string; data?: { turn?: number; step?: number; usage?: { inputTokens?: number; cacheReadTokens?: number; cacheWriteTokens?: number; outputTokens?: number } } } | null\n if (!e || e.type !== 'assistant/message') continue\n const d = e.data || {}\n if (typeof d.turn === 'number' && typeof d.step === 'number') seen.add(`${d.turn}.${d.step}`)\n const u = d.usage\n if (u) {\n buckets.input += u.inputTokens || 0\n buckets.cacheRead += u.cacheReadTokens || 0\n buckets.cacheWrite += u.cacheWriteTokens || 0\n buckets.output += u.outputTokens || 0\n }\n }\n if (buckets.input + buckets.cacheRead + buckets.cacheWrite + buckets.output <= 0) return null\n buckets.calls = seen.size || 1\n return buckets\n}\n\n/** 官方口径总消耗(billed input + output,含 cacheRead/cacheWrite)。 */\nexport function totalTokensOf(usage: UsageBuckets | null | undefined): number {\n if (!usage) return 0\n return (usage.input || 0) + (usage.cacheRead || 0) + (usage.cacheWrite || 0) + (usage.output || 0)\n}\n","/**\n * dsh-plugin-teamflow core — 子代理单调用护栏 v2(进行中退化检测,纯进度信号)。\n * 依赖:constants + types。\n *\n * 背景(实锤):① QA 子代理推理复读死循环 38 分钟烧 481 万 token 零产出;\n * ② v1 护栏的裸墙钟(25min)误杀了合法长任务——medium 档 UI 重构 dev 以 10.6 次工具调用/分钟\n * 的健康节奏工作到第 25 分钟被击落(tf-mt8fbavd dev 尝试一)。\n *\n * 设计原则:【只看进度信号,无任何时间配额】慢吞吐的合法任务永远不该被打断:\n * A. 复读检测:滑动窗口内同一规范化流式片段出现 ≥ GUARD_REPEAT_LIMIT 次(逐字复读 = 真退化)\n * → outcome='degenerated'(豁免预算门,允许一次干净重试)。\n * B. 挂死检测:连续 GUARD_SILENCE_MS 一个新事件都没有(provider 层挂起/连接静默死亡)\n * → outcome='stalled'(走正常预算门 → 熔断转人工,不自动重试烧钱)。\n * C. 空转检测:会话仍在产出事件,但连续 GUARD_NO_TOOL_MS 没有任何工具调用\n * (纯推理打转/改写式循环;正常 agent 每分钟都在调工具)→ outcome='stalled'。\n *\n * 中止方式:run.dispose() → run.result 结算。outcome 命名刻意避开 isUnretryable 的\n * /token|context|limit/ 正则;只有 'degenerated' 享受干净重试豁免(runner.withRetry)。\n */\nimport { GUARD_NO_TOOL_MS, GUARD_POLL_MS, GUARD_REPEAT_LIMIT, GUARD_SILENCE_MS, GUARD_WINDOW_SIZE } from '../constants.ts'\nimport type { Journal, SubagentRunLike } from '../types.ts'\nimport type { JournalStage } from '../../store.ts'\n\n/** 与 metering 同款事件访问器(session.events 可能是数组或返回数组的函数)。 */\nfunction eventsOf(run: { localAgent?: { session?: unknown } } | null | undefined): unknown[] {\n const local = run && (run as { localAgent?: { session?: unknown } }).localAgent\n const session = (local && local.session) as { events?: unknown } | null | undefined\n if (!session) return []\n const raw = session.events\n const events = Array.isArray(raw) ? raw : typeof raw === 'function' ? (raw as () => unknown[] | null)() : null\n return Array.isArray(events) ? events : []\n}\n\n/** 规范化文本片段:小写 + 仅保留字母数字/CJK,供逐字重复比对。 */\nfunction normalizeFragment(s: string): string {\n return String(s || '').toLowerCase().replace(/[^a-z0-9\\u4e00-\\u9fa5]+/g, '')\n}\n\nexport interface StageGuardTarget {\n run: SubagentRunLike\n journal: Journal\n label: string\n stage: JournalStage\n}\n\n/**\n * 启动单调用护栏轮询,返回取消函数(runAgent finally 必须调用)。\n * 触发时:stage.guardReason/guardOutcome 记录原因 + journal 落日志 + dispose 中止本次尝试。\n */\nexport function startStageGuard(opts: StageGuardTarget): () => void {\n const { run, journal, label, stage } = opts\n let fired = false\n // B/C 用计数而非时间戳判断(规避事件对象时间格式差异)\n let lastEventCount = -1\n let lastGrowthAt = Date.now()\n let lastToolSignalAt = Date.now()\n let seenToolCall = false\n const window: string[] = []\n // token 观测(ADR 复盘 2026-08-25):只记 warning 不中止——重复读 / 验证脚本循环\n let processed = 0\n const readCounts = new Map<string, number>()\n const warnedReads = new Set<string>()\n const scriptCounts = new Map<string, number>()\n const warnedScripts = new Set<string>()\n\n function warnOnce(key: string, set: Set<string>, message: string) {\n if (set.has(key)) return\n set.add(key)\n try { journal.logs.push({ t: Date.now(), level: 'warn', message: `${label} [token 观测] ${message}` }) } catch (e) { /* ignore */ }\n }\n\n function fire(reason: string, outcome: 'degenerated' | 'stalled') {\n if (fired) return\n fired = true\n clearInterval(timer)\n stage.guardReason = reason\n stage.guardOutcome = outcome\n try {\n journal.logs.push({ t: Date.now(), level: 'error', message: `${label} 触发进行中护栏并中止本次尝试(${outcome}):${reason}` })\n } catch (e) { /* ignore */ }\n try { void Promise.resolve(run.dispose()).catch(() => {}) } catch (e) { /* ignore */ }\n }\n\n const timer = setInterval(() => {\n if (fired || journal.cancelled) return\n try {\n const events = eventsOf(run)\n\n // A. 复读检测:收集流式文本片段,滑窗内逐字重复即判真退化\n for (const ev of events.slice(-400)) {\n const e = ev as { type?: string; data?: { texts?: unknown }; texts?: unknown } | null\n if (!e || (e.type !== 'text-chunks' && e.type !== 'reasoning-chunks')) continue\n const arr = (e.data && e.data.texts) || e.texts\n if (!Array.isArray(arr)) continue\n for (const t of arr) {\n const s = normalizeFragment(String(t))\n if (s.length < 12) continue\n window.push(s)\n }\n // 文本在流出 → 会话仍活着\n lastGrowthAt = Date.now()\n }\n if (window.length > GUARD_WINDOW_SIZE) window.splice(0, window.length - GUARD_WINDOW_SIZE)\n const counts = new Map<string, number>()\n for (const w of window) counts.set(w, (counts.get(w) || 0) + 1)\n for (const [, n] of counts) {\n if (n >= GUARD_REPEAT_LIMIT) {\n fire(`推理复读(同一片段在近 ${window.length} 条流式片段中出现 ${n} 次)`, 'degenerated')\n return\n }\n }\n\n // 工具活动信号\n for (const ev of events.slice(-200)) {\n const e = ev as { type?: string } | null\n if (e && (e.type === 'tool-call-chunks' || e.type === 'tool/call')) { seenToolCall = true; lastToolSignalAt = Date.now(); break }\n }\n\n // token 观测(只记 warning):增量处理新完成的工具调用\n if (events.length > processed) {\n observeToolCalls(events.slice(processed))\n processed = events.length\n }\n\n // B. 挂死检测:事件数完全不增长超过 GUARD_SILENCE_MS(provider 挂起/静默死亡)\n if (events.length !== lastEventCount) {\n lastEventCount = events.length\n lastGrowthAt = Date.now()\n } else if (Date.now() - lastGrowthAt > GUARD_SILENCE_MS) {\n fire(`挂死(${Math.round(GUARD_SILENCE_MS / 60000)} 分钟无任何新事件)`, 'stalled')\n return\n }\n\n // C. 空转检测:事件仍在增长但长期没有工具调用(正常 agent 每分钟都在调工具;\n // 纯推理打转/改写式循环只会持续吐文本)。要求已见过至少一次工具调用,\n // 排除「启动阶段长推理」的误伤。\n if (seenToolCall && Date.now() - lastToolSignalAt > GUARD_NO_TOOL_MS) {\n fire(`空转(${Math.round(GUARD_NO_TOOL_MS / 60000)} 分钟内无任何工具调用,但会话仍在产出)`, 'stalled')\n return\n }\n } catch (e) { /* 护栏自身异常不影响流水线 */ }\n }, GUARD_POLL_MS)\n\n /** token 观测:增量处理已完成工具调用(tool/call 事件带完整参数)。 */\n function observeToolCalls(events: unknown[]) {\n for (const ev of events) {\n const e = ev as { type?: string; data?: { name?: string; arguments?: string } } | null\n if (!e || (e.type !== 'tool/call' && e.type !== 'tool-call')) continue\n const d = (e as { data?: { name?: string; arguments?: string } }).data || (e as unknown as { name?: string; arguments?: string })\n const name = d && d.name\n const args = (d && d.arguments) || ''\n if (name === 'read') {\n const m = String(args).match(/\"file_path\"\\s*:\\s*\"([^\"]+)\"/)\n if (!m) continue\n const key = m[1].replace(/\\\\\\\\/g, '\\\\').toLowerCase()\n const n = (readCounts.get(key) || 0) + 1\n readCounts.set(key, n)\n if (n === 3) warnOnce(key, warnedReads, `同一文件重复 read ${n} 次:${m[1].split(/[\\\\\\\\/]/).pop()}(TOKEN_HYGIENE 上限 1 次,多余读取在为后续每一步付 cache 重放费)`)\n } else if (/bash|pwsh|shell|powershell/i.test(name || '')) {\n const sm = String(args).match(/(verify-[a-z0-9-]+\\.cjs|assembly-check\\.cjs|qa-e2e-jsdom\\.cjs)/)\n if (!sm) continue\n const key = sm[1]\n const n = (scriptCounts.get(key) || 0) + 1\n scriptCounts.set(key, n)\n if (n === 3) warnOnce(key, warnedScripts, `验证脚本重复执行 ${n} 次:${key}(批量修复纪律:一次修完所有失败再跑,≤3 轮)`)\n }\n }\n }\n\n return () => { fired = true; clearInterval(timer) }\n}\n","/**\n * dsh-plugin-teamflow core — 子代理执行器(并发池 / 单阶段运行 / 重试与熔断)。\n * 依赖:util/constants/types + core(context/metering)。\n */\nimport { runtime, inFlight, providerName } from './context.ts'\nimport { accumulateSessionUsage, totalTokensOf } from './metering.ts'\nimport { startStageGuard } from './guard.ts'\nimport { clip, extractText, normalizeSignal, hasSubstance, isUnretryable, handoffBrief } from '../util.ts'\nimport { RETRY_LIMIT, STAGE_TOKEN_BUDGET } from '../constants.ts'\nimport type { Journal, ParentAgentLike } from '../types.ts'\nimport type { JournalStage } from '../../store.ts'\n\n/** 并发池:按 max 个 worker 消费 items,返回同序结果。 */\nexport async function runPool(items, max, fn) {\n const results = new Array(items.length)\n let cursor = 0\n const workers = Array.from({ length: Math.min(Math.max(1, max), items.length) }, async () => {\n while (cursor < items.length) {\n const i = cursor++\n results[i] = await fn(items[i], i)\n }\n })\n await Promise.all(workers)\n return results\n}\n\n/**\n * 解析父 agent 当前生效的模型路由(provider/model)。\n *\n * 背景:子代理默认继承 `parent.options`(创建时快照),主线程在 UI 切换模型后\n * `parent.options` 不会更新,导致子代理仍打旧 provider(如已停的代理端口)。\n *\n * 三级回退,取「当前生效」而非「创建快照」:\n * 1. parent.session.requestHeader()?.config —— 主线程最近一次请求实际生效的路由(含切换后)\n * 2. runtime.agentDefaultModel?.currentSelection() —— 全局默认模型当前选择(切换即更新,可选注入)\n * 3. parent.options —— 创建快照(兜底)\n */\nfunction resolveChildRoute(parent: ParentAgentLike): { provider?: string; model?: string; maxTokens?: number } {\n const out: { provider?: string; model?: string; maxTokens?: number } = {}\n try {\n // 1. 最近生效路由(request header config)\n const session = (parent as { session?: { requestHeader?: () => { config?: { provider?: string; model?: string; maxTokens?: number } } | undefined } }).session\n const header = session && typeof session.requestHeader === 'function' ? session.requestHeader() : undefined\n const cfg = header && header.config\n if (cfg && typeof cfg.provider === 'string' && cfg.provider) {\n out.provider = cfg.provider\n if (typeof cfg.model === 'string' && cfg.model) out.model = cfg.model\n if (typeof cfg.maxTokens === 'number') out.maxTokens = cfg.maxTokens\n }\n } catch (e) { /* 回退下一级 */ }\n if (!out.provider) {\n // 2. 全局默认模型当前选择(切换即更新)\n const defaultModel = runtime.agentDefaultModel as { currentSelection?: () => { provider?: string; model?: string; maxTokens?: number } } | undefined\n if (defaultModel && typeof defaultModel.currentSelection === 'function') {\n try {\n const sel = defaultModel.currentSelection()\n if (sel && typeof sel.provider === 'string' && sel.provider) {\n out.provider = sel.provider\n if (typeof sel.model === 'string' && sel.model) out.model = sel.model\n if (typeof sel.maxTokens === 'number') out.maxTokens = sel.maxTokens\n }\n } catch (e) { /* 回退下一级 */ }\n }\n }\n if (!out.provider) {\n // 3. 创建快照兜底\n const po = (parent as { options?: { provider?: string; model?: string; maxTokens?: number } }).options\n if (po && typeof po.provider === 'string' && po.provider) {\n out.provider = po.provider\n if (typeof po.model === 'string' && po.model) out.model = po.model\n if (typeof po.maxTokens === 'number') out.maxTokens = po.maxTokens\n }\n }\n return out\n}\n\n/** 运行单个阶段子代理:执行 + 产出实质校验 + token 双口径计量 + stage 状态流转。 */\nexport async function runAgent(\n journal: Journal, parent: ParentAgentLike, label: string, phase: string, prompt: string, signal: unknown,\n): Promise<string | null> {\n const maxSeq = journal.stages.length ? Math.max(...journal.stages.map((s) => s.seq)) : 0\n let stageText = null\n const stage: JournalStage = {\n seq: maxSeq + 1, label, phase, status: 'running', outcome: null,\n childId: null, startedAt: Date.now(), endedAt: null, summary: null,\n usage: null, handoff: null, output: null,\n }\n journal.stages.push(stage)\n journal.agentsStarted += 1\n let run = null\n let cancelGuard: (() => void) | null = null\n try {\n // 显式传当前生效路由,避免继承过期的 parent.options 快照(主线程已切换代理的情况)\n const route = resolveChildRoute(parent)\n const agentOptions = (route.provider || route.model) ? {\n ...(route.provider ? { provider: route.provider } : {}),\n ...(route.model ? { model: route.model } : {}),\n ...(route.maxTokens ? { maxTokens: route.maxTokens } : {}),\n } : undefined\n run = await runtime.subagents.start(providerName(), {\n label,\n prompt: [{ type: 'text', text: prompt }],\n parent,\n ...(agentOptions ? { agentOptions } : {}),\n signal: normalizeSignal(signal),\n })\n stage.childId = run.id\n inFlight.set(journal.id, { run, stage })\n try {\n if (parent && parent.session && typeof parent.session.append === 'function') {\n parent.session.append('tool-workflow/agent-start', {\n runId: journal.id, seq: stage.seq, label, phase, childId: run.id,\n })\n }\n } catch (e) { /* 轨迹写入失败不影响主流程 */ }\n // 单调用护栏:进行中退化检测(推理复读/墙钟超限 → dispose 中止,outcome=degenerated 走干净重试)\n cancelGuard = startStageGuard({ run, journal, label, stage })\n const result = await run.result\n const stop = result && result.stopReason\n const text = extractText(result && result.output)\n stageText = text\n if (journal.cancelled) {\n stage.status = 'cancelled'; stage.outcome = 'cancelled'\n return null\n }\n if (stop === 'completed' && text && hasSubstance(phase, text)) {\n stage.status = 'done'; stage.outcome = 'completed'\n stage.output = clip(text, 50000) // 阶段产物全文(断点续跑重建上下文)\n return text\n }\n if (stage.guardReason) {\n // 护栏中止优先于通用失败分类(成功产出已在上方抢救);\n // 复读=degenerated(可干净重试),挂死/空转=stalled(走预算门转人工)\n stage.status = 'failed'\n stage.outcome = stage.guardOutcome || 'degenerated'\n stage.summary = `进行中护栏中止(${stage.guardReason}),本次尝试无有效产出`\n journal.logs.push({ t: Date.now(), level: 'warn', message: `${label} ${stage.summary}` })\n return null\n }\n stage.status = 'failed'\n stage.outcome = (stop === 'completed' && text) ? 'insubstantial' : (stop || 'error')\n if (stage.outcome === 'insubstantial') {\n stage.summary = '产出未通过实质校验(含拒绝措辞或内容过短),视为未交付'\n journal.logs.push({ t: Date.now(), level: 'warn', message: `${label} 产出未通过实质校验(拒绝措辞/内容过短)` })\n } else {\n stage.summary = `未产出有效结果(stopReason=${stop || 'unknown'})`\n journal.logs.push({ t: Date.now(), level: 'error', message: `${label} 未产出有效结果(stopReason=${stop || 'unknown'})` })\n }\n return null\n } catch (e) {\n stage.status = journal.cancelled ? 'cancelled' : 'failed'\n if (!journal.cancelled && stage.guardReason) {\n stage.outcome = stage.guardOutcome || 'degenerated'\n stage.summary = `进行中护栏中止(${stage.guardReason}):${String((e && e.message) || e)}`\n } else {\n stage.outcome = journal.cancelled ? 'cancelled' : 'error'\n stage.summary = `启动/执行失败:${String((e && e.message) || e)}`\n }\n journal.logs.push({ t: Date.now(), level: 'error', message: `${label} ${stage.summary}` })\n return null\n } finally {\n if (cancelGuard) cancelGuard()\n stage.usage = accumulateSessionUsage(run)\n stage.handoff = stageText ? handoffBrief(stageText) : null\n stage.endedAt = Date.now()\n if (inFlight.get(journal.id) && inFlight.get(journal.id).stage === stage) inFlight.delete(journal.id)\n if (run) { try { await run.dispose() } catch (e2) { /* ignore */ } }\n }\n}\n\n/** 单阶段重试 + token 熔断(官方口径:input+cacheRead+cacheWrite+output 累计)。 */\nexport async function withRetry(\n journal: Journal, parent: unknown, label: string, phase: string, prompt: string, signal: unknown,\n): Promise<{ text: string | null; attempts: number; stageTokens: number }> {\n let attempts = 0\n let stageTokens = 0\n for (let attempt = 1; attempt <= RETRY_LIMIT; attempt++) {\n attempts = attempt\n const labelNow = attempt > 1 ? `${label}(第 ${attempt} 次重试)` : label\n const result = await runAgent(journal, parent, labelNow, phase, prompt, signal)\n // 累计本阶段各次尝试的总消耗(官方口径:input+cacheRead+cacheWrite+output)\n const lastStage = journal.stages[journal.stages.length - 1]\n if (lastStage && lastStage.phase === phase) {\n stageTokens += totalTokensOf(lastStage.usage)\n }\n if (result) return { text: result, attempts, stageTokens }\n if (journal.cancelled) return { text: null, attempts, stageTokens }\n // 不可重试失败(上下文耗尽等):重试同一 prompt 大概率复现 → 直接需人工\n if (lastStage && isUnretryable(lastStage.outcome, lastStage.outcome)) {\n journal.logs.push({ t: Date.now(), level: 'error', message: `${label} 失败原因不可重试(${lastStage.outcome}),跳过重试,需人工介入` })\n journal.humanIntervention = true\n return { text: null, attempts, stageTokens }\n }\n // 护栏中止(degenerated)= 主动止损而非失控烧钱:豁免预算门,允许一次干净重试\n // (实证 tf-mt5afdch:死循环尝试 481 万 token 零产出,续跑干净重试仅 ~100 万即全量通过)\n const guardedRetry = !!(lastStage && lastStage.outcome === 'degenerated')\n // token 熔断:本阶段累计总消耗超预算 → 停止重试\n if (!guardedRetry && stageTokens >= STAGE_TOKEN_BUDGET) {\n journal.logs.push({ t: Date.now(), level: 'error', message: `${label} 累计 token ${Math.round(stageTokens / 1000)}k 超出阶段预算 ${Math.round(STAGE_TOKEN_BUDGET / 1000)}k,熔断,需人工介入` })\n journal.humanIntervention = true\n return { text: null, attempts, stageTokens }\n }\n if (attempt < RETRY_LIMIT) {\n journal.logs.push({ t: Date.now(), level: 'warn', message: `${label} 第 ${attempt} 次尝试未成功,自动重试…` })\n } else {\n journal.logs.push({ t: Date.now(), level: 'error', message: `${label} 连续 ${RETRY_LIMIT} 次尝试失败,超出重试阈值,需人工介入` })\n journal.humanIntervention = true\n }\n }\n return { text: null, attempts, stageTokens }\n}\n","/**\n * dsh-plugin-teamflow core — state.json 预编译上下文索引。\n *\n * 目标:解决「每个新 run 都要从小代理全量读历史文档(PRD/TECH/QA)来重建认知」的 token 爆炸。\n * state.json 是跨 run 累积的结构化索引:每次 run 结束后由各阶段把「精简结论」沉淀进来,\n * 下一个 run 的子代理只读注入的 state slice,不再重复读全套历史文档。\n *\n * 设计原则:\n * - memory.md 保持权威记忆(人读);state.json 是预编译索引(机器喂给子代理)。\n * - 子代理不直接读 state.json 文件,由 host 在开工时按角色注入相关 slice 到 prompt。\n * - state.json 只存「结论/指针」,不存全文;具体内容仍指向 docs/teamflow/ 下的活文档。\n */\nimport { join } from 'node:path'\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs'\nimport { teamflowRoot } from '../../store.ts'\nimport type { RoleKey } from '../constants.ts'\n\n/** 各阶段会额外输出一段 `<!-- state -->...<!-- /state -->` 的结构化 JSON,host 提取后合并进 state.json。 */\nexport interface StageStateBlock {\n /** phase key:prd/design/scaffold/tech/dev/qa/acceptance */\n phase?: string\n /** 本阶段结论摘要(≤500 字,给下一 run 复用的精炼信息) */\n summary?: string\n /** 本次迭代新增/变更的模块(文件路径) */\n touched?: string[]\n /** 本次验收结论(acceptance 阶段) */\n verdict?: string\n /** 需同步的记忆要点 */\n memory?: string[]\n /** free-form 结构:可放模块契约、AC 索引等供后续 slice */\n extra?: Record<string, unknown>\n}\n\n/** state.json 的顶层形状。 */\nexport interface TeamflowState {\n version: number\n /** workspace 项目名(不做唯一键,仅展示) */\n projectName?: string | null\n updatedAt: number | null\n /** 产品级结论索引 */\n product: {\n summary?: string | null\n techStack?: string | null\n }\n /** ADR-0008:最近一次任务夹(docs/teamflow/<folder>),替代旧「当前版本」概念。 */\n lastRunFolder?: string | null\n /** 模块 → 契约/一句话(tech/dev 阶段沉淀) */\n modules: Record<string, string>\n /** 验证脚本清单(tech/qa 沉淀) */\n verifyScripts: string[]\n /** AC 索引:AC 编号 → 一句话(prd 阶段沉淀) */\n acIndex: Record<string, string>\n /** 各阶段的最新结论(key: phase) */\n stages: Record<string, string>\n /** 最近流水线结论 */\n lastRun: {\n runId?: string | null\n requirement?: string | null\n folder?: string | null\n verdict?: string | null\n endedAt?: number | null\n } | null\n /** 本次 run 的运行时注入上下文(不持久化;M0 状态核对 + M1 架构蓝图 + 任务夹路径)。 */\n __runCtx?: {\n sanity?: string\n blueprint?: string\n runDocs?: string\n } | null\n}\n\n/** 空态 state。 */\nfunction emptyState(): TeamflowState {\n return {\n version: 1,\n projectName: null,\n updatedAt: null,\n product: { summary: null, techStack: null },\n lastRunFolder: null,\n modules: {},\n verifyScripts: [],\n acIndex: {},\n stages: {},\n lastRun: null,\n }\n}\n\n/** state.json 路径:$DSH_HOME/teamflow/<projectKey>/state.json */\nexport function stateFile(projectKey: string): string {\n return join(teamflowRoot(), projectKey, 'state.json')\n}\n\n/** 读取(不存在返回空态)。 */\nexport function loadState(projectKey: string): TeamflowState {\n const file = stateFile(projectKey)\n try {\n if (existsSync(file)) {\n const raw = JSON.parse(readFileSync(file, 'utf8')) as Partial<TeamflowState>\n const base = emptyState()\n if (raw && typeof raw === 'object') {\n base.projectName = raw.projectName ?? null\n base.updatedAt = raw.updatedAt ?? null\n base.product = { ...base.product, ...(raw.product || {}) }\n base.lastRunFolder = raw.lastRunFolder ?? null\n base.modules = raw.modules || {}\n base.verifyScripts = Array.isArray(raw.verifyScripts) ? raw.verifyScripts : []\n base.acIndex = raw.acIndex || {}\n base.stages = raw.stages || {}\n base.lastRun = raw.lastRun ?? null\n return base\n }\n }\n } catch (e) { /* 损坏回空态 */ }\n return emptyState()\n}\n\n/** 保存。 */\nexport function saveState(projectKey: string, state: TeamflowState): boolean {\n const file = stateFile(projectKey)\n try {\n mkdirSync(join(teamflowRoot(), projectKey), { recursive: true })\n state.updatedAt = Date.now()\n writeFileSync(file, JSON.stringify(state, null, 2), 'utf8')\n return true\n } catch (e) {\n console.error('[teamflow] saveState failed', e?.message)\n return false\n }\n}\n\n/** 从阶段产出文本中提取 `<!-- state -->{...}<!-- /state -->` 块(找不到返回 null)。 */\nexport function extractStateBlock(text: unknown): StageStateBlock | null {\n const s = text === null || text === undefined ? '' : String(text)\n const m = s.match(/<!--\\s*state\\s*-->([\\s\\S]*?)(?:<!--\\s*\\/state\\s*-->|$)/)\n if (!m || !m[1]) return null\n try {\n const raw = JSON.parse(m[1].trim())\n if (raw && typeof raw === 'object') return raw as StageStateBlock\n } catch (e) { /* 非 JSON 忽略 */ }\n return null\n}\n\n/** 把阶段产出的 state 块合并进 state.json。 */\nexport function mergeStateBlock(projectKey: string, block: StageStateBlock, phase?: string): TeamflowState {\n const state = loadState(projectKey)\n const key = (block && block.phase) || phase || 'other'\n if (block) {\n if (typeof block.summary === 'string' && block.summary.trim()) state.stages[key] = block.summary.trim()\n if (Array.isArray(block.touched)) {\n for (const f of block.touched) {\n if (typeof f === 'string' && f) state.modules[f] = state.modules[f] || 'touched'\n }\n }\n if (typeof block.verdict === 'string' && block.verdict) {\n state.lastRun = state.lastRun || {}\n state.lastRun.verdict = block.verdict\n }\n if (block.extra && typeof block.extra === 'object') {\n if (Array.isArray(block.extra.verifyScripts)) {\n for (const s of block.extra.verifyScripts) if (typeof s === 'string' && s && state.verifyScripts.indexOf(s) === -1) state.verifyScripts.push(s)\n }\n if (block.extra.acIndex && typeof block.extra.acIndex === 'object') state.acIndex = { ...state.acIndex, ...block.extra.acIndex }\n if (typeof block.extra.techStack === 'string' && block.extra.techStack) state.product.techStack = block.extra.techStack\n if (typeof block.extra.moduleContracts === 'object' && block.extra.moduleContracts) state.modules = { ...state.modules, ...block.extra.moduleContracts }\n }\n }\n saveState(projectKey, state)\n return state\n}\n\n/** 按 run 更新 lastRun / lastRunFolder(finally 时调用)。 */\nexport function noteRun(projectKey: string, run: { id?: string; requirement?: string; verdict?: string; endedAt?: number; runDocs?: string | null }): void {\n const state = loadState(projectKey)\n if (run.runDocs) state.lastRunFolder = run.runDocs\n state.lastRun = {\n runId: run.id || null,\n requirement: run.requirement ? String(run.requirement).slice(0, 200) : null,\n verdict: run.verdict || null,\n folder: run.runDocs || null,\n endedAt: run.endedAt ?? Date.now(),\n }\n saveState(projectKey, state)\n}\n\n/** 按角色渲染 state slice(注入到子代理 prompt)。角色 → 只拿相关片段。 */\nexport function stateSliceFor(state: TeamflowState, role: RoleKey): string {\n const lines: string[] = []\n // 本次 run 注入上下文(任务夹路径 + M0 状态核对 + M1 架构蓝图):所有角色都先看到\n if (state.__runCtx) {\n if (state.__runCtx.runDocs) lines.push(`【本次任务产物夹】${state.__runCtx.runDocs}/(host 已创建;本需求的 PRD/TECHNICAL/QA-REPORT/ACCEPTANCE 全部写这里,夹建后不可变、不归档不升版)`)\n if (state.__runCtx.sanity) lines.push(state.__runCtx.sanity)\n if (state.__runCtx.blueprint && (role === 'arch' || role === 'tech' || role === 'dev')) lines.push(state.__runCtx.blueprint)\n }\n lines.push('【预编译产品状态(state.json · 权威记忆在 docs/teamflow/memory.md,本块已是够用的索引,勿再全量读历史文档)】')\n if (state.product.summary) lines.push(`- 产品概要:${state.product.summary}`)\n if (state.product.techStack && (role === 'tech' || role === 'dev' || role === 'arch')) lines.push(`- 技术栈:${state.product.techStack}`)\n if (Object.keys(state.acIndex).length && (role === 'pm' || role === 'qa' || role === 'acceptance' || role === 'tech')) {\n const acs = Object.entries(state.acIndex).slice(0, 40)\n lines.push(`- AC 索引(${acs.length} 条):${acs.map(([k, v]) => `${k} ${v}`).join(';')}`)\n }\n if (Object.keys(state.modules).length && (role === 'tech' || role === 'dev' || role === 'arch' || role === 'qa')) {\n lines.push(`- 模块(${Object.keys(state.modules).length}):${Object.entries(state.modules).map(([f, c]) => `${f}${c ? '→' + c : ''}`).join(',')}`)\n }\n if (state.verifyScripts.length && (role === 'qa' || role === 'tech' || role === 'dev')) {\n lines.push(`- 验证脚本:${state.verifyScripts.join(',')}`)\n }\n // 各阶段结论:本角色只需要前后几段\n if (role === 'pm' || role === 'acceptance') {\n if (state.stages.prd) lines.push(`- PRD 摘要:${state.stages.prd}`)\n if (state.stages.tech) lines.push(`- 技术方案摘要:${state.stages.tech}`)\n if (state.stages.qa) lines.push(`- QA 摘要:${state.stages.qa}`)\n } else if (role === 'dev' || role === 'tech') {\n if (state.stages.tech) lines.push(`- 技术方案摘要:${state.stages.tech}`)\n if (state.stages.prd) lines.push(`- PRD 摘要:${state.stages.prd}`)\n } else if (role === 'qa') {\n if (state.stages.qa) lines.push(`- 上轮 QA 摘要:${state.stages.qa}`)\n }\n if (state.lastRun) {\n const r = state.lastRun\n lines.push(`- 上轮:${r.requirement ? r.requirement : ''}${r.verdict ? ' → ' + r.verdict : ''}${r.folder ? `(${r.folder})` : ''}`)\n }\n return lines.join('\\n')\n}\n\n/** 让每个阶段产出末尾附带 state 块(将并入 stage output,由 host 提取)。 */\nexport const STATE_BLOCK_INSTRUCTION = `\\n\\n[STATE BLOCK · mandatory at the end] Append one section at the END of your answer (same output as the body; the host indexes it):\n<!-- state -->{\"phase\":\"<stage-key>\",\"summary\":\"<≤500 chars: this stage's conclusion, useful for the next run>\",\"memory\":[\"<memory points>\"]}<!-- /state -->`\n","/**\n * dsh-plugin-teamflow — Prompt 模板(阶段提示词 + 团队模板)。\n * 依赖:util.ts(clip)、core/state.ts(stateSliceFor / STATE_BLOCK_INSTRUCTION)。\n *\n * 【产物收口约定】(v0.13,ADR-0008 任务夹制)\n * - 每个需求一个自包含任务夹:docs/teamflow/<yyyyMMdd>-r<N>[-<slug>]/,收口本需求的\n * PRD/DESIGN/TECHNICAL/QA-REPORT/ACCEPTANCE。夹由 host 创建命名(journal.runDocs),\n * 建后不可变、阶段重试与断点续跑复用同夹——无版本切片、无归档动作。\n * - 产品层只保留 docs/teamflow/memory.md(团队约定/技术栈/待办,低频幂等更新)。\n * - 回归基线:新 PRD 头部「基线依赖:<其他任务夹>」声明;跨代变更用「取代:<夹>#AC-n」;\n * 硬保障在项目 verify-* 可执行套件。\n * - 命令输出日志照旧收口 logs/teamflow/<runId>/。\n */\nimport { clip } from '../util.ts'\nimport { stateSliceFor, STATE_BLOCK_INSTRUCTION } from '../core/state.ts'\n\n/** 产品层文档根(memory.md 等跨任务资产;任务产物在其中的任务夹内)。 */\nconst TF_DOCS = 'docs/teamflow'\n\n/** 本次任务产物夹相对路径(ADR-0008):host 在启动时注入 state.__runCtx.runDocs。 */\nfunction RUN(state: unknown): string {\n const rd = state && (state as { __runCtx?: { runDocs?: unknown } }).__runCtx && (state as { __runCtx?: { runDocs?: unknown } }).__runCtx!.runDocs\n return typeof rd === 'string' && rd ? rd : `${TF_DOCS}/current-run`\n}\n\n/**\n * AGENTS.md 模板 —— 共识层 + TeamFlow 托管区(所有产物文档指向 docs/teamflow/)。\n * 原则:AGENTS.md 是团队资产(会被所有 Agent 无条件注入),只放稳定共识层与文档索引;\n * 产品记忆/待办等高频运营数据放 docs/teamflow/memory.md(按需读取),绝不写进本文件。\n * TeamFlow 只维护 <!-- teamflow:begin/end --> 托管区;其余内容团队所有,不得改写。\n */\nexport const AGENTS_TEMPLATE = `# AGENTS.md — 团队协作守则与文档索引({{PRODUCT}} 产品线)\n\n> 任何新加入本产品的 Agent(团队成员)必须先通读本文件,再按 §2 文档索引读取相关文档与任务卡片,不要自行全量探索项目。\n> 维护者:团队本身 + TeamFlow 研发流水线(TeamFlow 仅维护文末 <!-- teamflow --> 托管区,其余内容为团队资产,不得改写)。\n\n## 1. 产品是什么\n\n- 产品:{{PRODUCT_DESC}}\n- 产品根:{{PRODUCT_ROOT}}/(工作区产品线约定:products/<product>/)\n- 当前版本:{{VERSION}}({{DATE}} 交付)\n\n## 2. 文档索引(按职责)\n\n| 职责 | 位置 | 说明 |\n|---|---|---|\n| 产品入口 | README.md | 玩法/操作/运行/验收速览(团队资产的入口文档) |\n| 任务产物 | ${TF_DOCS}/<yyyyMMdd-rN-slug>/ | 每个需求一个自包含任务夹:PRD/设计/技术方案/QA 报告/验收报告(按日期倒序即迭代史) |\n| 架构总览 | ${TF_DOCS}/architecture/ARCHITECTURE.md | 工程方案与脚手架说明(产品级长期文档) |\n| 产品记忆 | ${TF_DOCS}/memory.md | 团队约定/技术栈/已知待办(低频更新) |\n| 运行日志 | logs/teamflow/<runId>/ | TeamFlow 流水线各阶段命令日志(日常不读) |\n\n## 3. 团队角色与标准流程\n\n**角色**:产品经理 / UI/UX 设计师 / 架构师 / 高级全栈工程师 / QA 测试工程师。\n\n**标准流程**:需求 → PRD →(UI 改造时)UI/UX 设计 →(新项目时)架构规划 → 技术方案 → 并行开发 → QA 测试 → 产品验收。\n\n**产出物落盘约定**:每个需求的所有产物写入该需求的任务夹 ${TF_DOCS}/<任务夹>/(夹名与路径由 TeamFlow 指定,见各阶段指令);ARCHITECTURE.md 与 memory.md 是产品级长期文档。**除实际产品代码改造与 AGENTS.md 托管区外,TeamFlow 只在 ${TF_DOCS}/ 与 logs/teamflow/ 下写文件,绝不写入宿主 docs/<职责>/ 或项目根。**\n\n**完成度自查**:每个环节交付前对照职责清单自查,未完成不得流转;架构师对新项目必须实际初始化脚手架文件与 AGENTS.md 草稿。\n\n## 4. 工程约定\n\n(架构师按实际技术栈填写:代码形态、契约、验证命令、风格约定)\n\n<!-- teamflow:begin -->\n## TeamFlow 托管区(本块由 TeamFlow 自动维护,团队请勿手改)\n\n- 团队文档根:${TF_DOCS}/(每需求一个任务夹 + memory.md + architecture/)\n- 运行日志:logs/teamflow/<runId>/\n- 需求/任务/缺陷 backlog:持久化镜像位于 $DSH_HOME/teamflow/<workspace>/(按工作区/项目隔离)\n- 规则:TeamFlow 只维护本块、${TF_DOCS}/ 与 logs/teamflow/;本文件其余内容为团队资产。\n<!-- teamflow:end -->\n\n## 5. 变更记录\n\n- {{DATE}}:创建本文件(TeamFlow 脚手架)。\n`\n\nexport const MEMORY_TEMPLATE = `# {{PRODUCT}} 产品记忆与待办(TeamFlow 维护)\n\n> 本文件是**产品约定层**:只记录跨需求长期有效的信息(技术栈、团队规矩、已知待办)。\n> 每个需求的迭代细节在各自任务夹 docs/teamflow/<日期-rN-slug>/ 内,不写进本文件。\n\n## 团队约定与技术栈\n\n- (架构师初始化脚手架时填写:代码形态、模块边界、验证命令)\n\n## 已知待办(下一批)\n\n- (验收后由产品经理更新:划掉已完成、补充新发现)\n\n## 说明\n\n- 任务产物:docs/teamflow/<日期-rN-slug>/(一需求一夹,建后不可变)\n- backlog(需求/任务/缺陷)事实源:$DSH_HOME/teamflow/<workspace>/(按工作区/项目隔离)\n- 运行日志:logs/teamflow/<runId>/\n`\n\nexport function productCtx(root) {\n const base = root || 'products/<product>'\n return `[Product context] This requirement belongs to product ${base} (the current workspace IS its project root).\nBefore starting: read ${base}/AGENTS.md (team rules & doc index — read the summary first, then details on demand; no aimless full reads).\n[Task-folder docs · ADR-0008] Each requirement gets a self-contained task folder docs/teamflow/<yyyyMMdd-rN-slug>/ (folder path given per stage below); ALL artifacts of this requirement (PRD/DESIGN/TECHNICAL/QA-REPORT/ACCEPTANCE) live inside it. The folder is immutable after creation — **no archiving, no versioning** — retries/resumes write to the same folder. Cross-requirement product docs only: ${TF_DOCS}/memory.md (conventions/todos) and architecture/.\n[Baseline] New PRD declares \"基线依赖:<prior task folder>\" at top; cross-generation behavior changes are explicitly marked \"取代:<folder>#AC-n\" — historical folders are never modified.\n[Doc boundary · hard] TeamFlow contract docs are written ONLY under ${base}/${TF_DOCS}/ (create dirs if missing); **never write host docs/<role>/ and never scatter log files at project root**; command output logs go to logs/teamflow/<runId>/.\n[AGENTS.md boundary · hard] AGENTS.md is team property (injected unconditionally — consensus/index/managed zone only): **do NOT append changelog-style sections during iterations (product memory / todos / change log)** — such data belongs in ${TF_DOCS}/memory.md and task folders; besides the <!-- teamflow:begin/end --> managed zone, no stage may rewrite, reorder, or overwrite any other part of AGENTS.md.\nBacklog (req/task/bug) source of truth is the persisted mirror $DSH_HOME/teamflow/<workspace>/ under ${base}/backlog/: single rotating task card model (待办→开发中→待测试→测试中→待验收→已验收); devAssign/qaAssign live on the task card.\n`\n}\n\n/** 头尾组合切片:保留头部(背景/基线) + 尾部(新增 AC/修订),预算不变但覆盖增量段。 */\nfunction headTailClip(text: unknown, head: number, tail: number): string {\n const s = text === null || text === undefined ? '' : String(text)\n if (s.length <= head + tail) return s\n return s.slice(0, head) + '\\n...\\n[CHANGED SECTION]\\n' + s.slice(-tail)\n}\n\nexport const TOKEN_HYGIENE = (runId) => `[TOKEN HYGIENE · hard constraint] Context is expensive. Budget discipline below (violations only log a warning, never interrupt):\n- [File scope] Whole-file read is allowed ONLY for target files explicitly listed in the task spec. To understand other files' interfaces, use grep for keywords (do not read whole files). Never whole-file read source files outside the task scope.\n- [No duplicate reads] Same file: read ≤1 times. To verify a change, grep the change point instead of re-reading the whole file.\n- [grep first] Before writing code, locate with one comprehensive grep pass, then batch-read in segments; avoid repeated small read/grep passes on the same file.\n- [Batch fixes] When verification fails: read ALL failing cases at once → fix them ALL in one edit → run verification once more. Never \"fix one → run → fix one → run\". At most 3 fix-verify rounds; beyond that, output a diagnostic summary and stop.\n- Never whole-file read a file over 200 lines (use grep + limit segments for the rest); whole-file read targets ≤2 files; everything else: grep + limited segments.\n- Redirect command output to a file (under logs/teamflow/${runId || '<runId>'}/) and read the tail summary; never echo hundreds of lines inline.\n- Keep reports/summaries tight (QA ≤150 lines, acceptance ≤80 lines, dev ≤40 lines); put details in files.\n- AGENTS.md and the memory index are already injected above — no call needed to read them in full; grep keywords if you need a particular rule.\n- The contract/AC for this iteration is in the context/handoff below or in this task folder's PRD: do NOT whole-file re-read PRD.md / DESIGN.md / TECHNICAL.md from the task folder; grep/read only the code you need.\n`\n\n/** 一次成型纪律:目标文档 write ≤1 次 + read ≤2 次,严禁 read→edit→read 循环。 */\nexport const ONCE_DISCIPLINE = `[ONE-SHOT WRITE · hard constraint] The most important efficiency rule; violating it burns tokens:\n- The target delivery doc (PRD/DESIGN/TECHNICAL/QA-REPORT/ACCEPTANCE/memory) allows only **1 write of the complete new version** + **at most 2 reads** (1 to confirm structure before writing, ≤1 to verify format after).\n- **No read→edit→read loops**: never reopen the same document to \"tweak\"; never re-read the whole file just to confirm a change.\n- Use grep + limited segments for details; never whole-file read big documents.\n- Think it through once, then write. After writing, move on — do not polish retroactively.\n- Always end output with a state block so the host can index and the next run needn't re-read.\n`\n\nexport const prdPrompt = (requirement, root, runId, state) => `You are a senior Product Manager. The current workspace IS the target project (empty = project not yet created).\n${productCtx(root)}${stateSliceFor(state, 'pm')}\n${ONCE_DISCIPLINE}[REQUIREMENT]\n${requirement}\n[ARTIFACT LOCATION] ${RUN(state)}/PRD.md (write once; create dirs if missing).\n[REQUIREMENTS]\n1. First look at the state index above and the AGENTS.md doc index to decide whether this is an iterative requirement and which prior task folders relate (folder names carry date+theme; reverse date order = evolution). Do not full-read historical docs.\n2. [AC numbering] Number ACs from AC-1 within THIS folder only — ACs belong to this requirement, no global numbering.\n3. [Header declaration · mandatory] At the top of PRD.md, in this order:\n - \\`<!-- meta: summary=\"<one sentence: what this requirement delivers>\" -->\\`\n - \\`基线依赖:<prior task folder this requirement depends on>(its established behavior must not regress)\\`; write \\`基线依赖:无\\` if no dependency.\n - \\`取代:<task folder>#<AC number>:<one sentence>\\` (only when this requirement explicitly changes existing behavior; omit otherwise).\n4. Output the full PRD (Markdown): background & goals, user stories (each with testable acceptance criteria), scope & non-goals, interaction flow summary, priority (P0/P1/P2), dependencies & risks, milestone suggestions. ACs must be testable/quantifiable; prefer precision & brevity. **No revision table, no version fields like「版本:vX.Y / 状态:进行中」** (the folder IS the archive; its name carries the identity).\n5. [Memory write-back · convention changes ONLY] Update docs/teamflow/memory.md ONLY if this requirement introduces new team conventions / tech-stack decisions (replace the same-topic line, idempotent, no changelog-style appending); otherwise do not touch memory.\n6. [Engineering actions carried verbatim] Engineering instructions in the raw requirement (create/switch branch, commit, tag...) MUST be preserved verbatim into the \"工程约束\" section of the PRD: specify the action, timing, and baseline (e.g. \"branch from latest main, then implement\"). If the workspace already has uncommitted changes, note how to handle them. Never silently drop or reword engineering instructions.\n7. [State] End with a state block (phase=\"prd\"): summary covers the AC highlights + one-sentence product semantics; extra contains { \"acIndex\": {...}, \"summary\": \"<product one-liner>\", \"techStack\": \"...\" }.${STATE_BLOCK_INSTRUCTION}`\n\nexport const designPrompt = (prd, root, runId, state) => `You are a senior UI/UX designer. The current workspace IS the target project.\n${productCtx(root)}${stateSliceFor(state, 'design')}\n${ONCE_DISCIPLINE}[PRD (this change & relevant sections)]\n${clip(prd, 15000)}\n[REQUIREMENTS]\n1. If the project already has frontend code/design system or a ${TF_DOCS}/design/DESIGN.md history, grep the key conventions — do not full-read; the design must fit existing style & component norms (for iterations, keep existing norms; mark added/revised parts explicitly).\n2. Output: page/module list & information architecture, key-page wireframe descriptions (layout/components/states), interaction & motion notes, visual spec (colors/fonts/spacing — reuse existing tokens where possible), accessibility essentials.\n3. Chinese Markdown, concrete enough to directly guide frontend implementation; brevity first.\n4. Write to ${RUN(state)}/DESIGN.md (write once). [Boundary] only under ${TF_DOCS}/.\n5. [State] End with a state block (phase=\"design\"), summary = key design decisions.${STATE_BLOCK_INSTRUCTION}`\n\nexport const scaffoldPrompt = (req, design, root, runId, state) => `You are a senior architect. The workspace is empty or has no project skeleton — plan AND **actually scaffold** the new project.\n${productCtx(root)}${stateSliceFor(state, 'arch')}\n${ONCE_DISCIPLINE}[REQUIREMENT]\n${clip(req, 10000)}\n${design ? `[DESIGN NOTES]\n${clip(design, 10000)}\n` : ''}[REQUIREMENTS]\n1. Recommend tech stack (prefer an all-round stack the team knows, e.g. TypeScript + React + Node); explain trade-offs.\n2. Output the full scaffold plan: directory tree, core module split, dependency list, build/test/CI config essentials.\n3. [Grounding] Besides the plan doc, MUST actually run the initialization (within workspace limits):\n a) If the product root doesn't exist, create the directory structure (${TF_DOCS}/, logs/teamflow/, etc. — do not create unrelated docs/<role>/);\n b) Create scaffold files (package.json, configs, entry points per the plan — plan-only without grounding is NOT acceptable);\n c) [AGENTS.md handling] either:\n - If the product root already has AGENTS.md (team conventions): **never rewrite, reorder, or overwrite**. If no <!-- teamflow:begin --> block at the end, append ONE managed block <!-- teamflow:begin -->…<!-- teamflow:end --> (with index lines pointing to ${TF_DOCS}/memory.md and backlog/); if one exists, skip. Don't touch a single other line.\n - If no AGENTS.md: create it from the template below (consensus layer + doc index + teamflow managed zone), and create ${TF_DOCS}/memory.md (from the memory skeleton below, replacing {{placeholders}});\n d) Output a completion checklist: what was grounded / what wasn't and why — unfinished items MUST be listed explicitly; no \"all done\" claims.\n4. If the workspace already has files, read & respect the current state first.\n5. Chinese Markdown, tight & complete; plan doc to ${TF_DOCS}/architecture/ARCHITECTURE.md.\n\n[AGENTS.md TEMPLATE]\n${AGENTS_TEMPLATE}\n\n[MEMORY.md SKELETON]\n${MEMORY_TEMPLATE}\n[State] End with a state block (phase=\"scaffold\"), extra = { \"techStack\": \"...\", \"modules\": {\"/file\": \"contract\"} }.${STATE_BLOCK_INSTRUCTION}`\n\nexport const techPrompt = (prd, design, scaffold, tasks, root, runId, state) => `You are a senior full-stack engineer. The current workspace IS the target project — produce the technical design on top of the existing project.\n${productCtx(root)}${stateSliceFor(state, 'tech')}\n${ONCE_DISCIPLINE}[PRD (this change & relevant sections)]\n${clip(prd, 12000)}\n${design ? `[DESIGN NOTES]\n${clip(design, 10000)}\n` : ''}${scaffold ? `[SCAFFOLD PLAN]\n${clip(scaffold, 10000)}\n` : ''}${tasks && tasks.length > 0 ? `[PIPELINE-DISPATCHED TASKS (must align — do not invent a parallel task set)]\n${JSON.stringify(tasks)}\n` : ''}[REQUIREMENTS]\n1. Read AGENTS.md and the existing project first (package.json, README, src structure...). The design MUST fit the existing stack & code style and give concrete file paths.\n2. Output: data model & storage, API design (routes/params/returns), frontend component & page split, state management, key implementation points & edge cases, test strategy.\n3. Task split: if [PIPELINE-DISPATCHED TASKS] above exists, your split MUST align with it — verify/refine each dispatched task (file boundaries, interface contracts, acceptance criteria) rather than creating a separate task system; if none dispatched, provide a parallelizable task list. git actions from the PRD \"工程约束\" section (branch/commit requirements) MUST be carried into tasks (into the matching task spec or a separate list) — never lost.\n4. Chinese Markdown, tight & complete; write to ${RUN(state)}/TECHNICAL.md (write once). [Boundary] only under ${TF_DOCS}/.\n5. [ARCHITECTURE BLUEPRINT JSON · mandatory (for dev inheritance / acceptance verification, M1/M2)] After the document, additionally output an architecture blueprint JSON block (same output, at the end of the document):\n<!-- blueprint -->{\"summary\":\"one-sentence architecture judgment\",\"modules\":{\"/relative.js\":{\"responsibility\":\"responsibility\",\"dependsOn\":[\"dep files\"],\"assemblyOrder\":1,\"why\":\"why designed this way / why separate\"},\"/another.js\":{\"responsibility\":\"\",\"why\":\"\"}},\"duplications\":[\"detected duplication / adapter drift risks\"],\"tasks\":[{\"title\":\"task name (by file boundary)\",\"files\":[\"/a.js\"],\"spec\":\"one-sentence task brief\"}]}<!-- /blueprint -->\n - modules: per touched file — responsibility + deps + assembly order + **architecture rationale (why)**.\n - tasks: parallelizable tasks split by file boundary (disjoint files → parallel); merge or sequence where dependencies/conflicts exist.\n - If you find duplication or a module that should be extracted (e.g. unified storage wrapper), add it to modules with the why.\n6. [State] End with a state block (phase=\"tech\"), extra = { \"verifyScripts\": [...], \"modules\": {\"/file\": \"contract or one-liner\"} }, summary = key architecture/contract decisions.${STATE_BLOCK_INSTRUCTION}`\n\n/**\n * 架构师 prompt(M1「认知前置 + 架构落地」):全模式启用,轻量版(lite/tech/patch)只产架构蓝图 JSON,\n * 不写文档。核心:先建全局认知(允许整读关键源文件,本阶段豁免\"别整读\"的 token 卫生——架构决策需要全局视野),\n * 再输出结构化架构蓝图,供 dev 在既有架构上实现而非重建。\n * 与原生工作流对应:Phase2 全局 READ → Phase3 Design Decision。\n */\nexport const architectPrompt = (prd, root, runId, state) => `You are a senior architect. The current workspace IS the target project. Your mission: **first build global architectural awareness of the codebase, then output a structured「架构蓝图」(architecture blueprint)** — so downstream dev tasks build ON the existing architecture instead of reconstructing it from a local viewpoint.\n${productCtx(root)}${stateSliceFor(state, 'arch')}[PRD/REQUIREMENT (this change & relevant ACs)]\n${clip(prd, 12000)}\n[REQUIREMENTS]\n1. [Do not skip · build global awareness first] For a codebase that may carry off-site changes / multi-author work:\n - The【状态核对】(git state: branch / uncommitted changes / recent commits, possibly others' work) for this run is injected above — read it first; \"what you see may be stale cognition\".\n - **Whole-file reads of key source files are allowed this stage** (not just grep fragments): read through the responsibility/boundary/assembly order/dependency direction of related modules once. This is a prerequisite for architecture decisions, not waste.\n - Identify duplicated implementations (e.g. multiple security wrappers / storage utilities), blurred boundaries, extractable modules.\n2. [Architecture decision] Based on global awareness, judge: should this change extract a standalone module (e.g. independent storage/localStorage wrapper), dependency direction, assembly order, which files must change together, which can go parallel.\n3. [OUTPUT · one JSON block only (no prose, no Markdown code fences)]:\n<!-- blueprint -->{\"summary\":\"one-sentence architecture judgment\",\"modules\":{\"/relative.js\":{\"responsibility\":\"responsibility\",\"dependsOn\":[\"dep files\"],\"assemblyOrder\":1,\"why\":\"why designed this way / why separate\"},\"/another.js\":{\"responsibility\":\"\",\"why\":\"\"}},\"duplications\":[\"detected duplication / adapter drift risk 1\",\"risk 2\"],\"tasks\":[{\"title\":\"task name (by file boundary)\",\"files\":[\"/a.js\"],\"spec\":\"one-sentence task brief\"}]}<!-- /blueprint -->\n - modules: per involved file — responsibility + deps + assembly order + **why** (architecture rationale so devs understand, not blindly follow).\n - tasks: parallelizable tasks by file boundary (disjoint files → parallel / can mark concurrency); merge or sequence where dependencies/conflicts exist.\n - If duplication / extract-the-module is found, add the new module to modules with why.\n4. Read-only: do not modify code; write NO document files.${STATE_BLOCK_INSTRUCTION}`\n\nexport const devPrompt = (task, tech, prd, root, runId, state) => `You are a senior full-stack engineer (implementation executor). The current workspace IS the target project — actually implement the following task.\n${productCtx(root)}${stateSliceFor(state, 'dev')}${TOKEN_HYGIENE(runId)}[CONTEXT PACK]\n[TASK TITLE] ${task.title}\n${task.files && task.files.length ? `[TASK TARGET FILES] ${task.files.join(',')}` : ''}\n[TASK BRIEF] ${task.spec || '(see technical design)'}\n${(tech && String(tech).trim())\n ? `[TECH DESIGN SUMMARY (grep details on demand, don't full re-read)]\n${clip(tech, 12000)}`\n : ''}\n[PRD] Relevant acceptance criteria: ${TF_DOCS}/prd/PRD.md (grep the AC number as needed; no full read).\n[REQUIREMENTS]\n1. **Architecture blueprint first**: if the injected blueprint JSON (\"<!-- blueprint -->\" from tech/architect stage) is present, implement ON the existing architecture per it — follow its module split / assembly order / whys (understand the intent, don't blindly follow or rebuild); if blueprint contradicts reality, state evidence in the summary.\n2. Touch ONLY task-relevant files (see [TASK TARGET FILES]; if absent, infer from spec). Respect existing architecture & code style. Use grep to confirm other files' interfaces; no whole-file reads of irrelevant big files.\n3. If spec contradicts reality, explain with evidence in the summary instead of claiming completion or expanding scope on your own.\n4. Actually write/modify code (grep + segmented reads to locate; no repeated whole-file reads), then run relevant build/verification to ensure green.\n5. [Engineering action execution] If task spec or PRD 工程约束 includes git actions (e.g. new branch): **execute the action BEFORE writing code** (e.g. git checkout -b <branch>); if the workspace carries unrelated uncommitted changes, do NOT commit/clean them — state the situation in the summary.\n6. [Log discipline] Redirect command output to logs/teamflow/${runId || '<runId>'}/.\n7. Output an implementation summary (≤40 lines): changed files, key implementation points, how verified, leftovers. No big code pastes.\n8. [State] End with a state block (phase=\"dev\"), touched = array of changed files, summary = implementation conclusion.${STATE_BLOCK_INSTRUCTION}`\n\nexport const qaPrompt = (prd, devSummary, root, runId, state) => `You are a senior QA test engineer. The current workspace IS the target project — functionally test this delivery.\n${productCtx(root)}${stateSliceFor(state, 'qa')}${TOKEN_HYGIENE(runId)}[PRD (this change & relevant ACs)]\n${headTailClip(prd, 5000, 7000)}\n[DEV RESULT SUMMARY]\n${clip(devSummary, 15000)}\n[REQUIREMENTS]\n0. [Architecture verification · mandatory (M3 quality gate)] Besides functional testing, do a **lightweight architecture check** on the delivery:\n - If the injected blueprint JSON (\"<!-- blueprint -->\") is present, verify the implementation follows it (was the to-be-extracted module extracted? deps/assembly per blueprint? any deviations?).\n - Check for **duplicated implementations** (e.g. multiple security wrappers/storage/adapter utilities drifting), **abstraction not extracted where it should be**, **obviously broken existing structure**.\n - Report architecture findings in the defect table format (severity P1, module =「架构」). This is part of the delivery quality gate, not just functional bugs.\n1. [Environment limits · don't waste effort] The sandbox forbids launching CDP-driven Chrome/Edge: real-browser automation (Playwright/Puppeteer/chromedriver/--remote-debugging-port), audio/pixel/timing/multi-browser/screen-reader checks are ALL impossible — this is a policy refusal, not a broken command; don't try, don't retry with alternative tools. Verification must use sandbox-legal paths: build/assembly checks, unit tests, DOM-level E2E (jsdom or equivalent), static audit, adversarial spot-checks.\n2. Acceptance items that cannot be auto-tested (audio/pixel/real timing/dual resolution/offline multi-browser/screen reader etc.): do NOT fail them — instead list each in the report's「人工补测清单」section (acceptance criteria + method + tool), note「环境限制,非交付缺陷」, for human review.\n3. Read AGENTS.md §4 engineering conventions (verify commands) and the code changes first, then actually run those sandbox-legal verifications.\n4. [Log discipline] Redirect command output to logs/teamflow/${runId || '<runId>'}/ (e.g. qa-out.log); no scatter at project root.\n5. Output the test report (body ≤150 lines, verdict first): scope & environment, cases & results (pass/fail/blocked), conclusion (whether acceptance-ready).\n6. [Defect format] Report found defects as the structured table below (for direct import by the defect tracker):\n | 编号 | 严重级(P0/P1/P2/P3) | 功能模块 | 复现步骤 | 期望行为 | 实际行为 | 关联验收项 |\n If no defects: explicitly output 「未发现缺陷」.\n7. Chinese Markdown, concrete & executable; write the report to ${RUN(state)}/QA-REPORT.md (write once, tight body). [Boundary] only under ${TF_DOCS}/.\n8. [State] End with a state block (phase=\"qa\"), summary = test conclusion / blocked items, extra = { \"verifyScripts\": [...] }.${STATE_BLOCK_INSTRUCTION}`\n\n/** QA 打回后的开发修复 prompt:确认缺陷是否属实 → 修复 → 复验交接(QA→dev 打回闭环用)。 */\nexport const qaFixPrompt = (defects, qa, tech, prd, root, runId, state) => `You are a senior full-stack engineer. The QA report points out several defects — **confirm each one** and fix them, then hand back for QA re-verification.\n${productCtx(root)}${stateSliceFor(state, 'dev')}${TOKEN_HYGIENE(runId)}\n[QA REPORT (defect table in report §3)]\n${clip(qa, 12000)}\n[DEFECTS POINTED OUT BY QA]\n${JSON.stringify(defects, null, 2)}\n[TECH DESIGN / BLUEPRINT SUMMARY (fix ON the existing architecture — don't rebuild)]\n${(tech && String(tech).trim()) ? clip(tech, 12000) : ''}\n[PRD] Relevant acceptance criteria: ${RUN(state)}/PRD.md (grep the AC number as needed; no full read).\n[REQUIREMENTS]\n1. [Confirm first, then fix] For each defect, verify one by one whether it truly holds (read code / reproduce / compare actual vs expected):\n — confirmed → fix it directly; QA false positive / contradicts reality → state evidence explicit in the summary (no fabricated changes, and no ignoring real defects either).\n2. Touch ONLY defect-related files (grep to locate; no whole-file reads of irrelevant big files); respect existing architecture & code style.\n3. After fixing, run relevant verification to ensure green (regression floor: existing verify suites pass untouched); redirect output to logs/teamflow/${runId || '<runId>'}/.\n4. Output a fix summary (≤40 lines, Chinese): per defect —「truth judgment + fix」or「false-positive evidence」, changed files, how verified, leftovers. No big code pastes.\n5. [State] End with a state block (phase=\"dev\"), touched = changed files array, summary = fix conclusion.${STATE_BLOCK_INSTRUCTION}`\n\nexport const acceptancePrompt = (prd, qa, devSummary, root, runId, state) => `You are the product manager (acceptance lead). Do a final acceptance of this delivery against the PRD acceptance criteria.\n${productCtx(root)}${stateSliceFor(state, 'acceptance')}${TOKEN_HYGIENE(runId)}\n${ONCE_DISCIPLINE}[PRD (revision log + this run's new ACs)]\n${headTailClip(prd, 4000, 5000)}\n[QA TEST REPORT (verdict)]\n${clip(qa, 10000)}\n[DEV RESULT SUMMARY]\n${clip(devSummary, 8000)}\n[REQUIREMENTS]\n0. [Architecture consistency check · mandatory (M3 quality gate)] Beyond functional ACs, check structural quality:\n - If the injected blueprint JSON (\"<!-- blueprint -->\") is present: does the implementation follow it (module extracted as planned? assembly order correct? abstraction missing where required?).\n - Any obvious **duplicated implementation / adapter drift / broken existing structure** (this is a code-quality floor, not optional).\n - **Verdict impact**: only functionally green but with 「deviates from blueprint / duplicated impl / should-have-extracted」 → verdict should be **⚠️ 有条件通过** (architecture rework items listed, re-accept after rework); **significant deviation / broken structure → ❌ 不通过**. Never treat \"verify all green\" as the sole evidence of \"no rework needed\".\n1. Verify each PRD acceptance criterion one by one.\n2. Output the acceptance verdict (body ≤80 lines): ✅ 通过 / ⚠️ 有条件通过 / ❌ 不通过 / 📝 需求不适用, with a per-criterion check table, opinions & leftovers.\n3. [Not-applicable judgment] If the PRD/tech-change/confirm doc already states「需求与现状不符」, or the dev result is explicitly「无需改动」, the verdict must be **「📝 需求不适用」** with reasons — do NOT mark ✅ 通过 just for \"no defects\".\n4. [Acceptance report] Write to ${RUN(state)}/ACCEPTANCE.md (write once, matching the body). [Memory write-back · convention changes ONLY] Update docs/teamflow/memory.md only if this requirement introduces new conventions/tech-stack decisions, or the 已知待办 list changes (same-topic line replace, idempotent, no changelog appending); otherwise don't touch memory. [Boundary] only under ${TF_DOCS}/; never modify AGENTS.md beyond the <!-- teamflow --> managed zone.\n5. Chinese Markdown.\n6. [State] End with a state block (phase=\"acceptance\"), summary = acceptance conclusion, verdict = \"accepted/rework/reject/needs-human\", extra.done = confirmation of this delivery.${STATE_BLOCK_INSTRUCTION}`\n\n/** 需求分诊模型 prompt(模型驱动 triage;供 core/triage.runTriage 使用)。 */\nexport const TRIAGE_PROMPT = (requirement: string, opts: { needDesign?: boolean } | undefined, pre: { rationale: string[] }): string => `You are a senior research-dev triage analyst. Do ONE thing: analyze which pipeline mode this dev requirement fits, then give the conclusion. No code, no scope speculation.\n[RAW REQUIREMENT]\n${requirement}\n${pre.rationale.length ? `\\n[REGEX PRE-FILTER SIGNALS (reference only; judge semantically, don't blindly follow)]\\n${pre.rationale.join('\\n')}` : ''}\n\\n[OPTIONAL SIGNAL] UI work needed: ${(opts && opts.needDesign) ? 'yes' : 'not flagged'}\n\n[THE FIVE MODES]\n- patch: hotfix / one-line fix / constant / version / typo — no independent QA; single agent changes and delivers\n- lite: single-module small feature / micro enhancement — confirm-style PRD + dev + QA + acceptance (no UI design, no standalone tech-design doc)\n- tech: tech-driven rework (refactor/optimize/arch upgrade/dependency/tech debt) — a「技术变更单」instead of a feature PRD, enhanced regression\n- medium: medium-sized feature with UI — needs design + tech design + full guardrails\n- full: cross-module / large new feature — full 7-stage + upfront assessment\n\n[JUDGMENT POINTS]\n1. Distinguish \"user-visible functional change\" vs \"internal tech change\": refactors/optimizations, even large code volume, usually go tech, not full.\n2. UI/visual/interaction/buttons/pages involved → at least medium (excludes patch/tech).\n3. hotfix/single-point/pure numeric/pure docs → patch; clear \"add feature X\" → pick lite/medium/full by size.\n4. Focused change (even with tests/regression) → lite/tech by nature; not necessarily full.\n5. [M1 ARCHITECTURE CRITERION (important)] **Architecture-level changes** — persistence/localStorage/database/standalone module/abstraction/cross-many-files without an existing reusable wrapper (like a localStorage wrapper, storage layer, state management) — even if they look like \"small features\", go **at least medium** (must pass the architecture stage and produce a blueprint, avoiding scattered local implementations by dev); such changes collapse under a light \"micro feature\" tier. Tech-driven rework (refactor/optimize/arch upgrade) is itself tech (tech also runs the lightweight blueprint now).\n\n[OUTPUT] one JSON object only (no other text):\n{ \"mode\": \"patch|lite|tech|medium|full\", \"slug\": \"<topic words> (3-24 lowercase letters/digits/hyphens, e.g. wallkick-toggle, 7bag-random; used to name the task folder)\", \"kind\": \"one-word nature\", \"needDesign\": true|false, \"complexity\": \"small|medium|large\", \"rationale\": [\"key argument 1\",\"key argument 2\"], \"confidence\": \"high|medium|low\" }`\n\n/** tech 档 PRD:技术变更单(无功能 AC,重范围/目标/改动面/回归)。 */\nexport const techChangePrompt = (requirement, root, runId, state) => `You are the senior tech lead. The current workspace IS the target project. This is a **tech-driven rework** requirement (refactor/optimize/upgrade/architecture/dependencies/tech debt) — the product doesn't need a full feature PRD, but needs a **技术变更单** (tech change sheet) as the contract for dev/QA/acceptance and memory write-back.\n${productCtx(root)}${stateSliceFor(state, 'tech')}\n${ONCE_DISCIPLINE}[RAW REQUIREMENT / REWORK GOAL]\n${requirement}\n[REQUIREMENTS]\n1. Produce the「技术变更单」(Markdown), write to ${RUN(state)}/TECH-CHANGE.md — **do NOT rewrite any functional ACs in prior task-folder PRDs** (tech-driven rework adds no user-visible acceptance items in principle; if there IS a sliver of user-visible behavior change, state it explicitly in that section).\n2. Change sheet content: background & goal (one sentence), impact scope (files/modules), tech approach (key points), behavior-compatibility impact (any user-visible change), regression & verification plan (which verify commands, regression floor), risks & rollback.\n3. Sync the change's key points into docs/teamflow/memory.md (only when new conventions/todos change; same-topic line replace, idempotent); don't touch AGENTS.md beyond the teamflow managed zone.\n4. Tight (this is a contract for dev/QA, ≤120 lines), Chinese Markdown. [Boundary] only under ${TF_DOCS}/.\n5. [State] End with a state block (phase=\"tech\"), extra = { \"verifyScripts\": [...], \"scopedFiles\": [...] }.${STATE_BLOCK_INSTRUCTION}`\n\n/** patch 档 PRD:单点修复快速确认(不产 PRD 文档)。 */\nexport const patchConfirmPrompt = (requirement, root, runId, state) => `You are a senior engineer. The current workspace IS the target project. This is a **hotfix / single-point fix** requirement — no full PRD, just a short confirmation (≤40 lines).\n${productCtx(root)}${stateSliceFor(state, 'dev')}\n${ONCE_DISCIPLINE}[RAW REQUIREMENT]\n${requirement}\n[REQUIREMENTS]\n1. Judge whether it truly is a single-point/hotfix: yes → output the「确认单」(confirmation sheet); no → explicitly say \"suggest upgrading pipeline mode (e.g. tech/lite/full)\", don't force it.\n2. [Requirement vs reality] **First verify the requirement description matches the workspace reality**: matches → produce the sheet per the outline below; mismatches → explicitly note「需求与实际不符,建议取消改动或调整需求」in the sheet, **no fabricated changes**.\n3. Sheet content: fix point (file/location), change outline, regression impact (tiny / which verify commands to run), whether to bump version along the way.\n4. Output the confirmation sheet text ONLY — **do not touch any product docs** (no PRD this time; memory write-back belongs to acceptance stage).\n5. [State] End with a state block (phase=\"patch\"), summary = confirmation conclusion.${STATE_BLOCK_INSTRUCTION}`\n","/**\n * dsh-plugin-teamflow core — 需求分诊路由(ADR-0004)。\n * - MODE_REGISTRY:5 档流水线策略表(full/medium/lite/tech/patch),各档声明阶段集/PRD 形态/护栏。\n * - suggestMode:正则预筛(给模型参考信号 + 模型不可用时的兜底)。\n * - runTriage:**模型驱动分诊**——spawn 分诊分析师子代理思考一轮,产出结构化裁决(mode/性质/UI/复杂度/理由)。\n */\nimport type { PipelineMode, PipelineOptions } from '../types.ts'\nimport { extractText } from '../util.ts'\nimport { runtime, providerName } from './context.ts'\nimport { TRIAGE_PROMPT } from '../prompts/index.ts'\n\n/** 各档流水线规格(策略表条目)。 */\nexport interface ModeSpec {\n key: PipelineMode\n label: string\n /** PRD 形态:full=完整 PRD;confirm=确认型(不重写文档);tech-change=技术变更单(无功能 AC)。 */\n prdForm: 'full' | 'confirm' | 'tech-change'\n /** 是否默认开 UI/UX 设计阶段(UI 需求触发)。 */\n needDesignDefault: boolean\n /** 是否保留独立 QA agent(patch 档可折叠为开发自测)。 */\n independentQA: boolean\n /** 走文档化技术方案阶段与否。 */\n techDoc: boolean\n /** 一句话适用场景。 */\n desc: string\n}\n\nexport const PIPELINE_MODES: PipelineMode[] = ['full', 'medium', 'lite', 'tech', 'patch']\n\nexport const MODE_REGISTRY: Record<PipelineMode, ModeSpec> = {\n full: { key: 'full', label: 'full(完整)', prdForm: 'full', needDesignDefault: true, independentQA: true, techDoc: true, desc: '跨模块大需求 / 新功能重:完整 7 段 + PM 前置评估' },\n medium: { key: 'medium', label: 'medium(标准)', prdForm: 'full', needDesignDefault: true, independentQA: true, techDoc: true, desc: '含 UI 的中等功能:PRD+设计+技术方案+开发+QA+验收' },\n lite: { key: 'lite', label: 'lite(轻量)', prdForm: 'confirm', needDesignDefault: false, independentQA: true, techDoc: false, desc: '单模块小功能/微增强:PRD(确认型)+轻量架构蓝图+开发+QA+验收(needDesign 时含 UI/UX 设计)' },\n tech: { key: 'tech', label: 'tech(改造)', prdForm: 'tech-change', needDesignDefault: false, independentQA: true, techDoc: false, desc: '技术驱动改造/优化/重构/热修:技术变更单+轻量架构蓝图+开发+QA+验收(回归加强)' },\n patch: { key: 'patch', label: 'patch(热修)', prdForm: 'confirm', needDesignDefault: false, independentQA: false, techDoc: false, desc: '单行/常量/版本号/hotfix:单 agent 直改+自测即交付(无独立 QA)' },\n}\n\n/** 关键词信号集(命中 → 加重某档倾向)。 */\nconst SIGNALS: Array<{ mode: 'patch' | 'tech' | 'lite' | 'medium' | 'full'; words: string[] }> = [\n { mode: 'patch', words: ['hotfix', '热修', '修复 bug', '修 bug', '改个 bug', '版本号', '常量', '一行', 'bump', '回滚', '卫生', '笔误', '拼写'] },\n { mode: 'tech', words: ['重构', '优化', '升级', '架构', '性能', '依赖', '脚手架', '缓存', '清理', '遗留债', '工程', '内部改造', '技术债'] },\n { mode: 'lite', words: ['微功能', '小功能', '小增强', '加个', '补一个', '轻微', '顺手'] },\n { mode: 'medium', words: ['界面', 'UI', '视觉', '页面', '按钮', '样式', '交互', '布局', '组件', '持久化', 'localStorage', '本地存储', '存储', '保存', '恢复', '存档', '独立模块', '抽象', '存储层', 'sessionStorage', 'IndexedDB', '跨模块', '数据层'] },\n { mode: 'full', words: ['跨模块', '完整', '大型', '对接', '集成', '模块化', '重构为', '二期', '平台'] },\n]\n\n/** 对原始需求做启发式分诊。返回建议 mode + 判定理由 + 置信。 */\nexport function suggestMode(requirement: string, opts?: { needDesign?: boolean; tasks?: unknown }): { mode: PipelineMode; kind: string; rationale: string[]; confidence: 'high' | 'medium' | 'low' } {\n const text = String(requirement || '')\n const hits: Array<{ mode: PipelineMode; word: string }> = []\n for (const sig of SIGNALS) {\n for (const w of sig.words) {\n if (text.includes(w)) hits.push({ mode: sig.mode, word: w })\n }\n }\n const rationale = hits.map((h) => `命中「${h.word}」→ ${h.mode}`)\n const countOf = (m: PipelineMode) => hits.filter((h) => h.mode === m).length\n\n let mode: PipelineMode = 'full' // 默认完整(护栏优先,宁重勿漏)\n if (countOf('patch') > 0) mode = 'patch'\n else if (countOf('tech') > 0 && countOf('medium') === 0 && countOf('full') === 0) mode = 'tech'\n else if (countOf('lite') > 0 && countOf('medium') === 0) mode = 'lite'\n else if (countOf('medium') > 0 || opts && opts.needDesign) mode = 'medium'\n else if (hits.length === 0) mode = 'full'\n\n // 护栏兜底:patch 不适用于\"需求含测试/验收/跨文件\"场景;UI 需求不得落 patch/tech\n if ((mode === 'patch' || mode === 'tech') && (opts && opts.needDesign)) mode = 'medium'\n if ((mode === 'patch') && (countOf('tech') > 0 || text.includes('新增') || text.includes('功能'))) mode = 'lite'\n\n // M1 架构护栏:命中\"架构性\"信号(持久化/存储/独立模块/抽象/跨模块等)→ 不得落 lite/tech/patch,\n // 强制 medium+(必须有架构阶段产蓝图)。架构性改动靠局部视角会塌,不能当微功能/改造处理。\n const architectureSignals = ['持久化', 'localStorage', '本地存储', '存储', '保存', '恢复', '存档', '独立模块', '抽象', '存储层', 'sessionStorage', 'IndexedDB', '跨模块', '数据层']\n if ((mode === 'lite' || mode === 'tech' || mode === 'patch') && architectureSignals.some((w) => text.includes(w))) {\n mode = 'medium'\n rationale.push(`架构护栏:需求含「${architectureSignals.find((w) => text.includes(w))}」→ 强升 medium(需架构阶段)`)\n }\n\n const kind = mode === 'patch' ? '热修/单点' : mode === 'tech' ? '技术驱动改造' : mode === 'lite' ? '微功能' : mode === 'medium' ? '标准功能(含UI)' : '完整需求'\n const confidence: 'high' | 'medium' | 'low' = mode === 'patch' ? 'high' : hits.length >= 2 ? 'medium' : 'low'\n if (rationale.length === 0) rationale.push('无强信号,默认 full(护栏优先)')\n return { mode, kind, rationale, confidence }\n}\n\n/** 规范化 mode 入参:合法则返回,非法返回 null。 */\nexport function normalizeMode(v: unknown): PipelineMode | null {\n if (typeof v !== 'string') return null\n if (PIPELINE_MODES.indexOf(v as PipelineMode) !== -1) return v as PipelineMode\n return null\n}\n\n/** 由 mode 推导执行选项(needDesign/lite 映射;供 start 前归一)。 */\nexport function modeToOptions(mode: PipelineMode, provided?: PipelineOptions): { needDesign: boolean; lite: boolean; techDoc: boolean; independentQA: boolean; mode: PipelineMode } {\n const spec = MODE_REGISTRY[mode]\n const wantDesign = spec.needDesignDefault && !!(provided && provided.productRoot) || !!(provided && provided.needDesign)\n return {\n needDesign: wantDesign,\n lite: mode === 'lite' || mode === 'tech' || mode === 'patch',\n techDoc: spec.techDoc && !provided?.lite,\n independentQA: spec.independentQA,\n mode,\n }\n}\n\n/** 分诊裁决(模型驱动或正则兜底后的统一形态)。 */\nexport interface TriageVerdict {\n mode: PipelineMode\n kind: string\n needDesign: boolean\n complexity: 'small' | 'medium' | 'large'\n rationale: string[]\n confidence: 'high' | 'medium' | 'low'\n /** ADR-0008 任务夹主题词(短横线小写英文,3-24 字符;模型未给/非法为空)。 */\n slug: string\n source: 'model' | 'fallback'\n}\n\n/** 解析模型 JSON 输出(容错:定位首个 {...} 块;字段缺失/非法回退 null)。 */\nfunction parseVerdictText(text: string): TriageVerdict | null {\n const m = String(text || '').match(/\\{[\\s\\S]*\\}/)\n if (!m) return null\n try {\n const raw = JSON.parse(m[0])\n const mode = normalizeMode(raw.mode)\n if (!mode) return null\n return {\n mode,\n kind: typeof raw.kind === 'string' ? raw.kind : '',\n needDesign: raw.needDesign === true,\n complexity: ['small', 'medium', 'large'].indexOf(raw.complexity) !== -1 ? raw.complexity : 'medium',\n rationale: Array.isArray(raw.rationale) ? raw.rationale.map(String).slice(0, 6) : [],\n confidence: ['high', 'medium', 'low'].indexOf(raw.confidence) !== -1 ? raw.confidence : 'medium',\n slug: /^[a-z0-9][a-z0-9-]{2,23}$/.test(String(raw.slug || '')) ? String(raw.slug) : '',\n source: 'model',\n }\n } catch (e) { return null }\n}\n\n/** 兜底:正则预筛 → fallback verdict(模型分诊不可用/超时/解析失败时)。 */\nfunction fallbackVerdict(requirement: string, opts?: { needDesign?: boolean }): TriageVerdict {\n const pre = suggestMode(requirement, opts)\n return {\n mode: pre.mode, kind: pre.kind, needDesign: !!(opts && opts.needDesign), complexity: 'medium',\n rationale: [...pre.rationale, '(模型分诊不可用,已用正则兜底)'], confidence: pre.confidence, slug: '', source: 'fallback',\n }\n}\n\n/** 模型驱动分诊:spawn「分诊分析师」子代理思考一轮;子代理不可用/超时/解析失败 → 正则兜底。 */\nexport async function runTriage(\n requirement: string,\n opts?: { needDesign?: boolean },\n parent?: unknown,\n signal?: unknown,\n): Promise<TriageVerdict> {\n const subagents = runtime.subagents as { start?: (provider: string, init: unknown) => Promise<{ result: Promise<{ output?: unknown; stopReason?: string }>; dispose?: () => Promise<void> | void }> } | undefined\n if (!subagents || typeof subagents.start !== 'function') return fallbackVerdict(requirement, opts)\n const pre = suggestMode(requirement, opts)\n let run: { result: Promise<{ output?: unknown; stopReason?: string }>; dispose?: () => Promise<void> | void } | null = null\n try {\n run = await subagents.start(providerName() as string, {\n label: '需求分诊',\n prompt: [{ type: 'text', text: TRIAGE_PROMPT(requirement, opts, pre) }],\n parent,\n signal,\n })\n const result = await Promise.race([\n run.result,\n new Promise<never>((_, rej) => setTimeout(() => rej(new Error('triage 超时(90s)')), 90000)),\n ]) as { output?: unknown; stopReason?: string }\n const parsed = parseVerdictText(extractText(result && result.output))\n if (parsed) return parsed\n } catch (e) { /* 超时/失败 → 走兜底 */ } finally {\n if (run && run.dispose) { try { await run.dispose() } catch (e) { /* ignore */ } }\n }\n return fallbackVerdict(requirement, opts)\n}\n","/**\n * dsh-plugin-teamflow core — 完成汇总投递(流水线结束 → 通知发起会话的 Agent)。\n * 依赖:@deepseek-ai/dsh-llm(createUserMessage)、util/types。\n */\nimport { createUserMessage } from '@deepseek-ai/dsh-llm'\nimport { clip } from '../util.ts'\nimport { MODE_REGISTRY } from './triage.ts'\nimport type { Journal, ParentAgentLike } from '../types.ts'\n\n/**\n * 流水线结束汇总投递:把结果通知给发起会话的 Agent(主线程)。\n * - idle Agent → followup(唤醒新 turn,模型可见汇报)\n * - running Agent → inject(注入下一个 step 的上下文,不打断)\n * 投递失败静默(Agent 已销毁/会话关闭等场景)。\n */\nexport function deliverCompletion(journal: Journal, parent: ParentAgentLike): void {\n try {\n if (!parent || typeof parent.inject !== 'function' || typeof parent.followup !== 'function') return\n const stages = journal.stages || []\n const done = stages.filter((s) => s.status === 'done').length\n const failed = stages.filter((s) => s.status === 'failed' || s.status === 'needs-human').length\n const cancelledStages = stages.filter((s) => s.status === 'cancelled').length\n const usageAgg = stages.reduce((a, s) => {\n const u = s.usage\n if (!u) return a\n a.input += u.input || 0\n a.cacheRead += u.cacheRead || 0\n a.cacheWrite += u.cacheWrite || 0\n a.output += u.output || 0\n a.calls += u.calls || 0\n return a\n }, { input: 0, cacheRead: 0, cacheWrite: 0, output: 0, calls: 0 })\n const tok = (n) => (n >= 1e6 ? `${(n / 1e6).toFixed(2)}M` : n >= 1e3 ? `${(n / 1e3).toFixed(1)}k` : String(n))\n const hasUsage = (usageAgg.input + usageAgg.cacheRead + usageAgg.cacheWrite + usageAgg.output) > 0\n const hitRate = (i, c) => { const t = i + c; return t > 0 ? `${Math.round((c / t) * 100)}%` : null }\n const hitTotal = hitRate(usageAgg.input, usageAgg.cacheRead)\n // 每个角色的真实 token(label 前缀即角色,如「产品经理」「QA 测试工程师」;官方口径)\n const roleLine = stages\n .filter((s) => s.usage && (s.usage.input + s.usage.output + s.usage.cacheRead + s.usage.cacheWrite) > 0)\n .slice(-8)\n .map((s) => {\n const u = s.usage\n const hit = hitRate(u.input, u.cacheRead)\n return `${String(s.label || '').split('·')[0].trim()} ⇅${tok(u.input)}/⇅${tok(u.cacheRead)}·⬆${tok(u.output)}${hit ? `·${hit}` : ''}`\n })\n .join(',')\n const tokenLine = hasUsage\n ? `Token:输入(未命中) ${tok(usageAgg.input)} / 输入(命中) ${tok(usageAgg.cacheRead)} / 写缓存 ${tok(usageAgg.cacheWrite)} / 输出 ${tok(usageAgg.output)} · ${usageAgg.calls} 次调用${hitTotal ? ` · 缓存命中 ${hitTotal}` : ''}`\n : 'Token:—'\n const statusLine = {\n completed: journal.humanIntervention ? '⚠️ 已完成(需人工介入)' : '✅ 已完成',\n failed: '❌ 失败',\n cancelled: '⏹ 已取消',\n interrupted: '⚠ 中断(可用 teamflow_resume 从断点重跑)',\n }[journal.status] || journal.status\n const stagesLine = stages.length === 0\n ? '尚未进入任何阶段'\n : `${stages.length} 个阶段 · ${done} 完成${failed > 0 ? ` · ${failed} 失败` : ''}${cancelledStages > 0 ? ` · ${cancelledStages} 取消` : ''}`\n const text = [\n `【团队研发流水线汇报】runId=${journal.id}`,\n `状态:${statusLine}${journal.error ? `(${clip(journal.error, 300)})` : ''}`,\n `阶段:${stagesLine}`,\n `Agent:共启动 ${journal.agentsStarted || 0} 个子代理`,\n tokenLine,\n hasUsage && roleLine ? `Token(按角色):${roleLine}` : '',\n journal.product ? `产品:${journal.product}` : '',\n (() => {\n const m = journal.options && journal.options.mode\n return (typeof m === 'string' && m !== 'full' && m !== 'medium')\n ? `模式:${MODE_REGISTRY[m as keyof typeof MODE_REGISTRY] ? MODE_REGISTRY[m as keyof typeof MODE_REGISTRY].label : m}`\n : ''\n })(),\n `backlog:需求 ${journal.reqId || '—'}($DSH_HOME/teamflow/ 持久化)`,\n '用户可打开「🏭 团队工作台」tab 查看阶段泳道、拖拽看板与 token 明细。',\n '如需继续处理:可认领缺陷(teamflow_claim)、人工流转(teamflow_update)、断点重跑(teamflow_resume)。',\n '若用户在场请简明转述以上要点;若无人值守仅记录即可,不必长篇回复。',\n ].filter(Boolean).join('\\n')\n const message = createUserMessage({\n content: [{ type: 'text', text }],\n source: {\n kind: 'plugin',\n plugin: 'dsh-plugin-teamflow',\n form: 'notice',\n summary: `团队研发流水线 ${journal.status === 'completed' ? '已完成' : journal.status}(runId=${journal.id})`,\n },\n })\n if (parent.status === 'idle') parent.followup(message)\n else parent.inject(message)\n } catch (e) {\n console.warn('[teamflow] 完成汇报投递失败(忽略)', e?.message)\n }\n}\n","/**\n * dsh-plugin-teamflow core — M0 状态核对(sanity check)。\n *\n * 目的(三情况协议):\n * - 情况一(全新会话):0 认知 → 核对确认\"从零开始\"。\n * - 情况二(续会话):认知大概率过期(多人协作/场外提交/非流水线改动)→ 核对发现预期外变化。\n * - 情况三(新会话处理新需求):即使共用 state/记忆,仓库也可能被外部改动 → 核对现状。\n *\n * 核心原则:认知资产(索引/记忆/摘要)可复用\"减量\",但永不能替代\"对代码库当前真实状态的核对\"。\n * 本模块在 host 侧直接跑 git(零模型 token、轻量、失败优雅降级为\"无法核对\"),\n * 产出 externalDiffs 摘要注入到后续所有阶段 prompt。\n */\nimport { execFileSync } from 'node:child_process'\n\n/** 单条 git 检查结果(失败返回 null,调用方降级)。 */\nfunction gitCmd(cwd: string, args: string[], timeoutMs = 8000): string | null {\n try {\n return execFileSync('git', args, { cwd, encoding: 'utf8', timeout: timeoutMs, windowsHide: true }).trim()\n } catch (e) {\n return null\n }\n}\n\n/** 状态核对结果。 */\nexport interface SanityCheck {\n ok: boolean\n /** 是否在 git 仓库内(非仓库/无 git → 无法核对) */\n inRepo: boolean\n /** 当前分支名(或 detached HEAD / 非仓库) */\n branch: string | null\n /** 工作区未提交改动(git status --short 输出,可能为空串) */\n dirty: string\n /** 是否有未提交改动 */\n hasDirty: boolean\n /** 近期场外提交(git log --oneline -5,可能为空) */\n recentCommits: string\n /** 简短人类可读摘要(注入 prompt 用) */\n summary: string\n}\n\n/**\n * 跑一次状态核对。\n * @param path - 工作区绝对路径(workspaceScopeOf(agent).path)。\n */\nexport function runSanityCheck(path: string | null | undefined): SanityCheck {\n const defaultOut: SanityCheck = {\n ok: false, inRepo: false, branch: null, dirty: '', hasDirty: false, recentCommits: '', summary: '',\n }\n if (!path) {\n return { ...defaultOut, summary: '⚠ 无法确定工作区路径,未做状态核对。' }\n }\n const branch = gitCmd(path, ['branch', '--show-current'])\n const status = gitCmd(path, ['status', '--short'])\n if (branch === null && status === null) {\n // git 命令完全不可用(不在仓库 / git 未安装 / 沙箱拦截)\n return { ...defaultOut, summary: '⚠ 状态核对不可用(非 git 仓库或 git 命令被拒),无法确认代码库真实状态。' }\n }\n const recent = gitCmd(path, ['log', '--oneline', '-5'])\n const dirty = status || ''\n const dirtyLines = dirty.split('\\n').filter(Boolean)\n const summaryParts: string[] = []\n summaryParts.push(`分支:${branch && branch !== 'HEAD' ? branch : '(detached HEAD / 非分支)'}`)\n if (dirtyLines.length) {\n summaryParts.push(`未提交改动 ${dirtyLines.length} 处:${dirtyLines.slice(0, 8).join(';')}${dirtyLines.length > 8 ? '…' : ''}`)\n } else {\n summaryParts.push('工作区干净(无未提交改动)')\n }\n if (recent) {\n summaryParts.push(`近期提交(可能含场外改动):${recent.split('\\n').slice(0, 3).join(';')}`)\n }\n return {\n ok: true, inRepo: true, branch: branch && branch !== 'HEAD' ? branch : null,\n dirty, hasDirty: dirtyLines.length > 0, recentCommits: recent || '',\n summary: `【状态核对】${summaryParts.join('。')}`,\n }\n}\n","/**\n * dsh-plugin-teamflow core — 流水线编排中枢(阶段执行 / 入口 / 取消 / 断点续跑)。\n * 依赖:context/backlog/metering/runner/report + prompts + util/constants/types + store。\n * 【档位阶段集】按 mode(full/medium/lite/tech/patch)经 STAGE_POLICY(constants.ts)\n * 展开实际执行阶段集(resolveStages),再与团队阶段取交集——见 ADR-0004。\n */\nimport { runtime, runs, inFlight, activeProducts, providerName, workspaceScopeOf } from './context.ts'\nimport { initPipelineBacklog, advanceTask, storeFor, parseDefects, syncQaDefects, verifyReqBugs, noteTaskStageUsage, noteTaskAssign, createSubtask, completeSubtask, noteSubtaskUsage, getSubtasks } from './backlog.ts'\nimport { withRetry, runPool } from './runner.ts'\nimport { deliverCompletion } from './report.ts'\nimport { prdPrompt, designPrompt, scaffoldPrompt, techPrompt, architectPrompt, devPrompt, qaPrompt, acceptancePrompt, techChangePrompt, patchConfirmPrompt, qaFixPrompt } from '../prompts/index.ts'\nimport { clip, snippet, normalizeRoot, normalizeTasks, sanitizeSnapOptions, parseAcceptanceVerdict, extractBlueprint, runFolderName } from '../util.ts'\nimport { mkdirSync, writeFileSync, existsSync, readFileSync } from 'node:fs'\nimport { RETRY_LIMIT, QA_REWORK_LIMIT, PHASE_ORDER, PHASE_KEY_BY_NAME, resolveStages, STAGE_TOKEN_BUDGET } from '../constants.ts'\nimport { persistJournal, readJsonAny, journalFile } from '../../store.ts'\nimport type { JournalRecord } from '../../store.ts'\nimport type { Journal, PipelineOptions, ResumeContext } from '../types.ts'\nimport { normalizeMode, runTriage } from './triage.ts'\nimport { loadTeams, findTeam, getActiveStages } from './teams.ts'\nimport { loadState, extractStateBlock, mergeStateBlock, noteRun } from './state.ts'\nimport { runSanityCheck } from './sanity.ts'\n\n/** 从 journal 已完成阶段重建断点续跑产物(prd/design/scaffold/tech/qa/acceptance/dev)。 */\nexport function buildResumeProducts(journal) {\n const products: Record<string, unknown> = {}\n for (const s of journal.stages) {\n if (s.status !== 'done' || !s.output) continue\n const key = PHASE_KEY_BY_NAME[s.phase]\n if (!key) continue\n if (key === 'dev') {\n products.dev = journal.stages\n .filter((x) => x.phase === '开发' && x.status === 'done' && x.output)\n .map((x) => ({ title: x.label.replace(/^开发 · /, ''), failed: false, output: x.output }))\n } else {\n products[key] = s.output\n }\n }\n return products\n}\n\n/**\n * 断点续跑起点:journal 中第一个未完成阶段(磁盘上 interrupted/running 所在阶段)。\n * 全部完成仍被中断(理论极端)→ 从产品验收继续。\n */\nexport function interruptedPhaseOf(journal) {\n const stage = (journal.stages || []).find((s) => s.status !== 'done')\n if (stage && PHASE_ORDER.indexOf(stage.phase) !== -1) return stage.phase\n return '产品验收'\n}\n\n/**\n * 执行流水线。resume = null 全新运行;resume = { phase, products } 从断点续跑:\n * phase 之前的阶段直接复用 products 产物(跳过执行),从 phase 阶段开始重跑。\n */\nexport async function executePipeline(\n journal: Journal, parent: unknown, requirement: string, options: PipelineOptions,\n signal: unknown, resume: ResumeContext | null = null,\n): Promise<void> {\n journal.status = 'running'\n if (!resume) journal.startedAt = Date.now()\n const root = options.productRoot || null\n journal.product = root\n // 工作区(项目)作用域:workspace slug 同时是并发锁与 backlog 的隔离键\n const scopeKey = journal.workspace || root || 'default'\n // 产品级并发限制(防御:正常入口 startPipeline/resumeRun 已预检;按工作区隔离,互不阻塞)\n if (activeProducts.has(scopeKey) && activeProducts.get(scopeKey) !== journal.id) {\n journal.status = 'failed'\n journal.error = `工作区 ${journal.workspacePath || scopeKey} 已有流水线 ${activeProducts.get(scopeKey)} 运行中`\n journal.endedAt = Date.now()\n persistJournal(journal)\n return\n }\n activeProducts.set(scopeKey, journal.id)\n // 自动分诊(对调用方透明):未显式 mode 且非 lite 且非续跑 → 内部先用模型思考一轮再路由。\n // 使用者无需了解/选择 mode;mode 是内部路由 + 可选显式覆盖(审计可见)。\n let triageSlug = ''\n if (options.mode === undefined && !options.lite) {\n try {\n const verdict = await runTriage(requirement, { needDesign: options.needDesign }, parent, signal)\n options.mode = verdict.mode\n if (verdict.needDesign && !options.needDesign) options.needDesign = true\n triageSlug = verdict.slug || ''\n journal.options = Object.assign({}, options) as Record<string, unknown>\n journal.logs.push({ t: Date.now(), level: 'info', message: `自动分诊:${verdict.kind} → ${verdict.mode}(source=${verdict.source})` })\n } catch (e) {\n journal.logs.push({ t: Date.now(), level: 'warn', message: `自动分诊失败,按默认完整流程:${String((e && e.message) || e)}` })\n }\n }\n const tasks = normalizeTasks(options.tasks)\n const maxConcurrency = Number.isFinite(options.maxConcurrency) && options.maxConcurrency > 0 ? Math.min(options.maxConcurrency, 8) : 3\n const timeline: Record<string, unknown> = {}\n // 档位→阶段集(ADR-0004 差异执行的单一事实来源):先按 mode + needDesign/needScaffold 展开,\n // 再与团队阶段列表取交集(团队可进一步裁剪)。取代散落的 if/else 阶段门控。\n const stageSet = resolveStages(options.mode, { needDesign: options.needDesign, needScaffold: options.needScaffold })\n // 团队配置:加载团队的阶段列表,确定哪些阶段跳过(optional + 未启用)\n let activeStageKeys: Set<string> | null = null\n if (options.teamId) {\n const teams = loadTeams(journal.workspace || 'default')\n const team = findTeam(teams, options.teamId)\n if (team) {\n const active = getActiveStages(team, { needDesign: options.needDesign, needScaffold: options.needScaffold })\n activeStageKeys = new Set(active.map((s) => s.key))\n journal.logs.push({ t: Date.now(), level: 'info', message: `团队「${team.name}」:阶段 ${active.map((s) => s.label).join(' → ')}` })\n }\n }\n journal.logs.push({ t: Date.now(), level: 'info', message: `档位阶段集:mode=${options.mode || 'full'} → ${stageSet.join(' → ') || '(空)'}` })\n const enabled = (key: string) => stageSet.indexOf(key as any) !== -1 && (!activeStageKeys || activeStageKeys.has(key))\n // 断点续跑:跳过 resume.phase 之前的阶段\n const resumed = (phase) => !!resume && PHASE_ORDER.indexOf(phase) < PHASE_ORDER.indexOf(resume.phase)\n const logSkip = (phase) => journal.logs.push({ t: Date.now(), level: 'warn', message: `跳过已完成阶段:${phase}(断点续跑)` })\n /** 阶段失败错误:带真实尝试次数/末次结果/累计消耗与熔断语义(取代千篇一律的「重试 N 次后仍无产出」)。 */\n const stageFailError = (label: string, r: { attempts?: number; stageTokens?: number }): Error => {\n const last = [...(journal.stages || [])].reverse().find((s) => s.phase === label)\n const attempts = r && r.attempts ? r.attempts : RETRY_LIMIT\n const burnt = Math.round(((r && r.stageTokens) || 0) / 1000)\n const breaker = ((r && r.stageTokens) || 0) >= STAGE_TOKEN_BUDGET ? ',超出阶段预算熔断' : ''\n const detail = last ? `末次 ${last.outcome || 'unknown'}${last.summary ? `(${last.summary})` : ''}` : '无阶段记录'\n return new Error(`${label} 阶段失败:${attempts} 次尝试未交付,${detail},累计消耗 ${burnt}k token${breaker},需人工介入`)\n }\n try {\n if (resume) {\n journal.logs.push({ t: Date.now(), level: 'info', message: `断点续跑:复用 backlog(req=${journal.reqId}),从「${resume.phase}」继续` })\n } else {\n const init = initPipelineBacklog(journal, requirement, options)\n journal.reqId = init.reqId\n journal.logs.push({ t: Date.now(), level: 'info', message: `backlog 已建立需求 ${init.reqId}(产品 ${root || 'unknown'},并发 ${maxConcurrency})` })\n }\n persistJournal(journal)\n\n // ADR-0008 任务夹:需求级档案单元 docs/teamflow/<yyyyMMdd>-r<N>[-<slug>]/。\n // 夹名在建夹时刻固定并持久化 journal.runDocs——阶段重试/断点续跑一律复用同夹(幂等由结构保证)。\n if (!journal.runDocs && journal.reqId) {\n journal.runDocs = `${'docs/teamflow'}/${runFolderName(new Date(), journal.reqId, triageSlug)}`\n try {\n if (journal.workspacePath) {\n const abs = `${journal.workspacePath}/${journal.runDocs}`\n mkdirSync(abs, { recursive: true })\n writeFileSync(`${abs}/meta.json`, JSON.stringify({\n reqId: journal.reqId, runId: journal.id, title: String(requirement).replace(/\\s+/g, ' ').trim().slice(0, 80),\n mode: options.mode || null, createdAt: Date.now(),\n }, null, 2), 'utf8')\n }\n journal.logs.push({ t: Date.now(), level: 'info', message: `任务夹就绪:${journal.runDocs}/(本需求全部产物收口于此;建后不可变,重试/续跑复用)` })\n } catch (e) {\n journal.logs.push({ t: Date.now(), level: 'warn', message: `任务夹创建失败(不影响流程):${String((e && e.message) || e)}` })\n }\n }\n\n // 预编译 state(跨 run 累积索引):各阶段 prompt 注入 slice;结束后提取/合并 state 块\n const state = loadState(journal.workspace || 'default')\n state.__runCtx = { ...(state.__runCtx || {}) }\n if (journal.runDocs) state.__runCtx.runDocs = journal.runDocs\n // M0 状态核对:核对代码库真实状态(多人/场外提交/非流水线改动),注入后续所有阶段。\n // 核心原则:认知可复用\"减量\",但不替代\"对现状的核对\"。\n try {\n const wsCwd = workspaceScopeOf(parent).path\n const sanity = runSanityCheck(wsCwd)\n state.__runCtx = { ...(state.__runCtx || {}), sanity: sanity.summary }\n journal.sanity = { ok: sanity.ok, branch: sanity.branch, hasDirty: sanity.hasDirty, dirty: sanity.dirty.slice(0, 1000), recentCommits: sanity.recentCommits.slice(0, 1000), summary: sanity.summary }\n if (sanity.hasDirty || !sanity.ok) {\n journal.logs.push({ t: Date.now(), level: 'warn', message: sanity.summary })\n } else {\n journal.logs.push({ t: Date.now(), level: 'info', message: sanity.summary })\n }\n } catch (e) {\n journal.logs.push({ t: Date.now(), level: 'warn', message: '状态核对失败(不影响流程):' + String((e && e.message) || e) })\n }\n const mergeStageState = (phaseKey, output) => {\n const block = extractStateBlock(output)\n if (block) mergeStateBlock(journal.workspace || 'default', block, phaseKey)\n }\n\n /* ── PRD 阶段 ── */\n let prd = null\n if (resumed('PRD 产品需求')) {\n prd = resume.products.prd\n timeline.prd = prd\n logSkip('PRD 产品需求')\n } else {\n journal.logs.push({ t: Date.now(), level: 'phase', message: '进入阶段:PRD 产品需求' })\n const pForm = options.mode === 'tech'\n ? { label: '技术负责人 · 出技术变更单', fn: techChangePrompt }\n : options.mode === 'patch'\n ? { label: '工程师 · 单点确认', fn: patchConfirmPrompt }\n : { label: '产品经理 · 梳理 PRD', fn: prdPrompt }\n const prdR = await withRetry(journal, parent, pForm.label, 'PRD 产品需求', pForm.fn(requirement, root, journal.id, state), signal)\n if (!prdR.text) { throw stageFailError('PRD 产品需求', prdR) }\n prd = prdR.text\n timeline.prd = prd\n mergeStageState('prd', prd)\n noteTaskStageUsage(journal) // PRD 角色的真实 token 累计到任务卡\n if (journal.cancelled) return\n }\n\n /* ── UI/UX 设计阶段(档位阶段集启用;lite+needDesign 也保留,显式要求的 UI 需求不被吞) ── */\n let design = null\n if (enabled('design')) {\n if (resumed('UI/UX 设计')) {\n design = resume.products.design\n timeline.design = design\n logSkip('UI/UX 设计')\n } else {\n journal.logs.push({ t: Date.now(), level: 'phase', message: '进入阶段:UI/UX 设计' })\n const designR = await withRetry(journal, parent, 'UI/UX 设计师 · 设计说明', 'UI/UX 设计', designPrompt(prd, root, journal.id, state), signal)\n if (!designR.text) { throw stageFailError('UI/UX 设计', designR) }\n design = designR.text\n timeline.design = design\n mergeStageState('design', design)\n noteTaskStageUsage(journal)\n if (journal.cancelled) return\n }\n }\n\n /* ── 架构规划阶段(档位阶段集启用:显式 needScaffold 才含,见 STAGE_POLICY) ── */\n let scaffold = null\n if (enabled('scaffold')) {\n if (resumed('架构规划')) {\n scaffold = resume.products.scaffold\n timeline.scaffold = scaffold\n logSkip('架构规划')\n } else {\n journal.logs.push({ t: Date.now(), level: 'phase', message: '进入阶段:架构规划' })\n const scR = await withRetry(journal, parent, '架构师 · 脚手架规划与落地', '架构规划', scaffoldPrompt(requirement, design, root, journal.id, state), signal)\n if (!scR.text) { throw stageFailError('架构规划', scR) }\n scaffold = scR.text\n timeline.scaffold = scaffold\n mergeStageState('scaffold', scaffold)\n noteTaskStageUsage(journal)\n if (journal.cancelled) return\n }\n }\n\n /* ── 技术方案/架构阶段(全模式启用;lite/tech/patch 轻量产架构蓝图,不写文档) ── */\n let tech = null\n if (resumed('技术方案')) {\n tech = resume.products.tech\n timeline.tech = tech\n logSkip('技术方案')\n } else {\n const isHeavy = !options.lite && options.mode !== 'tech' && options.mode !== 'patch'\n journal.logs.push({ t: Date.now(), level: 'phase', message: isHeavy ? '进入阶段:技术方案' : '进入阶段:架构蓝图' })\n const label = isHeavy ? '高级全栈工程师 · 技术方案' : '架构师 · 架构蓝图'\n const prompt = isHeavy\n ? techPrompt(prd, design, scaffold, tasks, root, journal.id, state)\n : architectPrompt(prd, root, journal.id, state)\n const techR = await withRetry(journal, parent, label, '技术方案', prompt, signal)\n if (!techR.text) { throw stageFailError(label, techR) }\n tech = techR.text\n timeline.tech = tech\n mergeStageState('tech', tech)\n // 提取架构蓝图 JSON → 注入后续阶段(dev 继承蓝图)并用于自动拆任务。\n // 优先取 stage 回复输出;模型可能把蓝图写进任务夹 TECHNICAL.md(ADR-0008 收口约定)——回退读文件提取,绝不静默丢蓝图(实锤 r13:蓝图只在文档里,dev 退化为单任务整体开发、M2 拆卡失效)。\n let bd = extractBlueprint(tech)\n if (!bd || bd.summary === undefined) {\n try {\n const techFile = journal.runDocs && journal.workspacePath\n ? `${journal.workspacePath}/${journal.runDocs}/TECHNICAL.md`\n : null\n if (techFile && existsSync(techFile)) bd = extractBlueprint(readFileSync(techFile, 'utf8'))\n if (bd) journal.logs.push({ t: Date.now(), level: 'info', message: '蓝图从任务夹 TECHNICAL.md 提取(模型把蓝图写进了文档而非回复输出)' })\n } catch (e) { /* 回退失败走既有告警 */ }\n }\n if (bd && bd.summary !== undefined) {\n try {\n state.__runCtx = state.__runCtx || {}\n state.__runCtx.blueprint = bd.render\n journal.blueprint = { modules: bd.modules, tasks: bd.tasks }\n } catch (e) { /* 蓝图注入失败不影响 */ }\n } else if (/<!-- blueprint -->/.test(String(tech))) {\n // 蓝图块存在但解析失败:显式告警(否则静默回退整体开发,并行度丢失难排查)\n journal.logs.push({ t: Date.now(), level: 'warn', message: '技术方案蓝图块解析失败(JSON 畸形),开发任务将回退整体开发——TECHNICAL.md 蓝图块需人工检查' })\n }\n noteTaskStageUsage(journal)\n if (journal.cancelled) return\n }\n\n /* ── 开发阶段(并发池;resume 到 QA/验收时复用旧结果) ── */\n let devResults = null\n if (resumed('开发')) {\n devResults = resume.products.dev || []\n timeline.dev = devResults\n logSkip('开发')\n } else {\n journal.logs.push({ t: Date.now(), level: 'phase', message: '进入阶段:开发' })\n // 开发任务来源(按优先级):架构蓝图自动拆 > 调用方显式 tasks > 整体开发兜底。\n // M2「认知前置 + 架构落地」:架构师(tech/architect 阶段)已按文件边界拆好蓝图 tasks,\n // dev 继承蓝图在既有架构上实现;无蓝图时退化为整体开发或调用方 tasks。\n const blueprintTasks = (journal.blueprint && Array.isArray(journal.blueprint.tasks) && journal.blueprint.tasks.length)\n ? journal.blueprint.tasks.map((t) => ({ title: t.title || '开发任务', files: Array.isArray(t.files) ? t.files : [], spec: t.spec || '' }))\n : []\n const devTaskDefs: Array<{ title: string; spec: string; files: string[] }> = blueprintTasks.length\n ? blueprintTasks\n : tasks.length > 0\n ? tasks.map((t) => ({ title: t.title, spec: t.spec, files: [] }))\n : [{ title: '整体开发', spec: '按技术方案/需求实现全部改动', files: [] }]\n // 冲突检测:蓝图任务文件有交集 → 合并(保证并发不写同一文件);无交集才可并行\n const mergedDefs: Array<{ title: string; files: string[]; spec: string }> = []\n for (const t of devTaskDefs) {\n const hit = t.files && t.files.length\n ? mergedDefs.find((m) => m.files.some((f) => t.files.includes(f)))\n : undefined\n if (hit) {\n hit.title = `${hit.title} + ${t.title}`\n hit.spec = `${hit.spec}${t.spec ? `;${t.spec}` : ''}`\n for (const f of (t.files || [])) if (!hit.files.includes(f)) hit.files.push(f)\n } else {\n mergedDefs.push({ title: t.title, files: t.files || [], spec: t.spec || '' })\n }\n }\n journal.logs.push({ t: Date.now(), level: 'info', message: `开发阶段开始,任务数:${mergedDefs.length}(并发 ${maxConcurrency}${blueprintTasks.length ? ',源自架构蓝图自动拆解' : ''})` })\n advanceTask(journal, 'running', null, '开发开始(待办 → 开发中)', { by: 'dev' })\n // 为每个 dev 子任务建一张子卡(并行 agent 各自独立跟踪)\n const subCards = mergedDefs.map((dt) => createSubtask(journal, dt.title, dt.spec))\n devResults = await runPool(mergedDefs, maxConcurrency, async (task, idx) => {\n const sub = subCards[idx]\n if (sub) {\n completeSubtask(journal, sub.id, false, null, null) // 先标记 running(end 由 complete 设)\n const store = storeFor(scopeKey)\n const subLive = store.find('task', sub.id)\n if (subLive) { subLive.status = 'running'; subLive.startedAt = Date.now(); store.persist(); persistJournal(journal) }\n }\n const devR = await withRetry(journal, parent, `开发 · ${task.title}`, '开发', devPrompt(task, tech, prd, root, journal.id, state), signal)\n const ok = !!devR.text\n // 完成子卡:记录状态 + childId + 摘要\n if (sub) {\n completeSubtask(journal, sub.id, !ok, devR.text ? snippet(devR.text, 1000) : null, null)\n // 把对应 stage 的 usage 累计到子卡\n const devStage = journal.stages.filter((s) => s.phase === '开发').pop()\n if (devStage) noteSubtaskUsage(journal, sub.id, devStage)\n }\n return { title: task.title, failed: !ok, output: devR.text || '开发失败(Agent 未产出结果)' }\n })\n timeline.dev = devResults\n // dev 阶段 state 沉淀:汇总各 dev 产出中提取的 state 块\n for (const r of devResults) {\n if (r && r.output) mergeStageState('dev', r.output)\n }\n // 累计全部 dev stage usage 到主卡(汇总)\n noteTaskStageUsage(journal)\n const devStages = journal.stages.filter((s) => s.phase === '开发')\n noteTaskAssign(journal, 'dev', devStages.map((s) => (s.childId || '').slice(0, 8)).filter(Boolean).join(',') || '开发组')\n const failedCount = devResults.filter((r) => r && r.failed).length\n if (failedCount > 0) {\n advanceTask(journal, 'needs-human', null, '开发失败,需人工介入', { by: 'dev' })\n const req = storeFor(scopeKey).find('req', journal.reqId)\n if (req) { req.humanIntervention = true; storeFor(scopeKey).persist() }\n journal.logs.push({ t: Date.now(), level: 'warn', message: `开发完成,失败任务数:${failedCount}(需人工介入)` })\n } else {\n advanceTask(journal, 'testable', null, '开发完成待测试(开发中 → 待测试)', { by: 'dev' })\n journal.logs.push({ t: Date.now(), level: 'info', message: `开发完成,失败任务数:0(任务置为待测试,可指派 QA)` })\n }\n if (journal.cancelled) return\n }\n persistJournal(journal)\n\n /* ── QA 测试阶段(档位阶段集启用:patch 档不含 qa,见 STAGE_POLICY) ── */\n let qa = null\n let qaBlocked = false\n if (!enabled('qa')) {\n // 档位阶段集无 QA(patch)或团队未启用 QA:跳过独立 QA\n journal.logs.push({ t: Date.now(), level: 'info', message: '当前档位阶段集不含独立 QA:跳过(单点修复,开发自测兜底)' })\n qa = '(独立 QA 跳过:当前档位由开发自测兜底)'\n } else if (resumed('QA 测试')) {\n qa = resume.products.qa\n timeline.qa = qa\n logSkip('QA 测试')\n } else {\n journal.logs.push({ t: Date.now(), level: 'phase', message: '进入阶段:QA 测试' })\n advanceTask(journal, 'testing', null, 'QA 开始(待测试 → 测试中)', { by: 'qa' })\n const store = storeFor(scopeKey)\n const qaStageChildren = () => journal.stages.filter((s) => s.phase === 'QA 测试').map((s) => (s.childId || '').slice(0, 8)).filter(Boolean).join(',') || '测试组'\n // QA → 开发修复 → 复验 打回闭环:QA 发现 P0-P2 缺陷则打回开发确认/修复,干净才进验收;超 QA_REWORK_LIMIT 轮需人工。\n let round = 0\n let qaClean = false\n const devFixRounds = []\n const qaDevSummary = () => {\n const src = JSON.stringify(timeline.dev)\n return devFixRounds.length ? `${src}\\n【QA 打回后的修复摘要】\\n${devFixRounds.join('\\n---\\n')}` : src\n }\n let defects = []\n do {\n round += 1\n const isReverify = round > 1\n const label = isReverify ? `QA 复验 · 第${round - 1}轮修复后` : 'QA 测试工程师 · 功能测试'\n const qaR = await withRetry(journal, parent, label, 'QA 测试', qaPrompt(prd, qaDevSummary(), root, journal.id, state), signal)\n if (!qaR.text) { advanceTask(journal, 'needs-human', null, isReverify ? `QA 复验失败(第 ${round - 1} 轮修复后)` : 'QA 失败', { by: 'qa' }); throw stageFailError(isReverify ? 'QA 测试(复验)' : 'QA 测试', qaR) }\n qa = qaR.text\n timeline.qa = qa\n mergeStageState('qa', qa)\n noteTaskStageUsage(journal) // QA 角色的真实 usage 累计\n noteTaskAssign(journal, 'qa', qaStageChildren())\n defects = parseDefects(qa)\n // 登记全部缺陷(含 P3 观察项,幂等)\n syncQaDefects(journal, defects)\n // 阻断判定:只认 P0/P1/P2(P3 观察项非阻断,记卡不循环)\n const blocking = defects.filter((d) => d.severity !== 'P3')\n if (blocking.length === 0) {\n qaClean = true\n journal.logs.push({ t: Date.now(), level: 'info', message: defects.length ? `QA 仅有 P3 观察项 ${defects.map((d) => d.id).join('、')}(非阻断)` : 'QA 未发现阻断缺陷' })\n break\n }\n if (journal.cancelled) return\n if (round > QA_REWORK_LIMIT) {\n // 超过复验轮次上限 → 需人工介入,跳过产品验收(QA 不干净不验收)\n qaBlocked = true\n journal.humanIntervention = true\n journal.logs.push({ t: Date.now(), level: 'error', message: `QA 连续 ${round} 轮(含复验)仍有 ${blocking.length} 个阻断缺陷(${blocking.map((d) => d.id).join('、')}),超出复验上限 ${QA_REWORK_LIMIT},需人工介入` })\n advanceTask(journal, 'needs-human', snippet(qa, 3000), `QA ${round} 轮复验仍有阻断缺陷,超出上限 ${QA_REWORK_LIMIT},需人工介入`, { by: 'qa' })\n const req = store.find('req', journal.reqId)\n if (req) { req.humanIntervention = true; store.pushEvent(req, req.status, 'needs-human', `QA 复验 ${QA_REWORK_LIMIT} 轮仍含阻断缺陷,需人工介入(${blocking.map((d) => d.id).join('、')})`) }\n break\n }\n // 打回开发确认/修复 → 下一轮复验\n journal.logs.push({ t: Date.now(), level: 'warn', message: `QA 发现 ${blocking.length} 个阻断缺陷(第 ${round} 轮),打回开发确认修复后复验` })\n advanceTask(journal, 'rework', snippet(qa, 3000), `QA 打回开发修复(第 ${round}/${QA_REWORK_LIMIT + 1} 轮)`, { by: 'qa' })\n const fixR = await withRetry(journal, parent, `开发 · QA 缺陷修复(第 ${round} 轮)`, '开发', qaFixPrompt(blocking, qa, tech, prd, root, journal.id, state), signal)\n if (!fixR.text) { advanceTask(journal, 'needs-human', null, 'QA 打回后开发修复失败', { by: 'qa' }); throw stageFailError('开发(QA 打回修复)', fixR) }\n devFixRounds.push(snippet(fixR.text, 3000))\n noteTaskStageUsage(journal) // 修复子代理真实 usage 累计到任务卡\n if (journal.cancelled) return\n } while (true)\n if (!qaBlocked && qaClean) {\n verifyReqBugs(journal) // 复验通过 → 关闭全部 open 缺陷\n advanceTask(journal, 'pending-acceptance', snippet(qa, 3000), 'QA 通过(待验收)', { by: 'qa' })\n journal.logs.push({ t: Date.now(), level: 'info', message: round > 1 ? `QA 复验通过(第 ${round - 1} 轮修复后),无阻断缺陷` : 'QA 未发现 P0/P1/P2 阻断缺陷' })\n } else {\n journal.logs.push({ t: Date.now(), level: 'warn', message: 'QA 阶段打回超限结束:产品验收跳过,需求需人工介入' })\n }\n if (journal.cancelled) return\n }\n persistJournal(journal)\n\n /* ── 产品验收阶段(QA 打回未超限才执行;超限时需求已置 needs-human,跳过验收) ── */\n if (!qaBlocked) {\n journal.logs.push({ t: Date.now(), level: 'phase', message: '进入阶段:产品验收' })\n // 单任务模型:验收前任务置「待验收」(patch/无独立 QA 时 task 仍在 testable)\n {\n const curTask = storeFor(scopeKey).find('task', journal.taskId)\n if (curTask && curTask.status !== 'pending-acceptance' && curTask.status !== 'needs-human' && curTask.status !== 'rework') {\n advanceTask(journal, 'pending-acceptance', null, '进入验收(待验收)', { by: 'pm' })\n }\n }\n const accR = await withRetry(journal, parent, '产品经理 · 最终验收', '产品验收', acceptancePrompt(prd, qa, JSON.stringify(timeline.dev), root, journal.id, state), signal)\n if (!accR.text) { advanceTask(journal, 'needs-human', null, '验收失败', { by: 'pm' }); throw stageFailError('产品验收', accR) }\n const acceptance = accR.text\n timeline.acceptance = acceptance\n noteTaskStageUsage(journal) // 验收角色的真实 usage 累计\n const accStage = journal.stages.find((s) => s.phase === '产品验收' && s.childId)\n noteTaskAssign(journal, 'accept', accStage ? String(accStage.childId).slice(0, 8) : '验收组')\n mergeStageState('acceptance', acceptance)\n // 结论解析:见 parseAcceptanceVerdict(只认结论行,避免正文「无需改动」等否定/引用话术误杀整条流水线)\n const accVerdict = parseAcceptanceVerdict(acceptance)\n if (accVerdict === 'reject') {\n // 需求与现状不符(无有效变更)→ 拦截:task needs-human、req needs-human、流水线中断(非 accepted)\n advanceTask(journal, 'needs-human', snippet(acceptance, 3000), '需求与现状不符(无需改动),需人工决定调整或取消需求', { by: 'pm' })\n const store = storeFor(scopeKey)\n const req = store.find('req', journal.reqId)\n if (req) { req.humanIntervention = true; store.pushEvent(req, req.status, 'needs-human', '需求与现状不符,需人工处理(调整或取消)') }\n journal.logs.push({ t: Date.now(), level: 'error', message: '需求与现状不符(无需改动),流水线中断,需人工处理' })\n persistJournal(journal)\n throw new Error('需求与现状不符,无需改动,需人工决定调整或取消需求')\n }\n advanceTask(journal, accVerdict, snippet(acceptance, 3000), accVerdict === 'rework' ? '验收不通过(需返工)' : '验收完成(待验收 → 已验收)', { by: 'pm' })\n const store = storeFor(scopeKey)\n const req = store.find('req', journal.reqId)\n if (req) {\n const openBugs = store.bugs.filter((b) => b.reqId === req.id && b.status !== 'verified' && b.status !== 'closed' && b.severity !== 'P3')\n if (accVerdict === 'rework') {\n req.humanIntervention = true\n journal.humanIntervention = true // 汇报状态线:completed+humanIntervention → ⚠️ 已完成(需人工介入)\n store.pushEvent(req, req.status, 'needs-human', '验收不通过(需返工)')\n } else if (openBugs.length > 0) {\n store.pushEvent(req, req.status, 'pending-acceptance', '存在未关闭缺陷')\n } else {\n verifyReqBugs(journal) // 验收通过 → 关闭遗留 open 缺陷\n store.pushEvent(req, req.status, 'accepted', '验收通过')\n }\n }\n journal.logs.push({ t: Date.now(), level: 'info', message: '流水线全部完成 ✅' })\n journal.status = 'completed'\n } else {\n // QA 打回超限:验收跳过,需求已 needs-human(humanIntervention=true)\n journal.logs.push({ t: Date.now(), level: 'error', message: '产品验收跳过:QA 复验超限,需求已置 needs-human,需人工介入' })\n journal.status = 'completed'\n }\n } catch (e) {\n if (journal.cancelled) {\n journal.status = 'cancelled'\n journal.error = '运行已取消'\n } else {\n journal.status = 'failed'\n journal.error = String((e && e.message) || e)\n }\n } finally {\n journal.endedAt = Date.now()\n inFlight.delete(journal.id)\n activeProducts.delete(scopeKey) // 释放工作区级并发锁\n journal.result = { requirement, options: sanitizeSnapOptions(options), timeline: summarizeTimeline(timeline) }\n persistJournal(journal) // 终态 checkpoint(含日志刷新;阶段全文保留在磁盘+内存,供详情抽屉/断点续跑读取)\n // 孤儿收尾:run 异常/取消时把未到终态的 req/task 落成可见状态(中断不再永远 in-progress;cancelled 保留 resume 入口)\n try {\n const store = storeFor(scopeKey)\n if (journal.status === 'failed') {\n const req = store.find('req', journal.reqId)\n if (req && (req.status === 'in-progress' || req.status === 'created')) {\n req.humanIntervention = true\n store.pushEvent(req, req.status, 'needs-human', `流水线异常退出(${String(journal.error || '').slice(0, 120)}),需人工确认后继续(teamflow_resume)或关闭(backlogUpdate closed)`)\n req.status = 'needs-human'\n }\n const task = journal.taskId ? store.find('task', journal.taskId) : null\n if (task && (task.status === 'running' || task.status === 'pending')) {\n store.pushEvent(task, task.status, 'needs-human', '流水线异常退出(中断),需人工确认')\n task.status = 'needs-human'\n }\n store.persist()\n } else if (journal.status === 'cancelled') {\n const req = store.find('req', journal.reqId)\n if (req && req.status === 'in-progress') store.pushEvent(req, req.status, 'in-progress', '流水线已取消(可 teamflow_resume 续跑,或 backlogUpdate → closed 放弃并关闭)')\n if (req) store.persist()\n }\n } catch (e) { /* 孤儿收尾尽力而为,不影响主收尾 */ }\n // ADR-0008:meta.json 是任务夹「静态标识卡」——reqId/runId/title/mode/createdAt 建夹即定,\n // 不再终态回写(历史:host 回写 status 导致 ①终态永远晚于 agent 提交 → 提交后再脏、②\n // run 误判时 meta 快照过时)。status/endedAt 权威在 runs/<runId>.json(journal),目录\n // 扫描聚合时以 journal 为准,勿从 meta 读动态字段。\n noteRun(journal.workspace || 'default', { id: journal.id, requirement: journal.requirement, verdict: journal.status, runDocs: journal.runDocs })\n deliverCompletion(journal, parent) // 汇总投递回发起会话(主线程)\n console.log(`[teamflow] 运行结束 ${journal.id} → ${journal.status}(工作区 ${scopeKey})`)\n }\n}\n\n/** 结果 timeline 摘要化(内存只留 2k 级摘要,全文在磁盘 journal/backlog)。 */\nexport function summarizeTimeline(timeline) {\n const out = {}\n for (const key of Object.keys(timeline || {})) {\n const val = timeline[key]\n if (Array.isArray(val)) {\n out[key] = val.map((x) => (x && typeof x === 'object'\n ? { title: x.title, failed: !!x.failed, output: clip(x.output || '', 2000) }\n : clip(x, 2000)))\n } else {\n out[key] = clip(val, 2000)\n }\n }\n return out\n}\n\n/** 启动流水线:预检 + 建 journal + 异步 executePipeline(按发起会话的工作区绑 scope)。 */\nexport function startPipeline(agent: unknown, requirement: string, options: PipelineOptions, signal: unknown): string {\n const provider = providerName()\n if (!provider) throw new Error('没有可用的子代理提供者(subagents 注册表为空)')\n const ws = workspaceScopeOf(agent)\n const productKey = ws.projectKey\n const active = activeProducts.get(productKey)\n if (active) throw new Error(`工作区 ${ws.path || ws.projectKey} 已有流水线 ${active} 运行中——请等待完成、取消(teamflow_cancel)或先处理中断(teamflow_resume)`)\n // mode:显式指定 / lite 兼容 / 否则留空 → 由 executePipeline 自动分诊(对调用方透明)\n const mode = normalizeMode(options.mode) ?? (options.lite ? 'lite' : undefined)\n // 发起会话 id:阶段子代理的直接 parent(跨会话跳转子代理时据此判定/兜底)\n const ownerSession = ((agent as { session?: { id?: string } } | null | undefined)?.session?.id) || null\n const journal = {\n id: `tf-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`,\n name: 'teamflow-pipeline', status: 'pending',\n requirement: clip(requirement, 8000),\n workspace: ws.projectKey,\n workspacePath: ws.path,\n ownerSession,\n product: normalizeRoot(options.productRoot),\n options: {\n needDesign: !!options.needDesign,\n needScaffold: !!options.needScaffold,\n lite: !!options.lite,\n mode,\n teamId: options.teamId || undefined,\n tasks: normalizeTasks(options.tasks),\n productRoot: normalizeRoot(options.productRoot),\n maxConcurrency: (Number.isFinite(options.maxConcurrency) && options.maxConcurrency > 0) ? Math.min(options.maxConcurrency, 8) : null,\n },\n startedAt: null, endedAt: null, agentsStarted: 0,\n stages: [], logs: [], result: null, error: null, cancelled: false, humanIntervention: false,\n interrupted: false, interruptedAt: null, supersededBy: null,\n }\n runs.set(journal.id, journal)\n if (runs.size > 30) {\n const firstKey = runs.keys().next().value\n if (firstKey !== undefined) runs.delete(firstKey)\n }\n persistJournal(journal) // 首次 checkpoint(断点续跑基座)\n executePipeline(journal, agent, journal.requirement, journal.options, signal)\n return journal.id\n}\n\n/** 取消运行(置 cancelled + dispose 进行中的子代理)。 */\nexport function cancelRun(runId: string | null | undefined): boolean {\n const j = runs.get(runId)\n if (!j) return false\n j.cancelled = true\n const entry = inFlight.get(runId)\n if (entry && entry.run) { try { entry.run.dispose() } catch (e) { /* ignore */ } }\n persistJournal(j)\n return true\n}\n\n/** 从断点续跑:跳过已完成阶段,从第一个未完成阶段重跑(service 与工具共用)。 */\nexport function resumeRun(runId: string | null | undefined, sessionId: string | null | undefined): { ok: boolean; runId?: string; resumedFrom?: string; error?: string } {\n const id = typeof runId === 'string' ? runId : null\n if (!id) return { ok: false, error: '缺少 runId' }\n // 从磁盘加载完整 journal(内存版已裁剪 output,磁盘保留阶段产物全文)\n let j = null\n try {\n const disk = readJsonAny(journalFile(id), null) as JournalRecord | null\n if (disk && typeof disk === 'object' && disk.id === id) j = disk\n } catch (e) { /* 落到内存版 */ }\n if (!j) j = runs.get(id)\n if (!j) return { ok: false, error: `未找到运行:${id}` }\n if (j.status !== 'interrupted' && j.status !== 'failed' && j.status !== 'cancelled') {\n return { ok: false, error: `只有 interrupted/failed/cancelled 可续跑(当前 ${j.status})` }\n }\n // 全阶段已 done 的 failed/cancelled:没有断点可续(阶段全绿≠run 成功,如「需求与现状不符」拦截单),\n // 续跑只会兜底重跑验收、循环失败——硬拒绝,引导起新流水线(实锤 tf-mt8kxyef-29ruxt)\n if ((j.stages || []).length > 0 && (j.stages || []).every((s) => s.status === 'done')) {\n return { ok: false, error: `所有阶段均已完成,无断点可续(run=${j.status});如需重跑请启动新需求` }\n }\n const productKey = j.workspace || j.product || 'default'\n if (activeProducts.has(productKey) && activeProducts.get(productKey) !== id) {\n return { ok: false, error: `工作区 ${j.workspacePath || productKey} 已有流水线 ${activeProducts.get(productKey)} 运行中` }\n }\n const sid = typeof sessionId === 'string' ? sessionId : null\n const agent = sid && runtime.agents ? runtime.agents.get(sid) : undefined\n if (agent === undefined) return { ok: false, error: `找不到会话对应的 Agent:${sid}` }\n try {\n const resumePhase = interruptedPhaseOf(j)\n const products = buildResumeProducts(j)\n j.status = 'running'\n j.cancelled = false\n j.interrupted = false\n j.interruptedAt = null\n j.error = null\n // 重置历史失败留下的需人工标记(否则完成汇报头会误标「⚠️ 已完成(需人工介入)」,实锤 tf-mt5afdch 续跑)\n j.humanIntervention = false\n // 孤儿收尾回写恢复:上次失败/取消把 req/task 落到 needs-human,续跑时恢复进行中语义\n try {\n const store = storeFor(productKey)\n const req = store.find('req', j.reqId)\n if (req && req.status === 'needs-human' && req.humanIntervention) {\n store.pushEvent(req, req.status, 'in-progress', `断点续跑(从「${resumePhase}」恢复流水线执行)`)\n req.status = 'in-progress'\n req.humanIntervention = false\n }\n const task = j.taskId ? store.find('task', j.taskId) : null\n if (task && task.status === 'needs-human') {\n store.pushEvent(task, task.status, 'running', '断点续跑(恢复流水线执行)')\n task.status = 'running'\n }\n store.persist()\n } catch (e) { /* 恢复尽力而为 */ }\n j.endedAt = null\n j.logs = (j.logs || []).slice(-200)\n j.logs.push({ t: Date.now(), level: 'warn', message: `断点续跑:从「${resumePhase}」继续(已完成阶段复用产物)` })\n j.stages = (j.stages || []).filter((s) => s.status === 'done') // 清理未完成 stage\n runs.set(id, j) // 内存换用磁盘完整版(含 output 全文)\n persistJournal(j)\n executePipeline(j, agent, j.requirement, j.options, undefined, { phase: resumePhase, products })\n return { ok: true, runId: id, resumedFrom: resumePhase }\n } catch (e) {\n return { ok: false, error: String((e && e.message) || e) }\n }\n}\n","/**\n * dsh-plugin-teamflow — host half(阶段 3:TypertRemoteService 版本)。\n *\n * TeamFlow 团队研发流水线宿主数据层:\n * - backlog 持久化到 $DSH_HOME/teamflow/<product>/backlog/{requirements,tasks,bugs}.json\n * - 状态机 + 事件日志 + 打回阈值 + 并发池 + QA 缺陷登记 + token 计量\n * - 以 Cordis service `teamflow` 提供 7 个 Remote 方法(client 经 ctx.remote.teamflow.* 调用),\n * strict descriptors 由 ctx.typert.register 注册(免 @Remote 装饰器)\n * - 注册 teamflow_* 模型工具(供 Agent 调用)\n *\n * 运行环境:宿主组合(web profile)的真实 Node 进程。\n */\nimport { TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol'\nimport { createUserMessage } from '@deepseek-ai/dsh-llm'\nimport { parameterSchemaSpecToJsonSchema } from '@deepseek-ai/dsh-tools'\nimport { TEAMFLOW_DESCRIPTORS } from '../descriptors.ts'\nimport {\n dshHome, teamflowRoot, productDir, fileFor,\n readJson, readJsonAny, writeJson, persistJournal, loadJournals, journalFile,\n} from '../store.ts'\nimport type { JournalRecord, JournalStage } from '../store.ts'\nimport type {\n Journal, BacklogItem, PipelineOptions, ResumeContext, SubagentRunLike, ParentAgentLike, UsageBuckets,\n} from './types.ts'\nimport { RETRY_LIMIT, STAGE_TOKEN_BUDGET, STATUS, PHASE_ORDER, PHASE_KEY_OF, PHASE_KEY_BY_NAME } from './constants.ts'\nimport { toText, clip, extractText, normalizeRoot, normalizeTasks, sanitizeSnapOptions, normalizeSignal, hasSubstance, isUnretryable, handoffBrief } from './util.ts'\nimport { prdPrompt, designPrompt, scaffoldPrompt, techPrompt, devPrompt, qaPrompt, acceptancePrompt } from './prompts/index.ts'\nimport { runtime, runs, inFlight, activeProducts, providerName, setRuntime, workspaceScopeOf } from './core/context.ts'\nimport { backlogSummary, transitionBacklog, assignTask, storeFor } from './core/backlog.ts'\nimport { loadTeams, findTeam, type TeamConfig } from './core/teams.ts'\nimport { runPool, runAgent, withRetry } from './core/runner.ts'\nimport { deliverCompletion } from './core/report.ts'\nimport { executePipeline, summarizeTimeline, startPipeline, cancelRun, resumeRun } from './core/pipeline.ts'\nimport { suggestMode, MODE_REGISTRY, PIPELINE_MODES, normalizeMode, runTriage } from './core/triage.ts'\n\n/* BacklogStore / storeFor 见 core/backlog.ts(数据层与状态机)。 */\n\n/* 阶段/模板提示词见 prompts/(AGENTS_TEMPLATE / MEMORY_TEMPLATE / productCtx / TOKEN_HYGIENE / *Prompt)。 */\n\n/* 阶段提示词 prd/design/scaffold/tech/dev/qa/acceptancePrompt 见 prompts/。 */\n\n/* 并发池/单阶段执行/重试熔断见 core/runner.ts(runPool/runAgent/withRetry)。 */\n\n/* 缺陷解析 / 立项建卡 / 任务流转见 core/backlog.ts(parseDefects / initPipelineBacklog / advanceTask)。 */\n\n/** 阶段顺序/key 映射见 constants.ts(PHASE_ORDER/PHASE_KEY_OF/PHASE_KEY_BY_NAME)。 */\n\n/* 流水线编排/入口/取消/续跑与 resume 辅助见 core/pipeline.ts(buildResumeProducts/interruptedPhaseOf/executePipeline/summarizeTimeline)。 */\n\n/* 流水线入口/取消/断点续跑见 core/pipeline.ts(startPipeline/cancelRun/resumeRun)。 */\n\n/** 按工作区作用域过滤运行(sessionId 推导出 workspace slug;未落 workspace 的旧运行只见于 default)。 */\nfunction runsFor(ws: string | null | undefined) {\n const arr = []\n for (const j of runs.values()) {\n if (ws) {\n const jws = j.workspace || (ws === 'default' ? 'default' : null)\n if (jws !== ws) continue\n }\n arr.push(j)\n }\n arr.sort((a, b) => (b.startedAt || 0) - (a.startedAt || 0))\n return arr\n}\n\n/** 由 sessionId 推导会话所属 workspace(项目)作用域。 */\nfunction sessionScope(sessionId: string | null | undefined) {\n const sid = typeof sessionId === 'string' && sessionId ? sessionId : null\n const agent = sid && runtime.agents ? runtime.agents.get(sid) : undefined\n return workspaceScopeOf(agent || undefined)\n}\n\nfunction snapshotOf(j) {\n return {\n id: j.id, name: j.name, status: j.status, startedAt: j.startedAt, endedAt: j.endedAt,\n requirement: clip(j.requirement, 2000), options: sanitizeSnapOptions(j.options), agentsStarted: j.agentsStarted,\n humanIntervention: j.humanIntervention === true,\n stages: j.stages.map((s) => ({ seq: s.seq, label: s.label, phase: s.phase, status: s.status, outcome: s.outcome, childId: s.childId, startedAt: s.startedAt, endedAt: s.endedAt, usage: s.usage, summary: clip(s.summary || '', 3000) })),\n logs: j.logs.slice(-200).map((l) => ({ t: l.t, level: l.level, message: clip(l.message, 500) })),\n error: j.error, resultPreview: j.result ? clip(JSON.stringify(j.result), 6000) : null,\n }\n}\n\n/* backlog 视图/流转见 core/backlog.ts(backlogSummary/transitionBacklog)。 */\n\n/* ── 模型工具注册 ─────────────────────────────────────────────────── */\nconst simple = { type: 'object', additionalProperties: true }\nconst simpleRender = (args, value) => [{ type: 'text', text: JSON.stringify(value, null, 2).slice(0, 4000) }]\n\nfunction registerTools(ctx) {\n // ctx.tools.register() 把 parameters 原样送到 wire:必须先编译成\n // { type: 'object', properties, required } 完整 JSON Schema,否则提供方\n // 以「schema 缺 type: object」拒绝(如 teamflow_backlog invalid_request_error)。\n const T = (tool) => ctx.tools.register({\n ...tool,\n parameters: parameterSchemaSpecToJsonSchema(tool.parameters),\n })\n\n T({\n name: 'teamflow_start',\n description: 'Start the team R&D pipeline (background async): runs the stages per team config (PRD→design→tech→dev→QA→acceptance). Specify teamId (matches teams.json) or pick a team via the UI \"+\" button first so messages auto-match. Stage failures auto-retry; beyond threshold → rework/human intervention; per-stage token usage recorded. NOTE: after calling, the implementation work is done by pipeline subagents — the main thread MUST NOT write code or run verifications for it. requirement must be a faithful transcription of the user\\'s words; do not invent file paths / tech claims without code verification (downstream stages build the PRD from it).',\n parameters: {\n requirement: { type: 'string', required: true, description: 'The user requirement — faithful transcription of the user\\'s words; no fabricated file paths, tech designs, or unverified claims' },\n teamId: { type: 'string', description: 'Team id (matches teams.json; defaults to the currently selected team of this session)' },\n needDesign: { type: 'boolean', description: 'Set true when the change involves UI' },\n needScaffold: { type: 'boolean', description: 'Set true when the project does not exist yet' },\n lite: { type: 'boolean', description: 'Lightweight mode for small changes (recommended): still runs the lightweight architecture stage (blueprint for dev, no full TECHNICAL.md), then dev → QA → acceptance; if needDesign=true the UI/UX design stage stays (saves tokens/time, traceability preserved)' },\n mode: { type: 'string', description: 'Route mode: full / medium / lite / tech / patch (auto-triage by default; use teamflow_triage to preview)' },\n productRoot: { type: 'string', description: 'Product line directory (e.g. products/tetris)' },\n maxConcurrency: { type: 'integer', description: 'Dev task concurrency (default 3, max 8)' },\n tasks: {\n type: 'array',\n description: 'Optional splittable dev task list',\n items: {\n type: 'object', additionalProperties: false,\n properties: {\n title: { type: 'string', required: true, description: 'Task title' },\n spec: { type: 'string', description: 'Task description & acceptance points' },\n },\n },\n },\n },\n output: {\n schema: { type: 'object', additionalProperties: false, required: ['runId', 'status'], properties: { runId: { type: 'string' }, status: { type: 'string' } } },\n render: (args, value) => [{ type: 'text', text: `团队研发流水线已启动(runId=${value.runId},${value.status}),正在后台执行。【重要】你现在停手:不要自行读取/修改代码实现该需求,不要重复跑测试验证——实现、QA、汇报由流水线各阶段完成。你只需告知用户流水线已启动,等待流水线完成后的官方完成汇报,再向用户转述结果。可用 teamflow_status 查询进度/阶段 token;backlog 已持久化到 $DSH_HOME/teamflow。` }],\n },\n async execute(args, exec) {\n const parent = exec && exec.agent\n if (!parent) throw new Error('teamflow_start 需要由会话内的 Agent 调用')\n // 暂停检查:会话级暂停时拒绝启动\n const sessionId = parent.session && parent.session.id\n if (sessionId && pausedSessions.has(String(sessionId))) {\n return { runId: null, status: 'paused', message: '当前会话已暂停 teamflow。如需恢复,调用 teamflow_resume_session;或直接写代码。' }\n }\n // 团队检查:必须先通过 UI \"+\" 按钮选择团队,否则拒绝\n const teamId = (args && typeof args.teamId === 'string' && args.teamId.trim())\n || (sessionId && activeTeams.get(String(sessionId)))\n || null\n if (!teamId) {\n return { runId: null, status: 'no-team', message: '请先通过输入框旁的 🏭 按钮选择团队,再发送需求消息。未选团队时不走 teamflow。' }\n }\n try {\n const requirement = typeof args.requirement === 'string' && args.requirement.trim() ? args.requirement.trim() : '(未提供需求)'\n const options = {\n needDesign: !!args.needDesign,\n needScaffold: !!args.needScaffold,\n lite: !!args.lite,\n mode: normalizeMode(args.mode) || undefined,\n teamId,\n tasks: normalizeTasks(args.tasks),\n productRoot: normalizeRoot(args.productRoot),\n maxConcurrency: args.maxConcurrency,\n }\n const runId = startPipeline(parent, requirement, options, exec && exec.signal)\n return { runId, status: 'running' }\n } catch (e) {\n throw new Error(`启动流水线失败:${String((e && e.message) || e)}`)\n }\n },\n })\n\n T({\n name: 'teamflow_triage',\n description: 'Requirement triage (optional helper): teamflow_start already auto-triages by default — no need to call this manually. Use it only when you want to **pre-evaluate** which pipeline mode a requirement fits, or **force** a mode: a triage analyst Agent thinks one round and returns a suggested mode, nature, UI-need, complexity and rationale.',\n parameters: {\n requirement: { type: 'string', required: true, description: 'The user raw requirement' },\n needDesign: { type: 'boolean', description: 'Set true when the change involves UI' },\n },\n output: { schema: { type: 'object', additionalProperties: true }, render: simpleRender },\n async execute(args, exec) {\n const requirement = typeof args.requirement === 'string' ? args.requirement : ''\n const t = await runTriage(requirement, { needDesign: !!args.needDesign }, exec && exec.agent, exec && exec.signal)\n return {\n suggestedMode: t.mode,\n kind: t.kind,\n needDesign: t.needDesign,\n complexity: t.complexity,\n confidence: t.confidence,\n rationale: t.rationale,\n source: t.source,\n stages: MODE_REGISTRY[t.mode].desc,\n allModes: PIPELINE_MODES,\n }\n },\n })\n\n T({\n name: 'teamflow_status',\n description: 'Query the team R&D pipeline status. With runId: full progress of that run (stages / per-agent status & tokens / logs / result / human-intervention). Without runId: recent runs of the current workspace.',\n parameters: { runId: { type: 'string', description: 'Pipeline run id (optional)' } },\n output: { schema: { type: 'object', additionalProperties: true }, render: simpleRender },\n async execute(args, exec) {\n const id = args && typeof args.runId === 'string' ? args.runId : null\n if (id) {\n const j = runs.get(id)\n if (!j) return { error: `未找到运行:${id}` }\n const running = j.status === 'running'\n return { runId: j.id, status: j.status, workspace: j.workspace || null, reminder: running ? '流水线仍在后台执行:不要自行改代码实现该需求或重复跑验证,等待完成汇报。' : null, snapshot: snapshotOf(j) }\n }\n const sc = workspaceScopeOf(exec && exec.agent)\n const arr = runsFor(sc.projectKey).slice(0, 10).map((j) => ({ id: j.id, status: j.status, startedAt: j.startedAt, endedAt: j.endedAt, agentsStarted: j.agentsStarted, stageCount: j.stages.length, incompleteStages: (j.stages || []).some((x) => x.status !== 'done'), requirement: clip(j.requirement, 60) }))\n return { runs: arr, workspace: sc }\n },\n })\n\n T({\n name: 'teamflow_backlog',\n description: 'Read the team backlog: for the given product line (default = current session workspace/root) shows requirements/tasks/defects with their state machines. Single-task model: one requirement = one rotating task card (待办→开发中→待测试→测试中→待验收→已验收|打回|需人工); the task card carries devAssign/qaAssign and real token usage. Defects: 待认领→处理中→已修复待验→已关闭. Returns persistence (mode=fs/durable=true with real disk paths).',\n parameters: { product: { type: 'string', description: 'Product line directory (e.g. products/tetris); default = current session workspace' } },\n output: { schema: { type: 'object', additionalProperties: true }, render: simpleRender },\n async execute(args, exec) {\n const product = args && typeof args.product === 'string' && args.product.trim() ? normalizeRoot(args.product) : workspaceScopeOf(exec && exec.agent).projectKey\n return backlogSummary(product)\n },\n })\n\n T({\n name: 'teamflow_claim',\n description: 'Claim a backlog task or defect (status only, no assign): task role=dev (待办→开发中) / role=qa (待测试→测试中); bug (待认领→处理中); req (→进行中). Set the assignee separately via teamflow_assign.',\n parameters: {\n kind: { type: 'string', required: true, description: 'req | task | bug' },\n id: { type: 'string', required: true, description: 'Record id (e.g. task-3 / bug-1)' },\n role: { type: 'string', description: 'Task claim role: dev (default, 待办→开发中) | qa (待测试→测试中)' },\n product: { type: 'string', description: 'Product line directory (default = current session workspace)' },\n },\n output: { schema: simple, render: simpleRender },\n async execute(args, exec) {\n const kind = String((args && args.kind) || '')\n const id = String((args && args.id) || '')\n if (!kind || !id) return { ok: false, error: '缺少 kind/id' }\n const role = args && typeof args.role === 'string' ? String(args.role) : (kind === 'task' ? 'dev' : null)\n const product = args && typeof args.product === 'string' && args.product.trim() ? normalizeRoot(args.product) : workspaceScopeOf(exec && exec.agent).projectKey\n let to = 'running'\n if (kind === 'bug') to = 'claimed'\n else if (kind === 'req') to = 'in-progress'\n else if (kind === 'task') to = role === 'qa' ? 'testing' : 'running'\n return transitionBacklog(product, kind, id, to, kind === 'bug' ? 'QA 缺陷认领' : '开发/QA 认领')\n },\n })\n\n T({\n name: 'teamflow_update',\n description: 'Manually advance a backlog record\\'s status (status only, no assign): task→accepted/rework/running/testing/testable/pending-acceptance; bug→claimed/fixed/verified/reopened/needs-human; req→accepted/closed/needs-human. When resolving needs-human, pick a legal terminal state (e.g. accepted/verified/closed) to clear the flag. Set the assignee separately via teamflow_assign.',\n parameters: {\n kind: { type: 'string', required: true, description: 'req | task | bug' },\n id: { type: 'string', required: true, description: 'Record id' },\n to: { type: 'string', required: true, description: 'Target status' },\n product: { type: 'string', description: 'Product line directory' },\n reason: { type: 'string', description: 'Change reason' },\n },\n output: { schema: simple, render: simpleRender },\n execute: async (args, exec) => {\n const product = args && typeof args.product === 'string' && args.product.trim() ? normalizeRoot(args.product) : workspaceScopeOf(exec && exec.agent).projectKey\n return transitionBacklog(product, String(args.kind || ''), String(args.id || ''), String(args.to || ''), args.reason ? String(args.reason) : '人工流转')\n },\n })\n\n T({\n name: 'teamflow_assign',\n description: 'Assign a backlog task to a role (writes devAssign/qaAssign/acceptBy only; no status impact, no state-machine interference). role=dev → devAssign (who develops), role=qa → qaAssign (who tests), role=accept → acceptBy (who accepts). Callable anytime, independent of current state.',\n parameters: {\n kind: { type: 'string', required: true, description: 'req | task | bug' },\n id: { type: 'string', required: true, description: 'Record id (e.g. task-1)' },\n role: { type: 'string', required: true, description: 'Assign role: dev | qa | accept' },\n assignee: { type: 'string', required: true, description: 'Assignee id (subagent id / person name)' },\n product: { type: 'string', description: 'Product line directory' },\n },\n output: { schema: simple, render: simpleRender },\n execute: async (args, exec) => {\n const product = args && typeof args.product === 'string' && args.product.trim() ? normalizeRoot(args.product) : workspaceScopeOf(exec && exec.agent).projectKey\n return assignTask(product, String(args.kind || ''), String(args.id || ''), String(args.role || ''), String(args.assignee || ''))\n },\n })\n\n T({\n name: 'teamflow_pause',\n description: 'Pause teamflow triggering for the CURRENT session: after calling, teamflow_start returns a hint instead of launching. For user phrases like「别走 teamflow 了」「直接改」「暂停 teamflow」. Session-scoped; auto-resets on new session.',\n parameters: {},\n output: { schema: { type: 'object', additionalProperties: false, properties: { ok: { type: 'boolean' }, message: { type: 'string' } } }, render: (args, value) => [{ type: 'text', text: value.message || (value.ok ? '已暂停 teamflow,当前会话不会启动流水线。' : '暂停失败') }] },\n async execute(args, exec) {\n const sessionId = exec && exec.agent && exec.agent.session && exec.agent.session.id\n if (!sessionId) return { ok: false, message: '无法获取当前会话 ID' }\n pausedSessions.add(String(sessionId))\n return { ok: true, message: `已暂停 teamflow(会话 ${String(sessionId).slice(-6)})。如需恢复,调用 teamflow_resume_session。` }\n },\n })\n\n T({\n name: 'teamflow_resume_session',\n description: 'Resume teamflow triggering for the CURRENT session (undo teamflow_pause). For user phrases like「恢复 teamflow」「可以走 teamflow 了」.',\n parameters: {},\n output: { schema: { type: 'object', additionalProperties: false, properties: { ok: { type: 'boolean' }, message: { type: 'string' } } }, render: (args, value) => [{ type: 'text', text: value.message || (value.ok ? '已恢复 teamflow,开发需求可走流水线。' : '恢复失败') }] },\n async execute(args, exec) {\n const sessionId = exec && exec.agent && exec.agent.session && exec.agent.session.id\n if (!sessionId) return { ok: false, message: '无法获取当前会话 ID' }\n pausedSessions.delete(String(sessionId))\n return { ok: true, message: `已恢复 teamflow(会话 ${String(sessionId).slice(-6)})。开发需求可走流水线。` }\n },\n })\n\n T({\n name: 'teamflow_cancel',\n description: 'Cancel a running team R&D pipeline.',\n parameters: { runId: { type: 'string', required: true, description: 'Pipeline run id' } },\n output: { schema: { type: 'object', additionalProperties: false, properties: { ok: { type: 'boolean' } } }, render: (args, value) => [{ type: 'text', text: value.ok ? `已请求取消流水线 ${args.runId}` : '取消失败' }] },\n async execute(args) {\n const id = args && typeof args.runId === 'string' ? args.runId : null\n return { ok: id ? cancelRun(id) : false }\n },\n })\n\n T({\n name: 'teamflow_resume',\n description: 'Resume an interrupted/failed/cancelled pipeline from its checkpoint: skip completed stages (reuse artifacts), rerun from the first incomplete stage. For interrupted runs found after process restart, or stage-failure retries.',\n parameters: {\n runId: { type: 'string', required: true, description: 'Pipeline run id' },\n },\n output: { schema: { type: 'object', additionalProperties: false, required: ['ok'], properties: { ok: { type: 'boolean' }, runId: { type: 'string' }, resumedFrom: { type: 'string' }, error: { type: 'string' } } }, render: (args, value) => [{ type: 'text', text: value.ok ? `流水线 ${value.runId} 已从断点「${value.resumedFrom}」续跑` : `续跑失败:${value.error || '未知错误'}` }] },\n async execute(args, exec) {\n const parent = exec && exec.agent\n if (!parent) throw new Error('teamflow_resume 需要由会话内的 Agent 调用')\n const id = args && typeof args.runId === 'string' ? args.runId : null\n return resumeRun(id, parent.session.id)\n },\n })\n}\n\n/* ── Teamflow Service(宿主 Cordis service + Remote 方法)────────── */\n/** 会话级暂停标记:pausedSessions.has(sessionId) → 该会话的 teamflow_start 被拦截。 */\nconst pausedSessions = new Set<string>()\n/** 会话级当前团队:activeTeams.get(sessionId) → 当前选中的团队 id。 */\nconst activeTeams = new Map<string, string>()\n/** 延迟注入队列:选团队时 agent 可能尚未加载,存入 pending,后续时机补发。 */\nconst pendingInjections = new Map<string, { teamName: string; teamIcon: string; teamId: string }>()\n\n/** 尝试补发延迟注入:agent 可用时注入上下文并清除 pending。 */\n/** 会话注入的 TeamFlow 契约文案(单一事实来源):何时走流水线 + 启动后主线程必须停手等汇报。 */\nfunction teamflowContextText(teamIcon: string, teamName: string, teamId: string): string {\n return `[TeamFlow 上下文] 用户已选择「${teamIcon} ${teamName}」团队。只有收到明确的开发需求(新功能/迭代/重构/bug修复/代码改动请求)时才调用 teamflow_start 并指定 teamId=\"${teamId}\",requirement 参数忠实转写用户原话即可(不要自行扩写、不要臆造文件路径或技术细节)。收到反馈、讨论、闲聊、UI 意见等非开发请求时,不要调用 teamflow_start,直接正常回复。调用 teamflow_start 之后:流水线在后台执行,你不要再自行读取/修改代码实现该需求,也不要重复跑测试验证——只需告知用户流水线已启动,等待流水线的完成汇报后再答复用户。`\n}\n\nfunction tryFlushPendingInjections(sessionId: string): void {\n const pending = pendingInjections.get(sessionId)\n if (!pending) return\n const agent = runtime.agents ? runtime.agents.get(sessionId) : undefined\n if (!agent || typeof agent.inject !== 'function') return\n try {\n agent.inject({\n type: 'user',\n content: [{ type: 'text', text: teamflowContextText(pending.teamIcon, pending.teamName, pending.teamId) }],\n source: { kind: 'plugin', plugin: 'dsh-plugin-teamflow', form: 'context' },\n })\n pendingInjections.delete(sessionId)\n } catch (e) { /* inject 失败静默 */ }\n}\n\nexport class TeamflowService extends TypertRemoteService {\n static inject = ['agents', 'subagents', 'tokenMeter', 'typert', 'tools']\n\n constructor(ctx) {\n super(ctx, 'teamflow')\n setRuntime(ctx.get('agents'), ctx.get('subagents'), ctx.get('tokenMeter'), ctx.get('workspaceRegistry'), ctx.get('agentDefaultModel'))\n // 断点续跑基座:加载磁盘 journal;running/pending 残留 → 标记 interrupted\n let interruptedCount = 0\n try {\n for (const { journal, wasInterrupted } of loadJournals()) {\n runs.set(journal.id, journal)\n if (wasInterrupted) interruptedCount++\n }\n } catch (e) {\n console.error('[teamflow] 启动加载 journal 失败', e?.message)\n }\n // 团队选择已通过 UI \"+\" 按钮驱动,不再需要 prompt 注入引导模型\n ctx.typert.register({\n package: 'dsh-plugin-teamflow',\n face: 'host',\n schemas: [],\n model: { services: [], events: [], objects: [] },\n invocations: TEAMFLOW_DESCRIPTORS,\n })\n registerTools(ctx)\n console.log(\n `[teamflow] host 就绪:backlog 根 ${teamflowRoot()},Remote ${TEAMFLOW_DESCRIPTORS.length} 个,`\n + `工具 8 个${interruptedCount > 0 ? `,⚠ 发现 ${interruptedCount} 条中断的流水线(可用 teamflow_resume 从断点重跑)` : ''}`,\n )\n }\n\n /* ── Remote 方法(client 经 ctx.remote.teamflow.* 调用) ─────────── */\n\n ping() {\n return { ok: true }\n }\n\n /** 工作区级看板:只返回当前会话 workspace(项目)下启动的流水线,不同 workspace 互不可见。 */\n list(sessionId) {\n const sc = sessionScope(sessionId)\n const arr = runsFor(sc.projectKey)\n return {\n runs: arr.slice(0, 30).map((j) => ({ id: j.id, status: j.status, startedAt: j.startedAt, endedAt: j.endedAt, agentsStarted: j.agentsStarted, stageCount: j.stages.length, incompleteStages: (j.stages || []).some((x) => x.status !== 'done'), requirement: clip(j.requirement, 60) })),\n workspace: sc,\n }\n }\n\n snapshot(runId, sessionId) {\n const sc = sessionScope(sessionId)\n if (runId && typeof runId === 'string') {\n const j = runs.get(runId)\n if (!j) return null\n // 跨 workspace 的 run 不可见(除无工作区会话的 default 兜底)\n if (j.workspace && sc.projectKey && j.workspace !== sc.projectKey && sc.projectKey !== 'default') return null\n return snapshotOf(j)\n }\n const latest = runsFor(sc.projectKey)[0]\n if (!latest) return null\n const j = runs.get(latest.id)\n return j ? snapshotOf(j) : null\n }\n\n /** 阶段详情:卡片点击查看 —— 状态/耗时/官方 usage + 产物全文(超 24k 截断)。 */\n stageDetail(runId, seq, sessionId) {\n if (typeof runId !== 'string' || !runId || seq === undefined || seq === null) return null\n const sc = sessionScope(sessionId)\n const j = runs.get(runId)\n if (!j) return null\n // 跨 workspace 的 run 不可见(同 snapshot 守卫)\n if (j.workspace && sc.projectKey && j.workspace !== sc.projectKey && sc.projectKey !== 'default') return null\n const s = (j.stages || []).find((st) => Number(st.seq) === Number(seq))\n if (!s) return null\n return {\n seq: s.seq, label: s.label, phase: s.phase, status: s.status, outcome: s.outcome,\n childId: s.childId || null, startedAt: s.startedAt, endedAt: s.endedAt,\n ownerSession: j.ownerSession || null,\n usage: s.usage || null,\n summary: clip(s.summary || '', 3000),\n output: clip(toText(s.output) || toText(s.handoff) || '', 24000),\n }\n }\n\n /** Backlog 条目详情:卡片点击查看 —— 完整字段 + 流转时间线 + 关联(子卡/缺陷)+ 任务夹路径。 */\n itemDetail(kind, id, sessionId) {\n const k = typeof kind === 'string' && ['req', 'task', 'bug'].indexOf(kind) !== -1 ? kind : null\n if (!k || typeof id !== 'string' || !id) return null\n const sc = sessionScope(sessionId)\n const store = storeFor(sc.projectKey)\n const item = store.find(k, id)\n if (!item) return null\n const reqId = k === 'req' ? item.id : (item.reqId || null)\n // 任务夹路径(ADR-0008)+ 关联 run 信息(req 需求原文在这):匹配该需求的 journal\n let runDocs: string | null = null\n let runInfo: { runId: string; status: string; requirement: string; startedAt: number | null; endedAt: number | null } | null = null\n for (const j of runsFor(sc.projectKey)) {\n if (j.reqId !== reqId) continue\n if (j.runDocs && !runDocs) runDocs = j.runDocs\n if (!runInfo) runInfo = { runId: j.id, status: j.status, requirement: String(j.requirement || ''), startedAt: j.startedAt || null, endedAt: j.endedAt || null }\n }\n const byRole = item.byRole || null\n let subtasks: Array<{ id: string; title: string; status: string; summary: string; devAssign: string | null; usage: unknown; failed: boolean }> = []\n let bugs: Array<{ id: string; title: string; status: string; severity: string | null }> = []\n if (k === 'task') {\n for (const sid of (item.subtaskIds || [])) {\n const s = store.find('task', sid)\n if (s) subtasks.push({ id: s.id, title: String(s.title || s.id), status: s.status, summary: String(s.summary || ''), devAssign: s.devAssign || null, usage: s.usage || null, failed: !!s.failed })\n }\n for (const bid of (item.bugIds || [])) {\n const b = store.find('bug', bid)\n if (b) bugs.push({ id: b.id, title: String(b.title || b.id), status: b.status, severity: b.severity || null })\n }\n } else if (k === 'req') {\n for (const tid of (item.taskIds || [])) {\n const t = store.find('task', tid)\n if (t && t.type !== 'subtask') subtasks.push({ id: t.id, title: String(t.title || t.id), status: t.status, summary: String(t.summary || ''), devAssign: t.devAssign || null, usage: t.usage || null, failed: !!t.failed })\n }\n for (const bid of (item.bugIds || [])) {\n const b = store.find('bug', bid)\n if (b) bugs.push({ id: b.id, title: String(b.title || b.id), status: b.status, severity: b.severity || null })\n }\n }\n return {\n kind: k, id: item.id, title: String(item.title || item.id),\n status: item.status, spec: String(item.spec || ''),\n summary: String(item.summary || ''),\n severity: item.severity || null, owner: item.owner || null,\n devAssign: item.devAssign || null, qaAssign: item.qaAssign || null,\n assignBy: item.acceptBy || null, retries: item.retries !== undefined ? item.retries : 0,\n humanIntervention: !!item.humanIntervention,\n createdAt: item.createdAt || null, updatedAt: item.updatedAt || null,\n events: (item.events || []).slice(-30),\n usage: k === 'task' ? (item.usage || null) : null,\n byRole: k === 'task' ? byRole : null,\n reqId: reqId || null,\n runDocs,\n runInfo,\n subtasks, bugs,\n }\n }\n\n start(sessionId, requirement, options) {\n const sid = typeof sessionId === 'string' ? sessionId : null\n const req = typeof requirement === 'string' && requirement.trim() ? requirement.trim() : null\n if (!sid || !req) return { ok: false, error: '缺少 sessionId 或需求描述' }\n const agent = runtime.agents && runtime.agents.get(sid)\n if (agent === undefined) return { ok: false, error: `找不到会话对应的 Agent:${sid}` }\n // 补发延迟注入(选团队时 agent 可能尚未加载)\n tryFlushPendingInjections(sid)\n try {\n const opts = (options && typeof options === 'object') ? options : {}\n const runId = startPipeline(agent, req, opts, undefined)\n const sc = workspaceScopeOf(agent)\n return { ok: true, runId, workspace: sc, product: opts.productRoot ? normalizeRoot(opts.productRoot) : null }\n } catch (e) {\n return { ok: false, error: String((e && e.message) || e) }\n }\n }\n\n cancel(runId) {\n const id = typeof runId === 'string' ? runId : null\n if (!id) return { ok: false, error: '缺少 runId' }\n return { ok: cancelRun(id) }\n }\n\n /** 工作区级 backlog 视图(自动按当前会话 workspace 隔离)。 */\n backlog(sessionId) {\n const sc = sessionScope(sessionId)\n const sum = backlogSummary(sc.projectKey)\n // 卡片跳流水线:req/task 附带该需求的最近一次 runId(无 run 的历史卡片为 null,不显示跳转)\n const js = runsFor(sc.projectKey)\n const runOf = (reqId: string | null | undefined) => {\n if (!reqId) return null\n let last: JournalRecord | null = null\n for (const j of js) if (j.reqId === reqId) last = j\n return last ? last.id : null\n }\n for (const r of sum.requirements) (r as { runId?: string | null }).runId = runOf(r.id)\n for (const t of sum.tasks) (t as { runId?: string | null }).runId = runOf(t.reqId)\n return sum\n }\n\n backlogUpdate(kind, id, to, sessionId, reason) {\n const k = String(kind || '')\n const i = String(id || '')\n const t = String(to || '')\n if (!k || !i || !t) return { ok: false, error: '缺少 kind/id/to' }\n const sc = sessionScope(sessionId)\n return transitionBacklog(sc.projectKey, k, i, t, reason ? String(reason) : '人工流转')\n }\n\n /** 分配任务卡给某角色(只写 assign 字段,不碰 status)。 */\n assign(kind, id, role, assignee, sessionId) {\n const k = String(kind || '')\n const i = String(id || '')\n const r = String(role || '')\n const a = String(assignee || '')\n if (!k || !i || !r || !a) return { ok: false, error: '缺少 kind/id/role/assignee' }\n const sc = sessionScope(sessionId)\n return assignTask(sc.projectKey, k, i, r, a)\n }\n\n /** 暂停当前会话的 teamflow 触发(会话级)。 */\n pause(sessionId) {\n const sid = typeof sessionId === 'string' ? sessionId : null\n if (!sid) return { ok: false, error: '缺少 sessionId' }\n pausedSessions.add(sid)\n return { ok: true }\n }\n\n /** 恢复当前会话的 teamflow 触发(会话级)。 */\n resumeSession(sessionId) {\n const sid = typeof sessionId === 'string' ? sessionId : null\n if (!sid) return { ok: false, error: '缺少 sessionId' }\n pausedSessions.delete(sid)\n return { ok: true }\n }\n\n /** 列出当前工作区可用的团队。 */\n listTeams(sessionId) {\n const sc = sessionScope(sessionId)\n const teams = loadTeams(sc.projectKey)\n return { teams: teams.map((t) => ({ id: t.id, name: t.name, icon: t.icon, description: t.description })), projectKey: sc.projectKey }\n }\n\n /** 设置当前会话的活跃团队。同时注入上下文提示,让模型区分开发请求和普通聊天。 */\n selectTeam(sessionId, teamId) {\n const sid = typeof sessionId === 'string' ? sessionId : null\n const tid = typeof teamId === 'string' ? teamId : null\n if (!sid || !tid) return { ok: false, error: '缺少 sessionId 或 teamId' }\n const sc = sessionScope(sid)\n const teams = loadTeams(sc.projectKey)\n const team = findTeam(teams, tid)\n if (!team) return { ok: false, error: `团队 ${tid} 不存在` }\n activeTeams.set(sid, tid)\n // 注入会话级上下文:告诉模型什么该走 teamflow,什么不该\n const agent = runtime.agents && runtime.agents.get(sid)\n const injectPayload = {\n type: 'user' as const,\n content: [{ type: 'text' as const, text: teamflowContextText(team.icon, team.name, tid) }],\n source: { kind: 'plugin' as const, plugin: 'dsh-plugin-teamflow', form: 'context' as const },\n }\n if (agent && typeof agent.inject === 'function') {\n try { agent.inject(injectPayload) } catch (e) { /* inject 失败不影响主流程 */ }\n } else {\n // agent 尚未加载(新会话懒加载),存入 pending,2 秒后重试(agent 通常 1-2s 内就绪)\n pendingInjections.set(sid, { teamName: team.name, teamIcon: team.icon, teamId: tid })\n setTimeout(() => tryFlushPendingInjections(sid), 2000)\n }\n return { ok: true, team: { id: team.id, name: team.name, icon: team.icon } }\n }\n\n /** 获取当前会话的活跃团队。 */\n getActiveTeam(sessionId) {\n const sid = typeof sessionId === 'string' ? sessionId : null\n if (!sid) return { team: null }\n // 补发延迟注入(UI 加载时 agent 通常已就绪)\n tryFlushPendingInjections(sid)\n const tid = activeTeams.get(sid)\n if (!tid) return { team: null }\n const sc = sessionScope(sid)\n const teams = loadTeams(sc.projectKey)\n const team = findTeam(teams, tid)\n return team ? { team: { id: team.id, name: team.name, icon: team.icon, description: team.description } } : { team: null }\n }\n\n /** 清除当前会话的活跃团队(回到原生模式)。 */\n clearTeam(sessionId) {\n const sid = typeof sessionId === 'string' ? sessionId : null\n if (!sid) return { ok: false, error: '缺少 sessionId' }\n activeTeams.delete(sid)\n return { ok: true }\n }\n\n /** 从断点续跑:跳过已完成阶段,从第一个未完成阶段重跑。 */\n resume(runId, sessionId) {\n return resumeRun(runId, sessionId)\n }\n}\n\nexport default TeamflowService\n"],"mappings":"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"}