@devflow-tools/devflow 0.18.48 → 0.18.49

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.
Files changed (115) hide show
  1. package/dist/dashboard/404.html +1 -1
  2. package/dist/dashboard/__next.__PAGE__.txt +1 -1
  3. package/dist/dashboard/__next._full.txt +1 -1
  4. package/dist/dashboard/__next._tree.txt +1 -1
  5. package/dist/dashboard/_not-found/__next._full.txt +1 -1
  6. package/dist/dashboard/_not-found/__next._not-found.__PAGE__.txt +1 -1
  7. package/dist/dashboard/_not-found/__next._tree.txt +1 -1
  8. package/dist/dashboard/_not-found.html +1 -1
  9. package/dist/dashboard/_not-found.txt +1 -1
  10. package/dist/dashboard/accuracy/__next._full.txt +1 -1
  11. package/dist/dashboard/accuracy/__next._tree.txt +1 -1
  12. package/dist/dashboard/accuracy/__next.accuracy.__PAGE__.txt +1 -1
  13. package/dist/dashboard/accuracy.html +1 -1
  14. package/dist/dashboard/accuracy.txt +1 -1
  15. package/dist/dashboard/benchmark/__next._full.txt +1 -1
  16. package/dist/dashboard/benchmark/__next._tree.txt +1 -1
  17. package/dist/dashboard/benchmark/__next.benchmark.__PAGE__.txt +1 -1
  18. package/dist/dashboard/benchmark.html +1 -1
  19. package/dist/dashboard/benchmark.txt +1 -1
  20. package/dist/dashboard/context/__next._full.txt +1 -1
  21. package/dist/dashboard/context/__next._tree.txt +1 -1
  22. package/dist/dashboard/context/__next.context.__PAGE__.txt +1 -1
  23. package/dist/dashboard/context.html +1 -1
  24. package/dist/dashboard/context.txt +1 -1
  25. package/dist/dashboard/doctor/__next._full.txt +1 -1
  26. package/dist/dashboard/doctor/__next._tree.txt +1 -1
  27. package/dist/dashboard/doctor/__next.doctor.__PAGE__.txt +1 -1
  28. package/dist/dashboard/doctor.html +1 -1
  29. package/dist/dashboard/doctor.txt +1 -1
  30. package/dist/dashboard/executions/__next._full.txt +1 -1
  31. package/dist/dashboard/executions/__next._tree.txt +1 -1
  32. package/dist/dashboard/executions/__next.executions.__PAGE__.txt +1 -1
  33. package/dist/dashboard/executions.html +1 -1
  34. package/dist/dashboard/executions.txt +1 -1
  35. package/dist/dashboard/graph/__next._full.txt +1 -1
  36. package/dist/dashboard/graph/__next._tree.txt +1 -1
  37. package/dist/dashboard/graph/__next.graph.__PAGE__.txt +1 -1
  38. package/dist/dashboard/graph.html +1 -1
  39. package/dist/dashboard/graph.txt +1 -1
  40. package/dist/dashboard/index.html +1 -1
  41. package/dist/dashboard/index.txt +1 -1
  42. package/dist/dashboard/intelligence/__next._full.txt +1 -1
  43. package/dist/dashboard/intelligence/__next._tree.txt +1 -1
  44. package/dist/dashboard/intelligence/__next.intelligence.__PAGE__.txt +1 -1
  45. package/dist/dashboard/intelligence/knowledge/__next._full.txt +1 -1
  46. package/dist/dashboard/intelligence/knowledge/__next._tree.txt +1 -1
  47. package/dist/dashboard/intelligence/knowledge/__next.intelligence.knowledge.__PAGE__.txt +1 -1
  48. package/dist/dashboard/intelligence/knowledge.html +1 -1
  49. package/dist/dashboard/intelligence/knowledge.txt +1 -1
  50. package/dist/dashboard/intelligence/memory/__next._full.txt +1 -1
  51. package/dist/dashboard/intelligence/memory/__next._tree.txt +1 -1
  52. package/dist/dashboard/intelligence/memory/__next.intelligence.memory.__PAGE__.txt +1 -1
  53. package/dist/dashboard/intelligence/memory.html +1 -1
  54. package/dist/dashboard/intelligence/memory.txt +1 -1
  55. package/dist/dashboard/intelligence.html +1 -1
  56. package/dist/dashboard/intelligence.txt +1 -1
  57. package/dist/dashboard/knowledge/__next._full.txt +1 -1
  58. package/dist/dashboard/knowledge/__next._tree.txt +1 -1
  59. package/dist/dashboard/knowledge/__next.knowledge.__PAGE__.txt +1 -1
  60. package/dist/dashboard/knowledge.html +1 -1
  61. package/dist/dashboard/knowledge.txt +1 -1
  62. package/dist/dashboard/memory/__next._full.txt +1 -1
  63. package/dist/dashboard/memory/__next._tree.txt +1 -1
  64. package/dist/dashboard/memory/__next.memory.__PAGE__.txt +1 -1
  65. package/dist/dashboard/memory.html +1 -1
  66. package/dist/dashboard/memory.txt +1 -1
  67. package/dist/dashboard/replay/__next._full.txt +1 -1
  68. package/dist/dashboard/replay/__next._tree.txt +1 -1
  69. package/dist/dashboard/replay/__next.replay.__PAGE__.txt +1 -1
  70. package/dist/dashboard/replay.html +1 -1
  71. package/dist/dashboard/replay.txt +1 -1
  72. package/dist/dashboard/runs/_/__next._full.txt +1 -1
  73. package/dist/dashboard/runs/_/__next._tree.txt +1 -1
  74. package/dist/dashboard/runs/_/__next.runs.$d$id.__PAGE__.txt +1 -1
  75. package/dist/dashboard/runs/_.html +1 -1
  76. package/dist/dashboard/runs/_.txt +1 -1
  77. package/dist/dashboard/runs/__next._full.txt +1 -1
  78. package/dist/dashboard/runs/__next._tree.txt +1 -1
  79. package/dist/dashboard/runs/__next.runs.__PAGE__.txt +1 -1
  80. package/dist/dashboard/runs.html +1 -1
  81. package/dist/dashboard/runs.txt +1 -1
  82. package/dist/dashboard/settings/__next._full.txt +1 -1
  83. package/dist/dashboard/settings/__next._tree.txt +1 -1
  84. package/dist/dashboard/settings/__next.settings.__PAGE__.txt +1 -1
  85. package/dist/dashboard/settings.html +1 -1
  86. package/dist/dashboard/settings.txt +1 -1
  87. package/dist/dashboard/timeline/__next._full.txt +1 -1
  88. package/dist/dashboard/timeline/__next._tree.txt +1 -1
  89. package/dist/dashboard/timeline/__next.timeline.__PAGE__.txt +1 -1
  90. package/dist/dashboard/timeline.html +1 -1
  91. package/dist/dashboard/timeline.txt +1 -1
  92. package/dist/dashboard/tool-metrics/__next._full.txt +1 -1
  93. package/dist/dashboard/tool-metrics/__next._tree.txt +1 -1
  94. package/dist/dashboard/tool-metrics/__next.tool-metrics.__PAGE__.txt +1 -1
  95. package/dist/dashboard/tool-metrics.html +1 -1
  96. package/dist/dashboard/tool-metrics.txt +1 -1
  97. package/dist/dashboard/workflows/__next._full.txt +1 -1
  98. package/dist/dashboard/workflows/__next._tree.txt +1 -1
  99. package/dist/dashboard/workflows/__next.workflows.__PAGE__.txt +1 -1
  100. package/dist/dashboard/workflows.html +1 -1
  101. package/dist/dashboard/workflows.txt +1 -1
  102. package/dist/hooks/hook-daemon.js +11 -11
  103. package/dist/hooks/post-tool-use.js +1 -1
  104. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  105. package/dist/plugin/dist/command-registry.json +7 -7
  106. package/dist/plugin/dist/hooks/hook-daemon.js +11 -11
  107. package/dist/plugin/dist/hooks/post-tool-use.js +1 -1
  108. package/dist/plugin/dist/runtime-manifest.json +5 -5
  109. package/dist/plugin/package.json +13 -13
  110. package/dist/plugin/skills/approve/SKILL.md +5 -1
  111. package/dist/plugin/skills/delivery/SKILL.md +1 -1
  112. package/package.json +16 -16
  113. package/plugin-registry.json +29 -29
  114. /package/dist/dashboard/_next/static/{ZQu0DWZ2YOUuQE-PH4-Us → Er3SGf4d-CzhxTdusFtQ2}/_buildManifest.js +0 -0
  115. /package/dist/dashboard/_next/static/{ZQu0DWZ2YOUuQE-PH4-Us → Er3SGf4d-CzhxTdusFtQ2}/_ssgManifest.js +0 -0
@@ -3,6 +3,6 @@ import {existsSync,readFileSync,rmSync,mkdirSync,writeFileSync,linkSync,readdirS
3
3
 
4
4
  `)}function W(n,t=0){if(t>6||n==null)return [];if(typeof n=="string")try{return W(JSON.parse(n),t+1)}catch{return []}if(Array.isArray(n)){for(let o of n){let r=W(o,t+1);if(r.length>0)return r}return []}if(typeof n!="object")return [];let e=n;if(Array.isArray(e.detectorCoverage))return e.detectorCoverage.filter(o=>typeof o=="string").slice(0,32);for(let o of Object.values(e)){let r=W(o,t+1);if(r.length>0)return r}return []}function L(n,t,e){if(t>gn||n===null||n===void 0)return null;if(typeof n=="string"){if(Buffer.byteLength(n,"utf8")>fn)return null;try{return L(JSON.parse(n),t+1,e)}catch{return null}}if(typeof n!="object"||e.has(n))return null;if(e.add(n),Array.isArray(n)){for(let r of n.slice(0,16)){let i=L(r,t+1,e);if(i)return i}return null}let o=n;if("evidenceContract"in o)return {contract:o.evidenceContract,canonicalReport:o.canonicalReport};for(let r of ["structuredContent","data","result"])if(r in o){let i=L(o[r],t+1,e);if(i)return i}if(Array.isArray(o.content))for(let r of o.content.slice(0,16)){let i=r&&typeof r=="object"&&"text"in r?r.text:r,s=L(i,t+1,e);if(s)return s}return null}function vn(n,t){if(!n||typeof n!="object"||Array.isArray(n))return null;let e=n;if(e.version!=="1.0"||typeof e.id!="string"||!/^[a-zA-Z0-9][a-zA-Z0-9:._-]{0,127}$/.test(e.id)||typeof e.runtimeProfilingOccurred!="boolean"||typeof e.samplingEvidenceOccurred!="boolean"||!Array.isArray(e.requiredSections)||e.requiredSections.length!==J.length)return null;let o=e.requiredSections.filter(c=>typeof c=="string");if(o.length!==J.length||J.some((c,l)=>o[l]!==c)||!Array.isArray(e.prohibitedClaims)||e.prohibitedClaims.length>16)return null;let r=e.prohibitedClaims.filter(c=>typeof c=="string"&&c.length<=128);if(r.length!==e.prohibitedClaims.length)return null;let i=e.correctionPolicy;if(!i||typeof i!="object"||Array.isArray(i))return null;let s=i;if(s.maxAttempts!==1||s.repeatedViolation!=="fail_open")return null;let a=typeof e.canonicalReport=="string"?e.canonicalReport:t;return typeof a!="string"||Buffer.byteLength(a,"utf8")>pn||J.some(c=>!a.includes(c))?null:{version:"1.0",id:e.id,runtimeProfilingOccurred:e.runtimeProfilingOccurred,samplingEvidenceOccurred:e.samplingEvidenceOccurred,requiredSections:o,prohibitedClaims:r,correctionPolicy:{maxAttempts:1,repeatedViolation:"fail_open"},canonicalReport:a}}function Ve(n){let t;try{if(En(n.toolResponse))return null;t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:50});let e=t.getActiveContextReceipt(n.projectRoot,n.sessionId,n.executionId);if(!e)return null;let o=Rn(n.toolInput);if(o.length===0)return null;let r=n.toolName==="Read"?xn(n.toolInput):void 0,i=r?e.selectedFiles?.find(d=>kn(n.projectRoot,d,r)):void 0,s=Sn(n.toolName),a=i?"code":e.canonicalNextAction===s?"action":null,c=i&&o.includes(i)?i:a==="action"&&o.includes(s)?s:void 0;if(a&&c){let d=[e.contextHash,e.requestId??"",a,c,n.toolUseId??`${n.sessionId}:${n.executionId??e.executionId}`].join("\0");t.recordContextSelectionEvent({id:`ctxsel:${createHash$1("sha256").update(d).digest("hex").slice(0,32)}`,projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:e.executionId,requestId:e.requestId,selectionType:a,candidateId:c,toolName:n.toolName,toolUseId:n.toolUseId,selectedAt:Date.now()});}let l=t.listRetrievalLedgerEvents({projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:e.executionId,requestId:e.requestId}).filter(d=>d.stage==="selected"&&o.includes(d.sourceId));for(let d of l)t.appendRetrievalLedgerEvent({...d,id:retrievalLedgerTransitionId(d.id,"consumed",n.toolUseId??n.toolName),stage:"consumed",toolEvidence:[n.toolUseId??n.toolName],evidenceIds:o,actor:n.toolName,reasonCode:"structural_evidence_ref",payload:{...d.payload,consumedByTool:n.toolName},createdAt:Date.now()});return l.length>0&&He({event:"retrieval.attribution.transitioned",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:e.executionId,requestId:e.requestId,contextReceipt:e.contextHash},level:"info",timestamp:Date.now(),data:{stage:"consumed",actor:n.toolName,consumedCount:l.length,evidenceRefCount:o.length}}),a}catch(e){throw He({event:"hook.runtime.degraded",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,requestId:n.requestId},level:"warn",timestamp:Date.now(),data:{stage:"retrieval_attribution",actor:n.toolName,reason:e instanceof Error?e.message:String(e)}}),e}finally{try{t?.close();}catch{}}}function Rn(...n){let t=new Set,e=(o,r=0)=>{if(!(r>6||o==null)){if(typeof o=="string"){try{e(JSON.parse(o),r+1);}catch{}return}if(Array.isArray(o)){for(let i of o)e(i,r+1);return}if(typeof o=="object")for(let[i,s]of Object.entries(o))if((i==="evidenceRefs"||i==="_devflow_evidence_refs")&&Array.isArray(s))for(let a of s)typeof a=="string"&&a.trim()&&t.add(a.trim());else e(s,r+1);}};for(let o of n)e(o);return [...t]}function xn(n){for(let t of ["file_path","path"]){let e=n[t];if(typeof e=="string"&&e.trim())return e.trim()}}function kn(n,t,e){let o=resolve(n,t),r=isAbsolute(e)?resolve(e):resolve(n,e);return o===r}function Sn(n){return n.startsWith("mcp__")?n.split("__").at(-1)??n:n}function En(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let t=n;return t.ok===false||t.success===false||t.isError===true||!!t.error||["failed","rejected","unavailable"].includes(String(t.status??""))}function He(n){try{h(n);}catch{}}var Cn=new Set(["Write","Edit","NotebookEdit"]);function ze(n){if(!Cn.has(n.toolName)||Pn(n.toolResponse))return null;let t=Fn(n.projectRoot,n.toolInput);if(!t)return null;let e=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let o=e.getActiveContextReceipt(n.projectRoot,n.sessionId,n.executionId),r=o?.canonicalAction?.verificationPlan??[];if(!o||r.length===0)return null;let i=[],s=[];for(let c of r){let l=jn({projectRoot:n.projectRoot,targetFile:t,kind:c.kind,mode:c.mode==="write"?"write":"check",required:c.required===!0,contextReceipt:o.contextHash}),d=`${o.contextHash}\0${n.toolUseId??t}\0${c.kind}\0${t}`,u=`policy-verification:${createHash$1("sha256").update(d).digest("hex")}`,p=Date.now();if(!l){let k=`verification_unavailable:${c.kind}`;e.upsertSessionObligation({obligationId:u,projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,kind:"evidence_contract",state:"degraded",payload:{subtype:"policy_verification",status:"unknown",verificationKind:c.kind,targetFile:t,contextReceipt:o.contextHash},reason:k,createdAt:p,updatedAt:p,resolvedAt:p}),s.push(c.kind),c.required===!0&&F({projectRoot:n.projectRoot,sessionId:n.sessionId,requestId:o.requestId,executionId:n.executionId,kind:"verification.failed",payload:{receiptId:u,reasonCode:k},dedupeKey:`${u}:unavailable`,producer:"devflow-verification-scheduler"});continue}let y={...l,obligationId:u,sessionId:n.sessionId,executionId:n.executionId,requestId:o.requestId};e.upsertSessionObligation({obligationId:u,projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:n.executionId,kind:"evidence_contract",state:"open",payload:{subtype:"policy_verification",status:"scheduled",verificationKind:c.kind,command:l.display,targetFile:t,contextReceipt:o.contextHash,required:c.required===!0},createdAt:p,updatedAt:p});let b=e.enqueueWork({idempotencyKey:u,kind:"verification.policy",projectRoot:n.projectRoot,sessionId:n.sessionId,payload:y,maxAttempts:2,nextAttemptAt:p});F({projectRoot:n.projectRoot,sessionId:n.sessionId,requestId:o.requestId,executionId:n.executionId,kind:"durable_work.owned",payload:{workId:b.id,obligation:"verification"},dedupeKey:`${b.id}:owned`,producer:"devflow-verification-scheduler"}),i.push(l.display);}return [i.length>0?`DevFlow scheduled policy verification: ${i.join(" && ")}`:"",s.length>0?`Verification unavailable and recorded as unknown: ${s.join(", ")}`:""].filter(Boolean).join(`
5
5
  `)||null}finally{e.close();}}function jn(n){let t=qn(n.projectRoot),e=Ln(n.projectRoot),o=t?.scripts??{},r={...t?.dependencies,...t?.devDependencies},i=null;if(n.kind==="formatter"&&(r.prettier||Mn(n.projectRoot)))i=G(e,"prettier",[n.mode==="write"?"--write":"--check",n.targetFile],6e4);else if(n.kind==="typecheck"){let s=ue(o,["typecheck","type-check","check:types"]);s?i=le(e,s,12e4):r.typescript&&existsSync$1(join(n.projectRoot,"tsconfig.json"))&&(i=G(e,"tsc",["--noEmit","--pretty","false"],12e4));}else if(n.kind==="lint"){let s=ue(o,["lint"]);s&&(i=le(e,s,12e4));}else if(n.kind==="test"){let s=Nn(n.projectRoot,n.targetFile);s&&r.vitest?i=G(e,"vitest",["run",s],12e4):s&&(r.jest||r["@jest/core"])&&(i=G(e,"jest",["--runTestsByPath",s],12e4));}else if(n.kind==="build"){let s=ue(o,["build"]);s&&(i=le(e,s,18e4));}else n.kind==="generated_files"&&(i={command:"git",args:["diff","--check","--",n.targetFile],timeoutMs:3e4});return i?{kind:n.kind,...i,display:[i.command,...i.args].map(Un).join(" "),required:n.required,targetFile:n.targetFile,contextReceipt:n.contextReceipt}:null}function le(n,t,e){return n==="yarn"?{command:"yarn",args:["run",t],timeoutMs:e}:n==="pnpm"?{command:"pnpm",args:["run",t],timeoutMs:e}:n==="bun"?{command:"bun",args:["run",t],timeoutMs:e}:{command:"npm",args:["run",t],timeoutMs:e}}function G(n,t,e,o){return n==="pnpm"?{command:"pnpm",args:["exec",t,...e],timeoutMs:o}:n==="yarn"?{command:"yarn",args:[t,...e],timeoutMs:o}:n==="bun"?{command:"bunx",args:[t,...e],timeoutMs:o}:{command:"npx",args:["--no-install",t,...e],timeoutMs:o}}function Fn(n,t){let e=t.file_path??t.notebook_path;if(typeof e!="string"||!e.trim())return null;let o=isAbsolute(e)?resolve(e):resolve(n,e);return $n(n,o)?relative(n,o).split(sep).join("/"):null}function $n(n,t){let e=isAbsolute(t)?resolve(t):resolve(n,t),o=relative(resolve(n),e);return o!==""&&o!==".."&&!o.startsWith(`..${sep}`)&&!isAbsolute(o)}function Pn(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let t=n;return t.ok===false||t.success===false||t.isError===true||!!t.error}function qn(n){try{return JSON.parse(readFileSync$1(join(n,"package.json"),"utf8"))}catch{return null}}function Ln(n){return existsSync$1(join(n,"pnpm-lock.yaml"))?"pnpm":existsSync$1(join(n,"yarn.lock"))?"yarn":existsSync$1(join(n,"bun.lockb"))||existsSync$1(join(n,"bun.lock"))?"bun":"npm"}function Mn(n){return [".prettierrc",".prettierrc.json",".prettierrc.js",".prettierrc.cjs","prettier.config.js","prettier.config.cjs"].some(t=>existsSync$1(join(n,t)))}function ue(n,t){return t.find(e=>typeof n[e]=="string"&&n[e].trim())??null}function Nn(n,t){let e=t.replace(/\.[^.]+$/u,""),o=[".test.ts",".test.tsx",".spec.ts",".spec.tsx",".test.js",".spec.js"];for(let s of o){let a=`${e}${s}`;if(existsSync$1(join(n,a)))return a}let r=join(n,t.split("/").slice(0,-1).join("/")),i=t.split("/").at(-1)?.replace(/\.[^.]+$/u,"");if(!i||!existsSync$1(r))return null;try{return readdirSync$1(r).filter(s=>s.startsWith(`${i}.`)&&/\.(?:test|spec)\.[cm]?[jt]sx?$/u.test(s)).map(s=>relative(n,join(r,s)).split(sep).join("/"))[0]??null}catch{return null}}function Un(n){return /^[A-Za-z0-9_./:@=-]+$/u.test(n)?n:JSON.stringify(n)}function Je(n){if(!n.toolUseId)return null;let t=Xn(n.projectRoot,n.toolUseId);if(!t||t.sessionId!==n.sessionId)return null;let e=Date.now(),o={...t,id:createHash$1("sha256").update(`${t.sessionId}\0${t.toolUseId}\0${t.path}\0${e}`).digest("hex"),phase:"completed",success:n.success,after:Gn(t.path),completedAt:e,error:n.error?.slice(0,500)},r=Zn(n.projectRoot);return mkdirSync$1(dirname(r),{recursive:true}),appendFileSync(r,`${JSON.stringify(o)}
6
- `,{encoding:"utf8",mode:384}),h({event:"canonical.action.validated",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:t.executionId,contextReceipt:t.contextReceipt},level:n.success?"info":"warn",timestamp:e,data:{stage:"host_file_state_completed",valid:n.success,operation:t.operation,targetPath:relative(n.projectRoot,t.path),beforeHash:t.before.hash,afterHash:o.after.hash,beforeExists:t.before.exists,afterExists:o.after.exists,reason:o.error,toolUseId:t.toolUseId}}),o}function Gn(n){if(!existsSync$1(n))return {exists:false};try{return {exists:!0,hash:createHash$1("sha256").update(readFileSync$1(n)).digest("hex")}}catch{return {exists:true}}}function We(n){return join(D(n),"file-state")}function Ge(n){return join(We(n),"pending.json")}function Zn(n){return join(We(n),"observations.jsonl")}function Qn(n){try{return JSON.parse(readFileSync$1(Ge(n),"utf8"))}catch{return {}}}function Xn(n,t){let e=Ge(n),o=Qn(n),r=o[t];if(r)return delete o[t],Yn(e,JSON.stringify(o)),r}function Yn(n,t){let e=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync$1(e,t,{encoding:"utf8",mode:384}),renameSync$1(e,n);}var to={open:["intent_bound"],intent_bound:["context_ready","context_degraded"],context_ready:["action_required","action_not_required"],context_degraded:["action_required","action_not_required"],action_required:["action_satisfied","action_degraded","action_failed"],action_not_required:["memory_decided","memory_quarantined"],action_satisfied:["memory_decided","memory_quarantined"],action_degraded:["memory_decided","memory_quarantined"],action_failed:["action_satisfied","action_degraded"],memory_decided:["closed","closed_with_degradation","closed_with_retry_work"],memory_quarantined:["closed_with_degradation","closed_with_retry_work"],closed:[],closed_with_degradation:[],closed_with_retry_work:[]};function no(n){return oo(n)}function oo(n){let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=ao(t,n.artifact);if(co(e.toState))return e;let o=t.getContextReceiptForRequest(n.artifact.projectRoot,n.artifact.sessionId,n.artifact.requestId),r=t.getMemoryTurn(n.artifact.turnId),i=n.artifact.intent==="memory"||r?.source==="explicit_intent";if(!o&&!i)return e;let s=o?ro(n.artifact,o):"context_ready";e.toState==="intent_bound"&&(e=v(t,e,n,s,i?"task_context_not_required":s==="context_ready"?"canonical_context_receipt_ready":"canonical_context_receipt_degraded"));let a=o?io(n.artifact,o):"action_not_required";if((e.toState==="context_ready"||e.toState==="context_degraded")&&(a==="action_not_required"?e=v(t,e,n,"action_not_required","task_action_not_required"):e=v(t,e,n,"action_required","canonical_action_obligation_present")),e.toState==="action_required"){if(a==="action_required")return e;if(a==="action_failed")return v(t,e,n,"action_failed","canonical_action_attempt_failed");a==="action_degraded"?e=v(t,e,n,"action_degraded","canonical_action_unavailable_or_degraded"):a==="action_satisfied"&&(e=v(t,e,n,"action_satisfied","canonical_action_succeeded"));}if(e.toState==="action_failed")if(a==="action_satisfied")e=v(t,e,n,"action_satisfied","canonical_action_retry_succeeded");else if(a==="action_degraded")e=v(t,e,n,"action_degraded","canonical_action_retry_degraded");else return e;let c=s==="context_degraded"||a==="action_degraded";return ["action_not_required","action_satisfied","action_degraded"].includes(e.toState)&&(e=v(t,e,n,n.memoryStatus==="pending"?"memory_quarantined":"memory_decided",n.memoryStatus==="pending"?n.reason:`canonical_memory_${n.memoryStatus}`)),e.toState==="memory_decided"?v(t,e,n,c?"closed_with_degradation":"closed",n.reason):e.toState==="memory_quarantined"?v(t,e,n,n.retryOwned?"closed_with_retry_work":"closed_with_degradation",n.retryOwned?"durable_retry_owner_confirmed":"terminal_obligation_unowned"):e}finally{t.close();}}function Qe(n){let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=t.getActiveContextReceipt(n.projectRoot,n.sessionId,n.executionId),o=typeof e?.canonicalAction?.binding.turnId=="string"?e.canonicalAction.binding.turnId:void 0;if(!o)return null;let r=t.listLatestTaskIntentArtifacts(n.projectRoot,n.sessionId).find(s=>s.turnId===o),i=t.getMemoryTurn(o);return !r||!i?null:no({artifact:r,memoryStatus:i.status,memoryReceiptId:i.receiptId,reason:n.reason})}finally{t.close();}}function ro(n,t){return n.intent==="memory"||n.intent==="knowledge"||(t.selectedFiles?.length??0)>0?"context_ready":"context_degraded"}function io(n,t){let e=t.canonicalAction,r=(e?(t.actionAttempts??[]).filter(i=>i.tool===e.tool):[]).at(-1);return t.actionSatisfiedAt||r?.status==="succeeded"?"action_satisfied":r&&["failed","timeout","unavailable"].includes(r.status)?"action_failed":t.actionDegradation||e?.status==="degraded"||e?.status==="unsupported"?"action_degraded":e?.required||so(n)?"action_required":"action_not_required"}function so(n){return ["create","modify","debug","test","format"].includes(n.action)||["feature","refactor","performance"].includes(n.intent)}function ao(n,t){let e=n.getLatestTerminalTransition(t.projectRoot,t.sessionId,t.turnId);if(!e)throw new Error(`TERMINAL_INTENT_STATE_MISSING:${t.turnId}`);return e}function v(n,t,e,o,r){if(!to[t.toState]?.includes(o))throw new Error(`TERMINAL_PATH_UNAVAILABLE:${t.toState}->${o}`);let i=t.sequence+1,s=`terminal:${createHash$1("sha256").update(`${e.artifact.artifactHash}\0${i}\0${o}`).digest("hex").slice(0,24)}`,a=n.appendTerminalTransition({projectRoot:e.artifact.projectRoot,projectId:e.artifact.projectId,hostId:e.artifact.hostId,sessionId:e.artifact.sessionId,turnId:e.artifact.turnId,requestId:e.artifact.requestId,executionId:e.artifact.executionId,sequence:i,fromState:t.toState,toState:o,receiptId:s,sourceReceiptId:e.memoryReceiptId??t.receiptId,reason:r,payload:{memoryStatus:e.memoryStatus,retryOwned:e.retryOwned??false,sourceIntentHash:e.artifact.artifactHash},createdAt:Date.now()});return h({event:"terminal.state.transitioned",identity:{projectRoot:e.artifact.projectRoot,projectId:e.artifact.projectId,hostId:e.artifact.hostId,sessionId:e.artifact.sessionId,turnId:e.artifact.turnId,requestId:e.artifact.requestId,...e.artifact.executionId?{executionId:e.artifact.executionId}:{}},level:o==="closed"?"info":o.includes("degradation")||o.includes("retry")||o==="action_failed"?"warn":"info",timestamp:Date.now(),data:{fromState:t.toState,nextState:o,receiptId:s,reason:r}}),a}function co(n){return n==="closed"||n==="closed_with_degradation"||n==="closed_with_retry_work"}function Xe(n){let t=n.hook==="post_tool_use_failure"||!!n.error?.trim()||lo(n.response),e=t?"not_consumed":n.hook==="post_tool_use"?"consumed":"unknown",o=t?uo(n.error,n.response):e==="consumed"?"host_reported_success":"host_outcome_unknown";return {schemaVersion:"host-tool-outcome.v1",toolName:n.toolName,...n.toolUseId?{toolUseId:n.toolUseId}:{},consumption:e,reasonCode:o,receiptId:n.toolUseId??`host-tool:${n.toolName}:${o}`}}function lo(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let t=n;return t.isError===true||t.error?true:typeof t.status=="string"&&["failed","error","rejected","timeout","unavailable"].includes(t.status.toLowerCase())}function uo(n,t){let e=`${n??""} ${JSON.stringify(t??"")}`;return /timeout|timed out|deadline/iu.test(e)?"host_tool_timeout":/unavailable|not found|not registered|unsupported/iu.test(e)?"host_tool_unavailable":"host_tool_failed"}function et(){return generateKeyPairSync("ed25519")}function tt(n){let t=parseTrustedDecisionCommand(n.rawUserEvent,n.allowedOptionIds),e=n.now??Date.now(),o={schemaVersion:"delivery-user-attestation.v1",issuer:n.issuer,keyId:n.keyId,purpose:t.purpose,decisionId:t.decisionId,caseId:n.caseId,caseVersion:n.caseVersion,sessionId:n.sessionId,sourceTurnId:n.sourceTurnId,actorId:n.actorId,targetDecisionHash:n.targetDecisionHash,rawUserEvent:n.rawUserEvent,rawUserEventHash:domainHash("raw-user-event",n.rawUserEvent),selectedValueHash:domainHash("decision-value",{decisionId:t.decisionId,purpose:t.purpose,value:encodeDecisionValue(t.purpose,t.value)}),eventSequence:n.eventSequence,issuedAt:new Date(e).toISOString(),expiresAt:new Date(e+6e4).toISOString(),nonce:n.nonce};return {...o,attestation:sign(null,canonicalJsonBytes(o),n.privateKey).toString("base64url")}}var nt=new Map,ot=new Map;function rt(n){if(typeof n=="string")return /\bDevFlow decision ([A-Za-z0-9._:-]+)/u.exec(x(n))?.[1]}function x(n){return n.replace(/[\u0000-\u001f\u007f\ufffd]+/gu,"").replace(/\s+/gu," ").trim()}function Io(n){if(typeof n=="string")return n.trim()||void 0;if(!n||typeof n!="object"||Array.isArray(n))return;let t=n.answers;if(!t||typeof t!="object"||Array.isArray(t))return;let e=Object.values(t);if(e.length!==1)return;let o=e[0];if(!(Array.isArray(o)||typeof o!="string"))return o.trim()||void 0}async function it(n){if(n.toolName!=="AskUserQuestion")return {handled:false};let t=n.toolInput&&typeof n.toolInput=="object"&&!Array.isArray(n.toolInput)?n.toolInput:{};if(!Array.isArray(t.questions)||t.questions.length!==1)return {handled:false};let e=t.questions[0],o=rt(e.header)??rt(e.question);if(!o)return {handled:false};let r=o.split(/:(?:decision|question|approval):/u)[0],i=wo(n.projectRoot),s=await i.pendingDecision(r);if(!s||s.id!==o)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: no pending decision matches ${o}. Refresh delivery_status.`};let a=Array.isArray(e.options)?e.options.map(m=>({label:typeof m.label=="string"?x(m.label):"",description:typeof m.description=="string"?x(m.description):""})):[],c=createHash$1("sha256").update(JSON.stringify({decisionId:o,question:x(String(e.question??"")),options:a})).digest("hex"),l=`${n.sessionId}:${o}`,d=ot.get(l);if(d&&d.hash===c&&d.sourceTurnId===(n.sourceTurnId??n.toolUseId))return {handled:true,resolved:false,message:`DevFlow interactive decision ${o} was already presented in this host turn. Reuse the existing answer or refresh delivery_status after resolution.`};ot.set(l,{hash:c,sourceTurnId:n.sourceTurnId??n.toolUseId,count:(d?.count??0)+1});let u=Io(n.toolResponse),p=u?x(u):void 0;if(!p)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: AskUserQuestion returned no single answer for ${o}. Use /devflow:decide ${o} -- <answer> if this is a free-form clarification.`};if(e.multiSelect===true)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${o} must be a single selection.`};let y;if(s.options.length>0){let m=s.options.map(w=>({label:x(w.label),description:w.description?x(w.description):""}));if(a.length!==m.length||a.some((w,P)=>w.label!==m[P]?.label||w.description!==m[P]?.description))return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: the displayed options do not match the pending decision ${o}. Refresh delivery_status and render its options verbatim.`};let S=s.options.find(w=>x(w.label)===p);if(!S)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: answer does not match a pending option for ${o}.`};s.kind==="artifact_approval"?y=S.id==="approve"?`/devflow:approve ${o}`:`/devflow:reject ${o} -- ${p}`:y=`/devflow:decide ${o} ${S.id}`;}else {if(a.length>0)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${o} is a free-form clarification and must not be rendered as a choice list.`};y=`/devflow:decide ${o} -- ${p}`;}let b=process.env.DEVFLOW_HOST_ACTOR_ID?.trim()||`user:${process.env.USER?.trim()||"local"}`,k=et(),$=tt({rawUserEvent:y,issuer:"claude-code",keyId:"session-ephemeral",caseId:r,caseVersion:s.caseVersion,sessionId:n.sessionId,sourceTurnId:n.sourceTurnId?.trim()||n.toolUseId?.trim()||`host-turn:${n.sessionId}:${Date.now()}`,actorId:b,targetDecisionHash:s.targetDecisionHash,eventSequence:Date.now(),nonce:randomUUID$1(),privateKey:k.privateKey,allowedOptionIds:s.options.map(m=>m.id)});try{return await i.resolveTrustedDecision({evidence:$,publicKey:k.publicKey,expectedIssuer:"claude-code",expectedKeyId:"session-ephemeral"}),{handled:!0,resolved:!0,message:`DevFlow interactive decision resolved for ${r}. Refresh delivery_status and follow nextActions.`}}catch(m){return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${m instanceof Error?m.message:String(m)}`}}}function wo(n){let t=nt.get(n);if(t)return t;let e=createTrustedDeliveryFacade(n);return nt.set(n,e),e}function st(n){if(!n)return;let t=typeof n.status=="string"?n.status:void 0;if(!(n.ok===false||n.success===false||n.isError===true||t==="failed"||t==="rejected"||!!n.error))return;let o=n.error;if(typeof o=="string"&&o.trim())return o;if(o&&typeof o=="object"){let r=o;if(typeof r.message=="string"&&r.message.trim())return r.message;if(typeof r.code=="string"&&r.code.trim())return r.code}return t?`Tool response status: ${t}`:"Tool response reported failure"}function To(n,t,e,o){try{let r=join$1(D(n),"event-map.json");if(!existsSync(r))return null;let i=JSON.parse(readFileSync(r,"utf-8")),s=i.filter(l=>l.toolName===e&&(!l.sessionId||l.sessionId===t));if(s.length===0)return null;let a=o?s.find(l=>l.toolUseId===o):s.sort((l,d)=>l.timestamp-d.timestamp)[0];if(!a)return null;let c=i.findIndex(l=>l.eventId===a.eventId);return c!==-1&&i.splice(c,1),writeFileSync(r,JSON.stringify(i)),{eventId:a.eventId,timestamp:a.timestamp}}catch{return null}}function at(n){if(!n)return 0;let t=n;if(typeof n=="string")try{t=JSON.parse(n);}catch{return 1}let e=t,o=["files","results","data","result","memories","nodes","chunks","findings","symbols","keySymbols"],r=["reasoning","riskHints","nextActions"],i=Array.isArray(e.data)?e.data:e.structuredContent??e;if(Array.isArray(i))return i.length;if(typeof i=="object"&&i!==null){let s=i,a=0,c=false;for(let d of o)Array.isArray(s[d])&&(c=true,a+=s[d].length);for(let d of r)Array.isArray(s[d])&&(a+=s[d].length);for(let[,d]of Object.entries(s))d&&typeof d=="object"&&!Array.isArray(d)&&(a+=at(d));let l=!!(s._devflow||s._devflow_unique||s.taskType);return a===0&&l&&!c?1:a>0?a:c?0:Object.keys(s).length>0?1:0}return 0}async function Oo(n){if(!n)return null;let t;try{t=JSON.parse(n);}catch{return null}let e=t.tool_name||"",o=te(),r=t.tool_input||{},i=t.tool_response||{},s=t.session_id?.trim()||null,a=new T(o);if(s&&a.registerSession(s),s){let f=await it({projectRoot:o,sessionId:s,sourceTurnId:a.get(s)?.activeTurnId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id});if(f.handled)return f.message}let c=resolveClaudeToolName(e,r),l=c.status==="unsupported"?void 0:c.canonicalName;if(s&&l==="get_project_context"&&a.completeContextInitialization(s,t.tool_use_id),e==="Skill"){let f=typeof r=="object"&&r.skill?r.skill:"",g=Le(f);s&&g&&(a.startExecution(s,g,qe(g)),se(o,{lastMcpCall:Math.floor(Date.now()/1e3),bypassCount:0}));}let d=s?a.get(s):null;if(e.startsWith("mcp__")){let f=new H(o,s??void 0,d?.executionId??s??void 0);f.recordMcpCall();let g=st(typeof i=="object"&&i!==null?i:null),_=l??e,X=f.getContextReceipt?.()?.canonicalAction?.tool===_;if((f.recordDomainActionOutcome(_,g?Co(g):"succeeded",g,t.tool_use_id)||X)&&s){let O=Xe({hook:"post_tool_use",toolName:_,...t.tool_use_id?{toolUseId:t.tool_use_id}:{},response:i,...g?{error:g}:{}});F({projectRoot:o,sessionId:s,executionId:d?.executionId??s,kind:O.consumption==="consumed"?"action.succeeded":"action.failed",payload:{receiptId:O.receiptId,reasonCode:O.reasonCode,consumption:O.consumption,tool:_},dedupeKey:`${O.receiptId}:${O.consumption}`,producer:"devflow-post-tool-use"});try{Qe({projectRoot:o,sessionId:s,executionId:d?.executionId??s,reason:g?"post_tool_action_failed":"post_tool_action_succeeded"});}catch{}}}s&&Ve({projectRoot:o,sessionId:s,executionId:d?.executionId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id});let u=s?To(o,s,e,t.tool_use_id):null,p=s&&t.tool_use_id&&!u?(()=>{try{let f=openGlobalDevFlowDatabase();try{return f.getToolCallEventByToolUseId(s,t.tool_use_id)}finally{f.close();}}catch{return null}})():null,y=u??p,b=typeof i=="object"&&i!==null?i:null,k=JSON.stringify(i),$=Buffer.byteLength(k,"utf8"),m=at(i),S=st(b);if(s&&Je({projectRoot:o,sessionId:s,toolUseId:t.tool_use_id,success:!S,error:S}),d?.executionId!==void 0||l!==void 0||e==="Skill"){let f=getLogWriter(o),g=d?.executionId??`auto-${s??Date.now()}`;f.toolCall({tool:e,runId:g,stepId:`step-${g}`,input:r,output:i,duration:y?Math.max(0,Date.now()-y.timestamp):0,success:!b?.error,resultCount:m,resultSizeBytes:$,error:b?.error});}if(y&&s){let f=typeof i=="string"?i:JSON.stringify(i),g=f.length>5e3?{_truncated:true,_originalSize:f.length,text:f.slice(0,5e3)}:i,_=S,X=_?classifyWorkflowFailure({stepId:e,toolName:e,output:i,error:new Error(_),errorStack:_}).category:void 0;await new B().completeEvent({eventId:y.eventId,sessionId:s,output:g,error:_,failureCategory:X,duration:y?Math.max(0,Date.now()-y.timestamp):0,completedAt:Date.now()});}let P=typeof r=="object"&&r.command?r.command:"",Z=b?.exitCode,ct=b?.stderr,dt=/^\s*(ls|cat|pwd|cd|echo|head|tail|wc|which|whoami|date|env|printenv|id|hostname|uname)\b/,E,A,Q=true;if(e.startsWith("mcp__"))E="mcp_call",A={mcpTool:l??e,query:typeof r=="object"&&r.query?r.query:null,resultCount:m,resultSizeBytes:$};else if(e==="Read"||e==="Write"||e==="Edit")E=e==="Read"?"file_read":"file_write",A={filePath:typeof r=="object"&&r.file_path?r.file_path:null,fileContentSize:$};else if(e==="Bash"){let f=dt.test(P),g=Z!==void 0&&Z!==0;Q=!f||g,E=g?"bash_error":"bash_command",A={command:P||e,exitCode:Z??null,stderr:ct??null};}else e==="Agent"?(E="subagent",A={subagentType:typeof r=="object"&&r.subagent_type?r.subagent_type:null,description:typeof r=="object"&&r.description?String(r.description).slice(0,200):null}):e==="WebSearch"||e==="WebFetch"?(E=e==="WebSearch"?"web_search":"web_fetch",A={query:typeof r=="object"&&r.query?String(r.query).slice(0,200):null}):(Q=false,E="tool_use",A={});if(Q){let f={id:t.tool_use_id?`memory:${Me(s??"",t.tool_use_id)}`:`evt:${Date.now()}:${Math.random().toString(36).slice(2,7)}`,sessionId:s??"",tool:e,kind:E,payload:{...A,durationMs:y?Math.max(0,Date.now()-y.timestamp):0},createdAt:Date.now()};s&&N(`/api/memory/session-events?rootPath=${encodeURIComponent(o)}`,f);}let lt=Ue({toolName:e,toolResponse:i,sessionId:s,toolUseId:t.tool_use_id,runtimeStore:a}),ut=s?ze({projectRoot:o,sessionId:s,executionId:d?.executionId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id}):null;return [lt,ut].filter(f=>!!f).join(`
6
+ `,{encoding:"utf8",mode:384}),h({event:"canonical.action.validated",identity:{projectRoot:n.projectRoot,sessionId:n.sessionId,executionId:t.executionId,contextReceipt:t.contextReceipt},level:n.success?"info":"warn",timestamp:e,data:{stage:"host_file_state_completed",valid:n.success,operation:t.operation,targetPath:relative(n.projectRoot,t.path),beforeHash:t.before.hash,afterHash:o.after.hash,beforeExists:t.before.exists,afterExists:o.after.exists,reason:o.error,toolUseId:t.toolUseId}}),o}function Gn(n){if(!existsSync$1(n))return {exists:false};try{return {exists:!0,hash:createHash$1("sha256").update(readFileSync$1(n)).digest("hex")}}catch{return {exists:true}}}function We(n){return join(D(n),"file-state")}function Ge(n){return join(We(n),"pending.json")}function Zn(n){return join(We(n),"observations.jsonl")}function Qn(n){try{return JSON.parse(readFileSync$1(Ge(n),"utf8"))}catch{return {}}}function Xn(n,t){let e=Ge(n),o=Qn(n),r=o[t];if(r)return delete o[t],Yn(e,JSON.stringify(o)),r}function Yn(n,t){let e=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync$1(e,t,{encoding:"utf8",mode:384}),renameSync$1(e,n);}var to={open:["intent_bound"],intent_bound:["context_ready","context_degraded"],context_ready:["action_required","action_not_required"],context_degraded:["action_required","action_not_required"],action_required:["action_satisfied","action_degraded","action_failed"],action_not_required:["memory_decided","memory_quarantined"],action_satisfied:["memory_decided","memory_quarantined"],action_degraded:["memory_decided","memory_quarantined"],action_failed:["action_satisfied","action_degraded"],memory_decided:["closed","closed_with_degradation","closed_with_retry_work"],memory_quarantined:["closed_with_degradation","closed_with_retry_work"],closed:[],closed_with_degradation:[],closed_with_retry_work:[]};function no(n){return oo(n)}function oo(n){let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=ao(t,n.artifact);if(co(e.toState))return e;let o=t.getContextReceiptForRequest(n.artifact.projectRoot,n.artifact.sessionId,n.artifact.requestId),r=t.getMemoryTurn(n.artifact.turnId),i=n.artifact.intent==="memory"||r?.source==="explicit_intent";if(!o&&!i)return e;let s=o?ro(n.artifact,o):"context_ready";e.toState==="intent_bound"&&(e=v(t,e,n,s,i?"task_context_not_required":s==="context_ready"?"canonical_context_receipt_ready":"canonical_context_receipt_degraded"));let a=o?io(n.artifact,o):"action_not_required";if((e.toState==="context_ready"||e.toState==="context_degraded")&&(a==="action_not_required"?e=v(t,e,n,"action_not_required","task_action_not_required"):e=v(t,e,n,"action_required","canonical_action_obligation_present")),e.toState==="action_required"){if(a==="action_required")return e;if(a==="action_failed")return v(t,e,n,"action_failed","canonical_action_attempt_failed");a==="action_degraded"?e=v(t,e,n,"action_degraded","canonical_action_unavailable_or_degraded"):a==="action_satisfied"&&(e=v(t,e,n,"action_satisfied","canonical_action_succeeded"));}if(e.toState==="action_failed")if(a==="action_satisfied")e=v(t,e,n,"action_satisfied","canonical_action_retry_succeeded");else if(a==="action_degraded")e=v(t,e,n,"action_degraded","canonical_action_retry_degraded");else return e;let c=s==="context_degraded"||a==="action_degraded";return ["action_not_required","action_satisfied","action_degraded"].includes(e.toState)&&(e=v(t,e,n,n.memoryStatus==="pending"?"memory_quarantined":"memory_decided",n.memoryStatus==="pending"?n.reason:`canonical_memory_${n.memoryStatus}`)),e.toState==="memory_decided"?v(t,e,n,c?"closed_with_degradation":"closed",n.reason):e.toState==="memory_quarantined"?v(t,e,n,n.retryOwned?"closed_with_retry_work":"closed_with_degradation",n.retryOwned?"durable_retry_owner_confirmed":"terminal_obligation_unowned"):e}finally{t.close();}}function Qe(n){let t=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{let e=t.getActiveContextReceipt(n.projectRoot,n.sessionId,n.executionId),o=typeof e?.canonicalAction?.binding.turnId=="string"?e.canonicalAction.binding.turnId:void 0;if(!o)return null;let r=t.listLatestTaskIntentArtifacts(n.projectRoot,n.sessionId).find(s=>s.turnId===o),i=t.getMemoryTurn(o);return !r||!i?null:no({artifact:r,memoryStatus:i.status,memoryReceiptId:i.receiptId,reason:n.reason})}finally{t.close();}}function ro(n,t){return n.intent==="memory"||n.intent==="knowledge"||(t.selectedFiles?.length??0)>0?"context_ready":"context_degraded"}function io(n,t){let e=t.canonicalAction,r=(e?(t.actionAttempts??[]).filter(i=>i.tool===e.tool):[]).at(-1);return t.actionSatisfiedAt||r?.status==="succeeded"?"action_satisfied":r&&["failed","timeout","unavailable"].includes(r.status)?"action_failed":t.actionDegradation||e?.status==="degraded"||e?.status==="unsupported"?"action_degraded":e?.required||so(n)?"action_required":"action_not_required"}function so(n){return ["create","modify","debug","test","format"].includes(n.action)||["feature","refactor","performance"].includes(n.intent)}function ao(n,t){let e=n.getLatestTerminalTransition(t.projectRoot,t.sessionId,t.turnId);if(!e)throw new Error(`TERMINAL_INTENT_STATE_MISSING:${t.turnId}`);return e}function v(n,t,e,o,r){if(!to[t.toState]?.includes(o))throw new Error(`TERMINAL_PATH_UNAVAILABLE:${t.toState}->${o}`);let i=t.sequence+1,s=`terminal:${createHash$1("sha256").update(`${e.artifact.artifactHash}\0${i}\0${o}`).digest("hex").slice(0,24)}`,a=n.appendTerminalTransition({projectRoot:e.artifact.projectRoot,projectId:e.artifact.projectId,hostId:e.artifact.hostId,sessionId:e.artifact.sessionId,turnId:e.artifact.turnId,requestId:e.artifact.requestId,executionId:e.artifact.executionId,sequence:i,fromState:t.toState,toState:o,receiptId:s,sourceReceiptId:e.memoryReceiptId??t.receiptId,reason:r,payload:{memoryStatus:e.memoryStatus,retryOwned:e.retryOwned??false,sourceIntentHash:e.artifact.artifactHash},createdAt:Date.now()});return h({event:"terminal.state.transitioned",identity:{projectRoot:e.artifact.projectRoot,projectId:e.artifact.projectId,hostId:e.artifact.hostId,sessionId:e.artifact.sessionId,turnId:e.artifact.turnId,requestId:e.artifact.requestId,...e.artifact.executionId?{executionId:e.artifact.executionId}:{}},level:o==="closed"?"info":o.includes("degradation")||o.includes("retry")||o==="action_failed"?"warn":"info",timestamp:Date.now(),data:{fromState:t.toState,nextState:o,receiptId:s,reason:r}}),a}function co(n){return n==="closed"||n==="closed_with_degradation"||n==="closed_with_retry_work"}function Xe(n){let t=n.hook==="post_tool_use_failure"||!!n.error?.trim()||lo(n.response),e=t?"not_consumed":n.hook==="post_tool_use"?"consumed":"unknown",o=t?uo(n.error,n.response):e==="consumed"?"host_reported_success":"host_outcome_unknown";return {schemaVersion:"host-tool-outcome.v1",toolName:n.toolName,...n.toolUseId?{toolUseId:n.toolUseId}:{},consumption:e,reasonCode:o,receiptId:n.toolUseId??`host-tool:${n.toolName}:${o}`}}function lo(n){if(!n||typeof n!="object"||Array.isArray(n))return false;let t=n;return t.isError===true||t.error?true:typeof t.status=="string"&&["failed","error","rejected","timeout","unavailable"].includes(t.status.toLowerCase())}function uo(n,t){let e=`${n??""} ${JSON.stringify(t??"")}`;return /timeout|timed out|deadline/iu.test(e)?"host_tool_timeout":/unavailable|not found|not registered|unsupported/iu.test(e)?"host_tool_unavailable":"host_tool_failed"}function et(){return generateKeyPairSync("ed25519")}function tt(n){let t=parseTrustedDecisionCommand(n.rawUserEvent,n.allowedOptionIds),e=n.now??Date.now(),o={schemaVersion:"delivery-user-attestation.v1",issuer:n.issuer,keyId:n.keyId,purpose:t.purpose,decisionId:t.decisionId,caseId:n.caseId,caseVersion:n.caseVersion,sessionId:n.sessionId,sourceTurnId:n.sourceTurnId,actorId:n.actorId,targetDecisionHash:n.targetDecisionHash,rawUserEvent:n.rawUserEvent,rawUserEventHash:domainHash("raw-user-event",n.rawUserEvent),selectedValueHash:domainHash("decision-value",{decisionId:t.decisionId,purpose:t.purpose,value:encodeDecisionValue(t.purpose,t.value)}),eventSequence:n.eventSequence,issuedAt:new Date(e).toISOString(),expiresAt:new Date(e+6e4).toISOString(),nonce:n.nonce};return {...o,attestation:sign(null,canonicalJsonBytes(o),n.privateKey).toString("base64url")}}var nt=new Map,ot=new Map;function rt(n){if(typeof n=="string")return /\bDevFlow decision ([A-Za-z0-9._:-]+)/u.exec(x(n))?.[1]}function x(n){return n.replace(/[\u0000-\u001f\u007f\ufffd]+/gu,"").replace(/\s+/gu," ").trim()}function Io(n){if(typeof n=="string")return n.trim()||void 0;if(!n||typeof n!="object"||Array.isArray(n))return;let t=n.answers;if(!t||typeof t!="object"||Array.isArray(t))return;let e=Object.values(t);if(e.length!==1)return;let o=e[0];if(!(Array.isArray(o)||typeof o!="string"))return o.trim()||void 0}async function it(n){if(n.toolName!=="AskUserQuestion")return {handled:false};let t=n.toolInput&&typeof n.toolInput=="object"&&!Array.isArray(n.toolInput)?n.toolInput:{};if(!Array.isArray(t.questions)||t.questions.length!==1)return {handled:false};let e=t.questions[0],o=wo(n.projectRoot),r=rt(e.header)??rt(e.question);if(!r){let g=await o.pendingDecisionForSession(n.sessionId);if(!g||"ambiguous"in g||g.decision.kind!=="artifact_approval")return {handled:false};r=g.decision.id;}let i=r.split(/:(?:decision|question|approval):/u)[0],s=await o.pendingDecision(i);if(!s||s.id!==r)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: no pending decision matches ${r}. Refresh delivery_status.`};let a=Array.isArray(e.options)?e.options.map(g=>({label:typeof g.label=="string"?x(g.label):"",description:typeof g.description=="string"?x(g.description):""})):[],c=createHash$1("sha256").update(JSON.stringify({decisionId:r,question:x(String(e.question??"")),options:a})).digest("hex"),l=`${n.sessionId}:${r}`,d=ot.get(l);if(d&&d.hash===c&&d.sourceTurnId===(n.sourceTurnId??n.toolUseId))return {handled:true,resolved:false,message:`DevFlow interactive decision ${r} was already presented in this host turn. Reuse the existing answer or refresh delivery_status after resolution.`};ot.set(l,{hash:c,sourceTurnId:n.sourceTurnId??n.toolUseId,count:(d?.count??0)+1});let u=Io(n.toolResponse),p=u?x(u):void 0;if(!p)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: AskUserQuestion returned no single answer for ${r}. Use /devflow:decide ${r} -- <answer> if this is a free-form clarification.`};if(e.multiSelect===true)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${r} must be a single selection.`};let y;if(s.options.length>0){let g=s.options.map(w=>({label:x(w.label),description:w.description?x(w.description):""}));if(a.length!==g.length||a.some((w,P)=>w.label!==g[P]?.label||w.description!==g[P]?.description))return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: the displayed options do not match the pending decision ${r}. Refresh delivery_status and render its options verbatim.`};let S=s.options.find(w=>x(w.label)===p);if(!S)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: answer does not match a pending option for ${r}.`};s.kind==="artifact_approval"?y=S.id==="approve"?`/devflow:approve ${r}`:`/devflow:reject ${r} -- ${p}`:y=`/devflow:decide ${r} ${S.id}`;}else {if(a.length>0)return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${r} is a free-form clarification and must not be rendered as a choice list.`};y=`/devflow:decide ${r} -- ${p}`;}let b=process.env.DEVFLOW_HOST_ACTOR_ID?.trim()||`user:${process.env.USER?.trim()||"local"}`,k=et(),$=tt({rawUserEvent:y,issuer:"claude-code",keyId:"session-ephemeral",caseId:i,caseVersion:s.caseVersion,sessionId:n.sessionId,sourceTurnId:n.sourceTurnId?.trim()||n.toolUseId?.trim()||`host-turn:${n.sessionId}:${Date.now()}`,actorId:b,targetDecisionHash:s.targetDecisionHash,eventSequence:Date.now(),nonce:randomUUID$1(),privateKey:k.privateKey,allowedOptionIds:s.options.map(g=>g.id)});try{return await o.resolveTrustedDecision({evidence:$,publicKey:k.publicKey,expectedIssuer:"claude-code",expectedKeyId:"session-ephemeral"}),{handled:!0,resolved:!0,message:`DevFlow interactive decision resolved for ${i}. Refresh delivery_status and follow nextActions.`}}catch(g){return {handled:true,resolved:false,message:`DevFlow interactive decision rejected: ${g instanceof Error?g.message:String(g)}`}}}function wo(n){let t=nt.get(n);if(t)return t;let e=createTrustedDeliveryFacade(n);return nt.set(n,e),e}function st(n){if(!n)return;let t=typeof n.status=="string"?n.status:void 0;if(!(n.ok===false||n.success===false||n.isError===true||t==="failed"||t==="rejected"||!!n.error))return;let o=n.error;if(typeof o=="string"&&o.trim())return o;if(o&&typeof o=="object"){let r=o;if(typeof r.message=="string"&&r.message.trim())return r.message;if(typeof r.code=="string"&&r.code.trim())return r.code}return t?`Tool response status: ${t}`:"Tool response reported failure"}function To(n,t,e,o){try{let r=join$1(D(n),"event-map.json");if(!existsSync(r))return null;let i=JSON.parse(readFileSync(r,"utf-8")),s=i.filter(l=>l.toolName===e&&(!l.sessionId||l.sessionId===t));if(s.length===0)return null;let a=o?s.find(l=>l.toolUseId===o):s.sort((l,d)=>l.timestamp-d.timestamp)[0];if(!a)return null;let c=i.findIndex(l=>l.eventId===a.eventId);return c!==-1&&i.splice(c,1),writeFileSync(r,JSON.stringify(i)),{eventId:a.eventId,timestamp:a.timestamp}}catch{return null}}function at(n){if(!n)return 0;let t=n;if(typeof n=="string")try{t=JSON.parse(n);}catch{return 1}let e=t,o=["files","results","data","result","memories","nodes","chunks","findings","symbols","keySymbols"],r=["reasoning","riskHints","nextActions"],i=Array.isArray(e.data)?e.data:e.structuredContent??e;if(Array.isArray(i))return i.length;if(typeof i=="object"&&i!==null){let s=i,a=0,c=false;for(let d of o)Array.isArray(s[d])&&(c=true,a+=s[d].length);for(let d of r)Array.isArray(s[d])&&(a+=s[d].length);for(let[,d]of Object.entries(s))d&&typeof d=="object"&&!Array.isArray(d)&&(a+=at(d));let l=!!(s._devflow||s._devflow_unique||s.taskType);return a===0&&l&&!c?1:a>0?a:c?0:Object.keys(s).length>0?1:0}return 0}async function Oo(n){if(!n)return null;let t;try{t=JSON.parse(n);}catch{return null}let e=t.tool_name||"",o=te(),r=t.tool_input||{},i=t.tool_response||{},s=t.session_id?.trim()||null,a=new T(o);if(s&&a.registerSession(s),s){let f=await it({projectRoot:o,sessionId:s,sourceTurnId:a.get(s)?.activeTurnId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id});if(f.handled)return f.message}let c=resolveClaudeToolName(e,r),l=c.status==="unsupported"?void 0:c.canonicalName;if(s&&l==="get_project_context"&&a.completeContextInitialization(s,t.tool_use_id),e==="Skill"){let f=typeof r=="object"&&r.skill?r.skill:"",m=Le(f);s&&m&&(a.startExecution(s,m,qe(m)),se(o,{lastMcpCall:Math.floor(Date.now()/1e3),bypassCount:0}));}let d=s?a.get(s):null;if(e.startsWith("mcp__")){let f=new H(o,s??void 0,d?.executionId??s??void 0);f.recordMcpCall();let m=st(typeof i=="object"&&i!==null?i:null),_=l??e,X=f.getContextReceipt?.()?.canonicalAction?.tool===_;if((f.recordDomainActionOutcome(_,m?Co(m):"succeeded",m,t.tool_use_id)||X)&&s){let O=Xe({hook:"post_tool_use",toolName:_,...t.tool_use_id?{toolUseId:t.tool_use_id}:{},response:i,...m?{error:m}:{}});F({projectRoot:o,sessionId:s,executionId:d?.executionId??s,kind:O.consumption==="consumed"?"action.succeeded":"action.failed",payload:{receiptId:O.receiptId,reasonCode:O.reasonCode,consumption:O.consumption,tool:_},dedupeKey:`${O.receiptId}:${O.consumption}`,producer:"devflow-post-tool-use"});try{Qe({projectRoot:o,sessionId:s,executionId:d?.executionId??s,reason:m?"post_tool_action_failed":"post_tool_action_succeeded"});}catch{}}}s&&Ve({projectRoot:o,sessionId:s,executionId:d?.executionId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id});let u=s?To(o,s,e,t.tool_use_id):null,p=s&&t.tool_use_id&&!u?(()=>{try{let f=openGlobalDevFlowDatabase();try{return f.getToolCallEventByToolUseId(s,t.tool_use_id)}finally{f.close();}}catch{return null}})():null,y=u??p,b=typeof i=="object"&&i!==null?i:null,k=JSON.stringify(i),$=Buffer.byteLength(k,"utf8"),g=at(i),S=st(b);if(s&&Je({projectRoot:o,sessionId:s,toolUseId:t.tool_use_id,success:!S,error:S}),d?.executionId!==void 0||l!==void 0||e==="Skill"){let f=getLogWriter(o),m=d?.executionId??`auto-${s??Date.now()}`;f.toolCall({tool:e,runId:m,stepId:`step-${m}`,input:r,output:i,duration:y?Math.max(0,Date.now()-y.timestamp):0,success:!b?.error,resultCount:g,resultSizeBytes:$,error:b?.error});}if(y&&s){let f=typeof i=="string"?i:JSON.stringify(i),m=f.length>5e3?{_truncated:true,_originalSize:f.length,text:f.slice(0,5e3)}:i,_=S,X=_?classifyWorkflowFailure({stepId:e,toolName:e,output:i,error:new Error(_),errorStack:_}).category:void 0;await new B().completeEvent({eventId:y.eventId,sessionId:s,output:m,error:_,failureCategory:X,duration:y?Math.max(0,Date.now()-y.timestamp):0,completedAt:Date.now()});}let P=typeof r=="object"&&r.command?r.command:"",Z=b?.exitCode,ct=b?.stderr,dt=/^\s*(ls|cat|pwd|cd|echo|head|tail|wc|which|whoami|date|env|printenv|id|hostname|uname)\b/,E,A,Q=true;if(e.startsWith("mcp__"))E="mcp_call",A={mcpTool:l??e,query:typeof r=="object"&&r.query?r.query:null,resultCount:g,resultSizeBytes:$};else if(e==="Read"||e==="Write"||e==="Edit")E=e==="Read"?"file_read":"file_write",A={filePath:typeof r=="object"&&r.file_path?r.file_path:null,fileContentSize:$};else if(e==="Bash"){let f=dt.test(P),m=Z!==void 0&&Z!==0;Q=!f||m,E=m?"bash_error":"bash_command",A={command:P||e,exitCode:Z??null,stderr:ct??null};}else e==="Agent"?(E="subagent",A={subagentType:typeof r=="object"&&r.subagent_type?r.subagent_type:null,description:typeof r=="object"&&r.description?String(r.description).slice(0,200):null}):e==="WebSearch"||e==="WebFetch"?(E=e==="WebSearch"?"web_search":"web_fetch",A={query:typeof r=="object"&&r.query?String(r.query).slice(0,200):null}):(Q=false,E="tool_use",A={});if(Q){let f={id:t.tool_use_id?`memory:${Me(s??"",t.tool_use_id)}`:`evt:${Date.now()}:${Math.random().toString(36).slice(2,7)}`,sessionId:s??"",tool:e,kind:E,payload:{...A,durationMs:y?Math.max(0,Date.now()-y.timestamp):0},createdAt:Date.now()};s&&N(`/api/memory/session-events?rootPath=${encodeURIComponent(o)}`,f);}let lt=Ue({toolName:e,toolResponse:i,sessionId:s,toolUseId:t.tool_use_id,runtimeStore:a}),ut=s?ze({projectRoot:o,sessionId:s,executionId:d?.executionId,toolName:e,toolInput:r,toolResponse:i,toolUseId:t.tool_use_id}):null;return [lt,ut].filter(f=>!!f).join(`
7
7
 
8
8
  `)||null}function Co(n){return /timeout|timed out|deadline|warming/i.test(n)?"timeout":/unavailable|not active|unknown tool|not found|not registered|route not found/i.test(n)?"unavailable":"failed"}if(process.argv[1]?.endsWith("post-tool-use")||process.argv[1]?.endsWith("post-tool-use.js")){let n=console.log.bind(console);console.log=console.error.bind(console),console.info=console.error.bind(console);let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",e=>{t+=e;}),process.stdin.on("end",async()=>{let e=await Oo(t.trim()||process.argv[2]||"");n(JSON.stringify(e?{hookSpecificOutput:{hookEventName:"PostToolUse",additionalContext:e}}:{status:"ok"}));}),process.stdin.on("error",()=>process.exit(0)),setTimeout(()=>process.exit(0),5e3).unref();}export{Oo as handlePostToolUse};
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "manifestVersion": "devflow-runtime.v1",
3
- "packageVersion": "0.18.48",
4
- "sourceCommit": "fe2d4e0c0feee28dc2df45a5ce10a54bd16e879a",
3
+ "packageVersion": "0.18.49",
4
+ "sourceCommit": "f7da1ed1ecf4cb34683bf9edfcfb63d438fb6f62",
5
5
  "bundleHashes": {
6
6
  "hooks": "2f643b50f8bd4f38f1304ee16a788f6cb15bf94a17108d698255471f3769b75a",
7
7
  "mcp": "75854e4930143d9d271eae5026df98d2da75b920235a5bd52bb950c46c00d3fc",
8
8
  "cli": "f814d174f9d909e499d10a9ccf70568d9b1d362ca70fd994e18965ebe5dd6b8f"
9
9
  },
10
- "registryHash": "d7843026587a23ba5d0e015e707e712b4e8863f8e8ecec9c7f42c976fbb08175",
10
+ "registryHash": "f5443a6756b217cd8066c138dc65fecc12342b13882983aefa4d8e8f70faea48",
11
11
  "stateDbPath": "<projectRoot>/.devflow/delivery-line/state.db",
12
- "builtAt": 1791811421096,
13
- "manifestHash": "33edb1108079347cf6df8c5f40645b2c9683c00c968cf6bc9e3bb30da1eba056"
12
+ "builtAt": 1791861779500,
13
+ "manifestHash": "4c493b427a781bbb6b8b151ea49323a5c265e4b3a8f25d121f3a675a2fc92a89"
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/claude-code-plugin",
3
- "version": "0.18.48",
3
+ "version": "0.18.49",
4
4
  "description": "Claude Code hooks and skills for the DevFlow development intelligence runtime.",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -12,20 +12,20 @@
12
12
  "verify:runtime-dependencies": "node --import tsx scripts/verify-runtime-dependencies.ts"
13
13
  },
14
14
  "dependencies": {
15
- "@devflow-tools/benchmark": "0.18.48",
16
- "@devflow-tools/context-engine": "0.18.48",
17
- "@devflow-tools/database": "0.18.48",
18
- "@devflow-tools/mcp-server": "0.18.48",
19
- "@devflow-tools/memory-engine": "0.18.48",
20
- "@devflow-tools/sdk": "0.18.48",
21
- "@devflow-tools/semantic-engine": "0.18.48",
22
- "@devflow-tools/server": "0.18.48",
23
- "@devflow-tools/task-runtime": "0.18.48",
24
- "@devflow-tools/telemetry": "0.18.48",
25
- "@devflow-tools/workflow-engine": "0.18.48"
15
+ "@devflow-tools/benchmark": "0.18.49",
16
+ "@devflow-tools/context-engine": "0.18.49",
17
+ "@devflow-tools/database": "0.18.49",
18
+ "@devflow-tools/mcp-server": "0.18.49",
19
+ "@devflow-tools/memory-engine": "0.18.49",
20
+ "@devflow-tools/sdk": "0.18.49",
21
+ "@devflow-tools/semantic-engine": "0.18.49",
22
+ "@devflow-tools/server": "0.18.49",
23
+ "@devflow-tools/task-runtime": "0.18.49",
24
+ "@devflow-tools/telemetry": "0.18.49",
25
+ "@devflow-tools/workflow-engine": "0.18.49"
26
26
  },
27
27
  "devDependencies": {
28
- "@devflow-tools/devflow": "0.18.48"
28
+ "@devflow-tools/devflow": "0.18.49"
29
29
  },
30
30
  "allowScripts": {
31
31
  "better-sqlite3@12.11.1": true,
@@ -5,4 +5,8 @@ argument-hint: [optional decision-id]
5
5
  disable-model-invocation: true
6
6
  ---
7
7
 
8
- /devflow:approve $ARGUMENTS
8
+ This command is a compatibility fallback for an explicitly typed user command.
9
+ Do not invoke it to implement an approval flow and do not ask the user to type
10
+ it. The delivery workflow must render the current artifact approval options
11
+ with `AskUserQuestion`; the host PostToolUse hook consumes the selected option
12
+ and signs the approval automatically.
@@ -66,7 +66,7 @@ description: 通过可审计 Delivery Line 将需求推进到验证完成的 int
66
66
  `<projectRoot>/.devflow/delivery-line/artifacts/<caseId>/<artifact.path>`,只给出不重复的关键摘要和风险。必须调用 `AskUserQuestion` 让用户选择批准或退回;不要要求用户复制命令。
67
67
  宿主会将选择映射为精确审批事件。Slash command 仅是宿主原生交互不可用时的 fallback,不得把命令
68
68
  作为默认交互,也不得由 agent 调用 MCP mutation 模拟用户批准或拒绝。
69
- - 用户需要手动批准时,优先提示 `/devflow:approve`,系统会在当前 session 只有一个待审批 gate 时自动绑定当前案件;不要要求用户复制 decision UUID。仅在存在多个待审批案件或快捷命令无法解析时,才显示完整 decisionId 或回到原生 `AskUserQuestion`。
69
+ - 审批必须始终通过原生 `AskUserQuestion` 选项完成;宿主会按当前 session 唯一待审批 gate 自动绑定并签名消费选择。只有用户明确输入兼容命令时才处理 `/devflow:approve`,不得把命令作为提示或默认交互。
70
70
  - `/devflow:revise`、`/devflow:cancel` 和 `/devflow:exit` 尚未注册为可信命令;仅使用当前 `nextActions` 已实现的路径,不得向用户展示不存在的命令。
71
71
  - 审批返回后不要结束会话:立即调用 `delivery_status`,按返回的 `nextActions` 连续推进;只有出现新的
72
72
  人工 gate、明确 blocker、终态或用户明确暂停时才结束。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/devflow",
3
- "version": "0.18.48",
3
+ "version": "0.18.49",
4
4
  "type": "module",
5
5
  "description": "Installable DevFlow distribution containing the CLI, runtime hooks, and Claude plugin.",
6
6
  "bin": {
@@ -21,21 +21,21 @@
21
21
  },
22
22
  "dependencies": {
23
23
  "@colbymchenry/codegraph": "^1.1.1",
24
- "@devflow-tools/adapters": "0.18.48",
25
- "@devflow-tools/benchmark": "0.18.48",
26
- "@devflow-tools/context-engine": "0.18.48",
27
- "@devflow-tools/database": "0.18.48",
28
- "@devflow-tools/delivery-line": "0.18.48",
29
- "@devflow-tools/knowledge-engine": "0.18.48",
30
- "@devflow-tools/mcp-server": "0.18.48",
31
- "@devflow-tools/memory-engine": "0.18.48",
32
- "@devflow-tools/retrieval-engine": "0.18.48",
33
- "@devflow-tools/sdk": "0.18.48",
34
- "@devflow-tools/semantic-engine": "0.18.48",
35
- "@devflow-tools/server": "0.18.48",
36
- "@devflow-tools/task-runtime": "0.18.48",
37
- "@devflow-tools/telemetry": "0.18.48",
38
- "@devflow-tools/workflow-engine": "0.18.48",
24
+ "@devflow-tools/adapters": "0.18.49",
25
+ "@devflow-tools/benchmark": "0.18.49",
26
+ "@devflow-tools/context-engine": "0.18.49",
27
+ "@devflow-tools/database": "0.18.49",
28
+ "@devflow-tools/delivery-line": "0.18.49",
29
+ "@devflow-tools/knowledge-engine": "0.18.49",
30
+ "@devflow-tools/mcp-server": "0.18.49",
31
+ "@devflow-tools/memory-engine": "0.18.49",
32
+ "@devflow-tools/retrieval-engine": "0.18.49",
33
+ "@devflow-tools/sdk": "0.18.49",
34
+ "@devflow-tools/semantic-engine": "0.18.49",
35
+ "@devflow-tools/server": "0.18.49",
36
+ "@devflow-tools/task-runtime": "0.18.49",
37
+ "@devflow-tools/telemetry": "0.18.49",
38
+ "@devflow-tools/workflow-engine": "0.18.49",
39
39
  "@inquirer/prompts": "^7.10.1",
40
40
  "@modelcontextprotocol/sdk": "^1.32.1",
41
41
  "@nestjs/common": "^12.1.2",
@@ -1,118 +1,118 @@
1
1
  {
2
2
  "version": "1.0.0",
3
- "lastUpdated": "2026-10-12T13:18:57.920Z",
3
+ "lastUpdated": "2026-10-13T03:19:31.298Z",
4
4
  "plugins": [
5
5
  {
6
6
  "name": "@devflow-tools/plugin-animation",
7
- "version": "0.18.48",
7
+ "version": "0.18.49",
8
8
  "description": "Animation analysis and generation tools for DevFlow.",
9
9
  "tags": [],
10
10
  "compatibleStacks": [
11
11
  "animation"
12
12
  ],
13
- "size": "84916 B",
13
+ "size": "85092 B",
14
14
  "author": "DevFlow Team",
15
15
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
16
16
  },
17
17
  {
18
18
  "name": "@devflow-tools/plugin-css",
19
- "version": "0.18.48",
19
+ "version": "0.18.49",
20
20
  "description": "CSS analysis and selector audit tools for DevFlow.",
21
21
  "tags": [],
22
22
  "compatibleStacks": [
23
23
  "css"
24
24
  ],
25
- "size": "71941 B",
25
+ "size": "72111 B",
26
26
  "author": "DevFlow Team",
27
27
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
28
28
  },
29
29
  {
30
30
  "name": "@devflow-tools/plugin-docker",
31
- "version": "0.18.48",
31
+ "version": "0.18.49",
32
32
  "description": "Docker configuration and diagnostic tools for DevFlow.",
33
33
  "tags": [],
34
34
  "compatibleStacks": [
35
35
  "docker"
36
36
  ],
37
- "size": "100744 B",
37
+ "size": "100917 B",
38
38
  "author": "DevFlow Team",
39
39
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
40
40
  },
41
41
  {
42
42
  "name": "@devflow-tools/plugin-electron",
43
- "version": "0.18.48",
43
+ "version": "0.18.49",
44
44
  "description": "Electron application analysis and implementation tools for DevFlow.",
45
45
  "tags": [],
46
46
  "compatibleStacks": [
47
47
  "electron"
48
48
  ],
49
- "size": "116600 B",
49
+ "size": "116775 B",
50
50
  "author": "DevFlow Team",
51
51
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
52
52
  },
53
53
  {
54
54
  "name": "@devflow-tools/plugin-git",
55
- "version": "0.18.48",
55
+ "version": "0.18.49",
56
56
  "description": "Git repository analysis and workflow tools for DevFlow.",
57
57
  "tags": [],
58
58
  "compatibleStacks": [
59
59
  "git"
60
60
  ],
61
- "size": "82262 B",
61
+ "size": "82432 B",
62
62
  "author": "DevFlow Team",
63
63
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
64
64
  },
65
65
  {
66
66
  "name": "@devflow-tools/plugin-graphql",
67
- "version": "0.18.48",
67
+ "version": "0.18.49",
68
68
  "description": "GraphQL schema and operation tools for DevFlow.",
69
69
  "tags": [],
70
70
  "compatibleStacks": [
71
71
  "graphql"
72
72
  ],
73
- "size": "84513 B",
73
+ "size": "84687 B",
74
74
  "author": "DevFlow Team",
75
75
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
76
76
  },
77
77
  {
78
78
  "name": "@devflow-tools/plugin-nest",
79
- "version": "0.18.48",
79
+ "version": "0.18.49",
80
80
  "description": "NestJS analysis and implementation tools for DevFlow.",
81
81
  "tags": [],
82
82
  "compatibleStacks": [
83
83
  "nest"
84
84
  ],
85
- "size": "121129 B",
85
+ "size": "121300 B",
86
86
  "author": "DevFlow Team",
87
87
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
88
88
  },
89
89
  {
90
90
  "name": "@devflow-tools/plugin-nextjs",
91
- "version": "0.18.48",
91
+ "version": "0.18.49",
92
92
  "description": "Next.js analysis and implementation tools for DevFlow.",
93
93
  "tags": [],
94
94
  "compatibleStacks": [
95
95
  "nextjs"
96
96
  ],
97
- "size": "82843 B",
97
+ "size": "83016 B",
98
98
  "author": "DevFlow Team",
99
99
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
100
100
  },
101
101
  {
102
102
  "name": "@devflow-tools/plugin-performance",
103
- "version": "0.18.48",
103
+ "version": "0.18.49",
104
104
  "description": "Web performance audit and optimization tools for DevFlow.",
105
105
  "tags": [],
106
106
  "compatibleStacks": [
107
107
  "performance"
108
108
  ],
109
- "size": "133324 B",
109
+ "size": "133502 B",
110
110
  "author": "DevFlow Team",
111
111
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
112
112
  },
113
113
  {
114
114
  "name": "@devflow-tools/plugin-react",
115
- "version": "0.18.48",
115
+ "version": "0.18.49",
116
116
  "description": "React analysis, audit, and component tools for DevFlow.",
117
117
  "tags": [],
118
118
  "compatibleStacks": [
@@ -124,55 +124,55 @@
124
124
  "path": "scripts/run-capability.mjs",
125
125
  "timeoutMs": 30000
126
126
  },
127
- "size": "279717 B",
127
+ "size": "279889 B",
128
128
  "author": "DevFlow Team",
129
129
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
130
130
  },
131
131
  {
132
132
  "name": "@devflow-tools/plugin-tailwind",
133
- "version": "0.18.48",
133
+ "version": "0.18.49",
134
134
  "description": "Tailwind CSS analysis and component tools for DevFlow.",
135
135
  "tags": [],
136
136
  "compatibleStacks": [
137
137
  "tailwind"
138
138
  ],
139
- "size": "89288 B",
139
+ "size": "89463 B",
140
140
  "author": "DevFlow Team",
141
141
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
142
142
  },
143
143
  {
144
144
  "name": "@devflow-tools/plugin-taro",
145
- "version": "0.18.48",
145
+ "version": "0.18.49",
146
146
  "description": "Taro application analysis and implementation tools for DevFlow.",
147
147
  "tags": [],
148
148
  "compatibleStacks": [
149
149
  "taro"
150
150
  ],
151
- "size": "92814 B",
151
+ "size": "92985 B",
152
152
  "author": "DevFlow Team",
153
153
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
154
154
  },
155
155
  {
156
156
  "name": "@devflow-tools/plugin-ui-layout",
157
- "version": "0.18.48",
157
+ "version": "0.18.49",
158
158
  "description": "UI layout analysis and implementation tools for DevFlow.",
159
159
  "tags": [],
160
160
  "compatibleStacks": [
161
161
  "ui-layout"
162
162
  ],
163
- "size": "70294 B",
163
+ "size": "70470 B",
164
164
  "author": "DevFlow Team",
165
165
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
166
166
  },
167
167
  {
168
168
  "name": "@devflow-tools/plugin-vue",
169
- "version": "0.18.48",
169
+ "version": "0.18.49",
170
170
  "description": "Vue analysis, audit, and component tools for DevFlow.",
171
171
  "tags": [],
172
172
  "compatibleStacks": [
173
173
  "vue"
174
174
  ],
175
- "size": "100913 B",
175
+ "size": "101083 B",
176
176
  "author": "DevFlow Team",
177
177
  "homepage": "https://github.com/shilongfeicool/dev-flow#readme"
178
178
  }