@oberion/wildo 0.6.4

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,267 @@
1
+ import{a as D,f as H,i as U,j as o}from"./chunk-TMJX67JD.js";import{a as p,g as O,i as k,k as $,m as G,n as Y,p as J,q as Q,r as S,s as V,t as X,u as M}from"./chunk-TOAEOZEP.js";import{appendFileSync as Re,existsSync as b,mkdirSync as I,readFileSync as x,readdirSync as j,statSync as De,writeFileSync as _}from"fs";import{join as c,resolve as Se}from"path";import{readFileSync as W,existsSync as q}from"fs";import{join as E}from"path";var ye=E(import.meta.dirname,"..","personas");function B(s){let e=E(D,s,"playbook.md"),t=E(ye,s,"playbook.md"),i;if(q(e))i=W(e,"utf-8").trim();else if(q(t))i=W(t,"utf-8").trim();else throw new Error(`Playbook not found for role "${s}"`);let n=E(D,s,"experience.md");if(q(n)){let r=W(n,"utf-8").trim();if(r.split(`
2
+ `).slice(1).some(m=>m.trim()&&!m.startsWith("#")))return`${i}
3
+
4
+ ---
5
+
6
+ ## Accumulated Experience
7
+
8
+ ${r}`}return i}var _e={architect:["Read","Write","Glob","Grep"],reviewer:["Read","Glob","Grep"],reporter:["Read","Write","Glob","Grep"],developer:["Read","Write","Edit","Glob","Grep","Bash"],tester:["Read","Write","Edit","Glob","Grep","Bash"]};function ke(s,e){return{systemPrompt:B(s),tools:_e[s]??[],model:e[s]}}var Z=new Map;function L(s,e){let t=`${s}:${e[s]}`,i=Z.get(t);return i||(i=ke(s,e),Z.set(t,i)),i}var F=new Map;async function ee(s,e,t){let{Codex:i}=await import("@openai/codex-sdk"),n=t.models[s];t.onEvent?.({type:"agent_start",data:{role:s}});let r="",a=t.threadId,d;a&&F.has(a)?d=F.get(a):d=new i().startThread({model:n,approvalPolicy:"never",sandboxMode:"workspace-write",workingDirectory:t.cwd});let{events:m}=await d.runStreamed(e);for await(let h of m){if(h.type==="item.completed"&&h.item){let l=h.item;if(l.type==="agent_message"&&l.text&&(r+=l.text,t.onEvent?.({type:"content_block",data:{role:s,type:"text",text:l.text}})),l.type==="command_execution"&&t.onEvent?.({type:"content_block",data:{role:s,type:"tool_status",description:`$ ${l.command}`}}),l.type==="file_change"&&l.changes)for(let u of l.changes)t.onEvent?.({type:"content_block",data:{role:s,type:"tool_status",description:`${u.kind} ${u.path}`}})}h.type==="turn.completed"&&(a=d.id??a)}return a&&F.set(a,d),t.onEvent?.({type:"agent_done",data:{role:s}}),{output:r,threadId:a}}import{execFileSync as be}from"child_process";import{existsSync as N,writeFileSync as $e,rmSync as xe}from"fs";import{join as te}from"path";function T(s,e,t){process.stdout.write(` ${p.accent}\u2219${p.reset} ${p.gray}${o(s,e,t)}${p.reset}
9
+ `)}function w(s,...e){return be("git",e,{cwd:s,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}function ie(s,e="en"){let t=te(s,".git");if(N(t)){T(e,"git_detected");return}T(e,"git_init"),w(s,"init");let i=te(s,".gitignore");N(i)||$e(i,`__pycache__/
10
+ *.pyc
11
+ .venv/
12
+ node_modules/
13
+ .DS_Store
14
+ *.egg-info/
15
+ dist/
16
+ build/
17
+ `),w(s,"add","-A"),w(s,"commit","-m","Initial commit (pre-wildo)")}function ne(s,e,t="en"){let i=null;try{i=w(s,"rev-parse","--abbrev-ref","HEAD")}catch{}let n=new Date().toISOString().replace(/[-:T]/g,"").slice(0,14),r=`wildo/${e}/${n}`;return w(s,"checkout","-b",r),T(t,"git_branch",{branch:r}),{branch:r,originalBranch:i}}function C(s,e,t){w(s,"status","--porcelain")&&(w(s,"add","-A"),w(s,"commit","-m",t),T(e,"git_committed",{msg:t}))}function se(s,e){if(!(!e||e==="(pending)"))try{if(w(s,"rev-parse","--abbrev-ref","HEAD")===e)for(let i of["main","master"])try{w(s,"checkout",i);break}catch{continue}w(s,"branch","-D",e)}catch{}}function re(s){N(s)&&xe(s,{recursive:!0,force:!0})}function oe(s,e){let t="FAIL";/###\s*Verdict:\s*PASS/i.test(s)&&(t="PASS");let i=[],n=!1;for(let r of s.split(`
18
+ `)){if(/^###\s*Blocking Issues/i.test(r)){n=!0;continue}if(n){if(r.startsWith("###")){n=!1;continue}let a=r.trim();a&&i.push(a.replace(/^[\d.\-) ]+/,""))}}return{verdict:t,rawOutput:s,blockingIssues:i,roundNumber:e}}function ae(s){let e=s.toLowerCase(),t=[{pattern:/permission\s+denied/i,label:"permission denied"},{pattern:/read[\s-]*only\s+file\s*system/i,label:"read-only filesystem"},{pattern:/cannot\s+write/i,label:"cannot write"},{pattern:/no\s+write\s+permission/i,label:"no write permission"},{pattern:/写权限/i,label:"no write permission"},{pattern:/无法写入/i,label:"cannot write"},{pattern:/sandbox.*(?:restrict|block|deny|prevent)/i,label:"sandbox restriction"},{pattern:/command\s+not\s+found/i,label:"command not found"},{pattern:/not\s+installed/i,label:"tool not installed"},{pattern:/(?:无法|cannot|unable\s+to)\s*(?:修复|解决|fix|resolve|complete)/i,label:"cannot resolve"},{pattern:/(?:同一个|same)\s*(?:问题|issue|error|blocker)/i,label:"same recurring blocker"},{pattern:/(?:仍然|still)\s*(?:阻塞|blocked|blocking)/i,label:"still blocked"},{pattern:/authentication\s+(?:failed|error|required)/i,label:"authentication issue"},{pattern:/(?:EACCES|EPERM|EROFS)/i,label:"OS permission error"}],i=[];for(let{pattern:r,label:a}of t)r.test(s)&&i.push(a);if(i.length===0)return null;if(i.length<2){let r=t.find(({pattern:d})=>d.test(s)),a=s.match(new RegExp(r.pattern,"gi"));if(!a||a.length<2)return null}return`Fundamental blocker detected: ${[...new Set(i)].join(", ")}`}function ce(s,e,t){let i=e.flatMap(u=>u.blockingIssues),n=i.map(u=>`- ${u}`).join(`
19
+ `),r=["spec","requirement","interface","contract","ambiguous","undefined","missing definition"],a=i.filter(u=>r.some(g=>u.toLowerCase().includes(g))).length,d=i.length>0&&a>=i.length*.5,m=d?"spec_issue":"user",h=d?"Majority of issues trace back to specification gaps or ambiguities. Rolling back to architect to revise spec.":"Issues are implementation-level and persist despite feedback. Human intervention required.",l=`## Escalation Diagnosis \u2014 ${s}
20
+
21
+ ### Type: ${m}
22
+ ### Rounds: ${e.length} / ${t}
23
+
24
+ ### Recurring Issues:
25
+ ${n}
26
+
27
+ ### Analysis:
28
+ ${h}
29
+ `;return{escalationType:m,phase:s,roundsCompleted:e.length,history:e,diagnosis:l}}function le(s){return{agentName:s,contextWindow:0,totalInputTokens:0,totalOutputTokens:0,seenMessageIds:new Set}}function K(s){return s.contextWindow===0?0:(s.totalInputTokens+s.totalOutputTokens)/s.contextWindow}function de(s,e){return K(s)>=e}function he(s,e){let t=e.message_id;if(t){if(s.seenMessageIds.has(t))return;s.seenMessageIds.add(t)}e.usage&&(s.totalInputTokens+=e.usage.input_tokens??0,s.totalOutputTokens+=e.usage.output_tokens??0)}function pe(s,e){e?.contextWindow&&(s.contextWindow=e.contextWindow)}function ue(s,e,t){return`Your context window is approaching capacity. Write a handoff document so a new session can continue your work seamlessly.
30
+
31
+ Include:
32
+ 1. **Current State**: What has been completed so far
33
+ 2. **In Progress**: What you were working on when interrupted
34
+ 3. **Remaining Work**: What still needs to be done
35
+ 4. **Key Decisions**: Important decisions made and their rationale
36
+ 5. **Active Sessions**: All agent session IDs and Codex threadIds still in use
37
+ 6. **Files Modified**: List of files you created or changed
38
+ 7. **Blockers/Risks**: Any issues the next session should be aware of
39
+
40
+ Write this to: ${t}/${s}-handoff.md
41
+
42
+ Original task context:
43
+ ${e}`}function ge(s,e){return`You are resuming work from a previous session that ran out of context space.
44
+
45
+ Read the handoff document at: ${e}/${s}-handoff.md
46
+
47
+ Continue the work described in that document. Pick up exactly where the previous session left off. Do not redo completed work.`}var R=class extends Error{constructor(){super("Pipeline stopped by user"),this.name="PipelineStopped"}},P=class extends Error{phase;diagnosis;constructor(e,t,i){if(super(`User intervention required at ${e}`),this.name="UserInterventionRequired",this.phase=e,this.diagnosis=t,i){let n=c(i,`escalation-${e}.md`);I(i,{recursive:!0}),_(n,t)}}};function me(s){return{name:s,usage:le(s)}}var Ce={zh:"Chinese",ja:"Japanese",ko:"Korean",es:"Spanish",fr:"French",de:"German"},fe={greenfield:{plan:["Plan addresses all spec requirements","File structure is clear and logical","Verification approach covers all acceptance criteria"],code:["Code implements all spec requirements","Interfaces match spec contracts exactly","No placeholder or TODO implementations","Code is clean and follows project conventions"],test:["Every acceptance criterion has at least one test","Edge cases and error paths are covered","All tests pass","Tests verify behavior, not implementation details"]},feature:{plan:["Plan addresses the incremental spec requirements","Changed and new files are identified"],code:["Code implements the changes described in the spec","Existing functionality is not broken","No unrelated changes or refactoring"],test:["New feature has at least one test","Existing tests still pass","All tests pass"]},bugfix:{plan:["Plan addresses the fix described in the diagnosis","Changed files are identified"],code:["Fix addresses the root cause identified in diagnosis","Changes are minimal and surgical","No unrelated changes or refactoring"],test:["Regression test reproduces the original bug scenario","Fix verification test passes","Existing tests still pass"]}},we=class{requirement;mode;lang;workingDir;config;sessions=new Map;reviewHistories=new Map;lastQueryTime=0;originalBranch=null;workBranch=null;onEvent=null;stopped=!1;workflowRoot;knowledgeDir;modulesDir;runsDir;runId=null;runDir=null;specsDir=null;plansDir=null;reportsDir=null;handoffsDir=null;roundsDir=null;confirmCallback=null;cleanupCallback=null;constructor(e,t,i="greenfield",n="en"){this.requirement=e,this.mode=i,this.lang=n,this.workingDir=Se(t),this.workflowRoot=c(this.workingDir,".workflow"),this.knowledgeDir=c(this.workflowRoot,"knowledge"),this.modulesDir=c(this.knowledgeDir,"modules"),this.runsDir=c(this.workflowRoot,"runs")}setEventHandler(e){this.onEvent=e}setConfirmCallback(e){this.confirmCallback=e}setCleanupCallback(e){this.cleanupCallback=e}stop(){this.stopped=!0}abort(){this.stopped=!0;try{this.workBranch&&this.originalBranch&&(w(this.workingDir,"checkout",this.originalBranch),w(this.workingDir,"branch","-D",this.workBranch),this.emit("pipeline_error",{message:`Rolled back to ${this.originalBranch}`}))}catch(e){this.emit("pipeline_error",{message:`Abort rollback failed: ${e}`})}}applyAuth(e){e.claude.authMode==="api_key"&&e.claude.apiKey&&(process.env.ANTHROPIC_API_KEY=e.claude.apiKey),e.codex.authMode==="api_key"&&e.codex.apiKey&&(process.env.OPENAI_API_KEY=e.codex.apiKey)}async run(){this.config=await U(),this.applyAuth(this.config.auth);let{crashed:e,decisions:t}=await this.collectCleanupDecisions();await this.preflightConfirm(),this.onEvent||(process.stdout.write(`
48
+ `),S(`${p.accent}\u25B6${p.reset}`,`${p.white}${p.bold}${o(this.lang,"orc_starting",{mode:this.mode})}${p.reset}`)),this.emit("pipeline_done",{mode:this.mode,workingDir:this.workingDir}),ie(this.workingDir,this.lang),e.length>0&&this.applyCleanupDecisions(e,t);let i=ne(this.workingDir,this.mode,this.lang);this.workBranch=i.branch,this.originalBranch=i.originalBranch,this.initRunDir();try{(this.mode==="feature"||this.mode==="bugfix")&&!this.hasKnowledge()&&(k(o(this.lang,"orc_no_knowledge")),await this.initKnowledge(),C(this.workingDir,this.lang,"chore: initialize project knowledge"));let n;if(this.mode==="greenfield")n=await this.runGreenfield();else if(this.mode==="feature")n=await this.runFeature();else if(this.mode==="bugfix")n=await this.runBugfix();else throw new Error(`Unknown mode: ${this.mode}`);return this.finalizeRun("completed"),C(this.workingDir,this.lang,`wildo(${this.mode}): pipeline complete`),this.emit("pipeline_done",{branch:this.workBranch,report:n}),n}catch(n){if(n instanceof R){this.finalizeRun("stopped");try{C(this.workingDir,this.lang,`wildo(${this.mode}): stopped by user`)}catch{}throw n}this.finalizeRun("failed");try{C(this.workingDir,this.lang,`wildo(${this.mode}): partial (pipeline failed)`)}catch{}throw n}}emit(e,t){this.onEvent&&this.onEvent({type:e,data:t,agent:void 0,phase:void 0})}checkStopped(){if(this.stopped)throw new R}phase(e){let t=o(this.lang,e);this.onEvent||Y(t),this.emit("timeline",{phase:t})}describeTool(e,t){let i=e.includes("__")?e.split("__").pop():e,n=t.file_path??t.path??"";return["Read","read"].includes(i)?`Read ${n}`:["Write","write"].includes(i)?`Write ${n}`:["Edit","edit"].includes(i)?`Edit ${n}`:["Glob","glob"].includes(i)?`Glob ${t.pattern??""}`:["Grep","grep"].includes(i)?`Grep ${t.pattern??""}`:["Bash","bash"].includes(i)?`Bash ${(t.command??"").slice(0,80)}`:["WebFetch","webFetch"].includes(i)?`Fetch ${t.url??""}`:["WebSearch","webSearch"].includes(i)?`Search ${t.query??""}`:i}emitContentBlocks(e,t){let i=t.message?.content??t.content??[];for(let n of i)if(n.type==="text"&&n.text?.trim())this.emit("content_block",{role:e,type:"text",text:n.text});else if(n.type==="tool_use"){let r=this.describeTool(n.name,n.input??{});this.emit("content_block",{role:e,type:"tool_status",tool:n.name,description:r})}else n.type==="tool_result"&&this.emit("content_block",{role:e,type:"tool_done",toolUseId:n.tool_use_id})}timeline(e,t,i,n){this.onEvent||J(e,t,i,n),this.emit("content_block",{role:e,label:t,content:i,type:"agent_output"})}get langInstruction(){return this.lang==="en"?"":`
49
+
50
+ IMPORTANT: Write all output documents and reports in ${Ce[this.lang]??this.lang}.`}async cooldown(e=2e3){let t=Date.now()-this.lastQueryTime;t<e&&await new Promise(i=>setTimeout(i,e-t))}markQueryDone(){this.lastQueryTime=Date.now()}initRunDir(){let e=new Date().toISOString().replace(/[-:T]/g,"").slice(0,14);this.runId=e,this.runDir=c(this.runsDir,e),this.specsDir=c(this.runDir,"specs"),this.plansDir=c(this.runDir,"plans"),this.reportsDir=c(this.runDir,"reports"),this.handoffsDir=c(this.runDir,"handoffs"),this.roundsDir=c(this.runDir,"rounds");for(let t of[this.specsDir,this.plansDir,this.reportsDir,this.handoffsDir,this.knowledgeDir,this.modulesDir,this.roundsDir])I(t,{recursive:!0});this.writeManifest("running")}writeManifest(e){if(!this.runDir)return;let t=this.requirement.slice(0,100).replace(/\n/g," ");this.requirement.length>100&&(t+="...");let i=this.workBranch??"(pending)",n=`# Run: ${this.runId}
51
+
52
+ - **Mode**: ${this.mode}
53
+ - **Branch**: ${i}
54
+ - **Language**: ${this.lang}
55
+ - **Status**: ${e}
56
+ - **Working Dir**: ${this.workingDir}
57
+ - **Requirement**: ${t}
58
+ `;_(c(this.runDir,"run-manifest.md"),n)}updateRunsIndex(e){if(!this.runDir)return;let t=c(this.runsDir,"index.md"),i=this.requirement.slice(0,60).replace(/\n/g," ").replace(/\|/g,"/");this.requirement.length>60&&(i+="...");let n=this.workBranch??"",r=`| ${this.runId} | ${this.mode} | \`${n}\` | ${e} | ${i} |`;if(b(t)){let a=x(t,"utf-8");if(this.runId&&a.includes(this.runId)){let d=a.split(`
59
+ `).map(m=>this.runId&&m.includes(this.runId)?r:m);_(t,d.join(`
60
+ `))}else _(t,a+r+`
61
+ `)}else _(t,`# Pipeline Runs
62
+
63
+ | Run | Mode | Branch | Status | Requirement |
64
+ |-----|------|--------|--------|-------------|
65
+ `+r+`
66
+ `)}finalizeRun(e){this.writeManifest(e),this.updateRunsIndex(e)}scanCrashedRuns(){if(!b(this.runsDir))return[];let e=[];for(let t of j(this.runsDir).sort()){let i=c(this.runsDir,t);try{if(!De(i).isDirectory())continue}catch{continue}let n=c(i,"run-manifest.md"),r={runId:t,mode:"?",branch:"",requirement:"",status:"unknown"};if(b(n)){let a=x(n,"utf-8");if(a.includes("**Status**: completed")||a.includes("**Acknowledged**: true"))continue;for(let d of a.split(`
67
+ `))d.startsWith("- **Mode**:")?r.mode=d.split(":").slice(1).join(":").trim():d.startsWith("- **Branch**:")?r.branch=d.split(":").slice(1).join(":").trim().replace(/`/g,""):d.startsWith("- **Requirement**:")?r.requirement=d.split(":").slice(1).join(":").trim():d.startsWith("- **Status**:")&&(r.status=d.split(":").slice(1).join(":").trim())}else r.mode="(legacy)",r.requirement="(no manifest)";e.push(r)}return e}async collectCleanupDecisions(){let e=this.scanCrashedRuns();if(e.length===0)return{crashed:[],decisions:{}};let t=await this.askCleanup(e);return{crashed:e,decisions:t}}applyCleanupDecisions(e,t){for(let i of e)(t[i.runId]??"keep")==="discard"?this.discardRun(i.runId,i.branch):this.acknowledgeRun(i.runId)}async askCleanup(e){if(this.cleanupCallback)return this.cleanupCallback(e);$(o(this.lang,"orc_crashed_found",{n:String(e.length)}));let t={};for(let i of e){G(`Run: ${i.runId}`,`${p.gray}Status${p.reset} ${i.status}
68
+ ${p.gray}Mode ${p.reset} ${i.mode}
69
+ ${p.gray}Branch${p.reset} ${i.branch}
70
+ ${p.gray}Req. ${p.reset} ${i.requirement.slice(0,60)}`);let n=await O({message:i.runId,options:[{value:"keep",label:o(this.lang,"orc_cleanup_keep")},{value:"discard",label:o(this.lang,"orc_cleanup_discard")}]});t[i.runId]=n}return t}discardRun(e,t){se(this.workingDir,t),re(c(this.runsDir,e)),this.removeFromIndex(e)}acknowledgeRun(e){let t=c(this.runsDir,e,"run-manifest.md"),i="crashed";if(b(t)){let n=x(t,"utf-8");if(n.includes("**Status**: running"))n=n.replace("**Status**: running","**Status**: crashed");else{let r=n.match(/\*\*Status\*\*:\s*(\S+)/);r?i=r[1]:n=n.trimEnd()+`
71
+ - **Status**: crashed
72
+ `}n.includes("**Acknowledged**:")||(n=n.trimEnd()+`
73
+ - **Acknowledged**: true
74
+ `),_(t,n)}else I(c(this.runsDir,e),{recursive:!0}),_(t,`# Run: ${e}
75
+
76
+ - **Status**: crashed
77
+ - **Acknowledged**: true
78
+ - **Note**: Legacy run, no original manifest
79
+ `);this.updateIndexStatus(e,i)}removeFromIndex(e){let t=c(this.runsDir,"index.md");if(!b(t))return;let i=x(t,"utf-8").split(`
80
+ `);_(t,i.filter(n=>!(n.startsWith("|")&&n.includes(e))).join(`
81
+ `))}updateIndexStatus(e,t){let i=c(this.runsDir,"index.md");if(!b(i))return;let n=x(i,"utf-8").split(`
82
+ `).map(r=>{if(r.startsWith("|")&&r.includes(e)&&!r.includes("Run")){let a=r.split("|");return a.length>=6&&(a[4]=` ${t} `),a.join("|")}return r});_(i,n.join(`
83
+ `))}async preflightConfirm(){let e=new Set([".git",".workflow","__pycache__",".venv","node_modules",".DS_Store",".gitignore"]),t=[];b(this.workingDir)&&(t=j(this.workingDir).filter(r=>!e.has(r)));let i="";if(this.mode==="greenfield"&&t.length>0){let r=t.slice(0,10).join(", "),a=t.length>10?"...":"";i=`
84
+ \u26A0 ${o(this.lang,"orc_preflight_warn",{files:r+a})}
85
+ `}let n=`${o(this.lang,"orc_preflight_title")}
86
+ ${o(this.lang,"orc_preflight_dir",{dir:this.workingDir})}
87
+ ${o(this.lang,"orc_preflight_mode",{mode:this.mode})}
88
+ ${o(this.lang,"orc_preflight_lang",{lang:this.lang})}
89
+ `+(this.requirement?`${o(this.lang,"orc_preflight_req",{req:this.requirement.slice(0,200).replace(/\n/g,`
90
+ `)})}
91
+ `:"");if(this.confirmCallback){if(!await this.confirmCallback(n,i))throw new R}else if(X({dir:this.workingDir,mode:this.mode,lang:this.lang,req:this.requirement?this.requirement.slice(0,200):void 0,labels:{title:o(this.lang,"tui_config_title"),dir:o(this.lang,"tui_config_dir"),mode:o(this.lang,"tui_config_mode"),lang:o(this.lang,"tui_config_lang"),req:o(this.lang,"tui_config_req")}}),i&&$(i.replace(/\n/g," ").trim()),await O({message:o(this.lang,"orc_proceed_msg"),options:[{value:"yes",label:o(this.lang,"orc_proceed_yes")},{value:"no",label:o(this.lang,"orc_proceed_no")}]})==="no")throw new R}async callClaude(e,t){this.checkStopped(),this.emit("agent_start",{role:e});let i=L(e,this.config.models),n=this.getOrCreateSession(e),r=i.systemPrompt+this.langInstruction,a=this.onEvent?null:M(o(this.lang,"orc_agent_working",{role:e})),{query:d}=await import("@anthropic-ai/claude-agent-sdk"),m={systemPrompt:r,allowedTools:i.tools,model:i.model,permissionMode:this.config.permissionMode,allowDangerouslySkipPermissions:this.config.permissionMode==="bypassPermissions",cwd:this.workingDir,maxTurns:this.config.maxAgentTurns,settingSources:[]};n.sessionId&&(m.resume=n.sessionId);let h=2,l="";for(let u=1;u<=h;u++){await this.cooldown();try{l="";for await(let g of d({prompt:t,options:m})){let f=g;if(f.type==="assistant"){he(n.usage,f),f.session_id&&(n.sessionId=f.session_id);let v=f.message?.content??f.content??[];for(let y of v)y.type==="tool_use"&&a?.update(`${e} \u2192 ${this.describeTool(y.name,y.input??{})}`);this.emitContentBlocks(e,f)}f.type==="tool_progress"&&f.tool_name&&a?.update(`${e} \u2192 ${f.tool_name}`),f.type==="result"&&(n.sessionId=g.session_id,pe(n.usage,g.model_usage),l=g.result??"")}a?.stop(),this.markQueryDone(),this.emit("agent_done",{role:e});break}catch(g){if(a?.stop(),this.markQueryDone(),$(`Claude call failed (${e}, attempt ${u}/${h}): ${g}`),u===h)throw g}}return de(n.usage,this.config.contextHandoffThreshold)&&await this.handoffClaude(n,t),l}async handoffClaude(e,t){let i=L(e.name,this.config.models);k(o(this.lang,"orc_context_handoff",{name:e.name,pct:(K(e.usage)*100).toFixed(0)}));let{query:n}=await import("@anthropic-ai/claude-agent-sdk"),r=ue(e.name,t,this.handoffsDir),a={systemPrompt:i.systemPrompt,allowedTools:["Read","Write"],model:i.model,permissionMode:this.config.permissionMode,allowDangerouslySkipPermissions:this.config.permissionMode==="bypassPermissions",cwd:this.workingDir,maxTurns:this.config.maxAgentTurns,settingSources:[]};e.sessionId&&(a.resume=e.sessionId);for await(let m of n({prompt:r,options:a}));this.sessions.set(e.name,me(e.name));let d=ge(e.name,this.handoffsDir);await this.callClaude(e.name,d)}async callAgent(e,t){let i=this.config.models[e];return H(i)?this.callClaude(e,t):this.callCodexAgent(e,t)}async callCodexAgent(e,t){this.checkStopped();let i=this.getOrCreateSession(e),r=(i.threadId?"":B(e)+`
92
+
93
+ ---
94
+
95
+ `)+t+this.langInstruction,a=this.onEvent?null:M(o(this.lang,"orc_agent_working",{role:e})),d=await ee(e,r,{models:this.config.models,cwd:this.workingDir,threadId:i.threadId,idleTimeout:this.config.codexIdleTimeout,onEvent:m=>{this.emit(m.type,m.data),m.type==="content_block"&&a&&a.update(o(this.lang,"orc_agent_coding",{role:e}))}});return a?.stop(),d.threadId&&(i.threadId=d.threadId),d.output}getOrCreateSession(e){let t=this.sessions.get(e);return t||(t=me(e),this.sessions.set(e,t)),t}archiveRound(e,t,i,n){let r=c(this.roundsDir,e);I(r,{recursive:!0}),_(c(r,`r${String(t).padStart(2,"0")}-${i}.md`),n)}async reviewLoop(e,t,i,n){let r=i.map(h=>`- ${h}`).join(`
96
+ `),a=n.map(h=>`- ${h}`).join(`
97
+ `),d=[];for(let h=1;h<=this.config.maxReviewRounds;h++){this.onEvent?k(o(this.lang,"orc_review_round",{phase:e,round:String(h),max:String(this.config.maxReviewRounds)})):Q(e,h,this.config.maxReviewRounds,o(this.lang,"tui_review_label"));let l=h===1?`Review the **${e}** phase artifacts:
98
+ ${r}
99
+
100
+ Criteria:
101
+ ${a}
102
+
103
+ Read each artifact, then output your structured verdict.${this.langInstruction}`:`Re-review the **${e}** phase artifacts (round ${h}).
104
+
105
+ The producer has addressed your previous feedback. The following files have been MODIFIED since your last review:
106
+ ${r}
107
+
108
+ IMPORTANT: You MUST use the Read tool to re-read each file listed above. Do NOT rely on file contents from your previous read \u2014 they are stale. The files have been updated by the producer.
109
+
110
+ Criteria:
111
+ ${a}
112
+
113
+ Re-read each artifact, then output your structured verdict.${this.langInstruction}`,u=await this.callClaude("reviewer",l),g=oe(u,h);d.push(g),this.reviewHistories.set(e,d),this.archiveRound(e,h,"reviewer",g.rawOutput);let f=g.verdict==="PASS"?"PASS \u2713":"FAIL \u2717";if(this.timeline("reviewer",o(this.lang,"topic_review_round",{phase:e,round:String(h),verdict:f}),g.rawOutput),g.verdict==="PASS")return!0;let v=`Review round ${h}/${this.config.maxReviewRounds} FAILED.
114
+
115
+ Blocking issues:
116
+ ${g.blockingIssues.map(ve=>`- ${ve}`).join(`
117
+ `)}
118
+
119
+ Full review:
120
+ ${g.rawOutput}
121
+
122
+ Fix the issues by updating these files:
123
+ ${r}
124
+
125
+ After fixing, I will re-review by re-reading the same files.`,y=t,A=y==="developer"||y==="tester"?await this.callAgent(y,v):await this.callClaude(y,v);this.timeline(t,o(this.lang,"topic_fix_round",{phase:e,round:String(h)}),A),this.archiveRound(e,h,t,A);let z=ae(A);if(z)throw this.onEvent||S(`${p.orange}\u26A1${p.reset}`,`${p.orange}${p.bold}${o(this.lang,"orc_escalation",{phase:e,type:"blocked"})}${p.reset}`),new P(e,`## Early Escalation \u2014 ${e}
126
+
127
+ ### Type: blocked
128
+ ### Round: ${h} / ${this.config.maxReviewRounds}
129
+
130
+ ### ${z}
131
+
132
+ ### Producer output:
133
+ ${A.slice(0,2e3)}
134
+ `,this.reportsDir)}let m=ce(e,d,this.config.maxReviewRounds);if(this.onEvent||S(`${p.orange}\u26A1${p.reset}`,`${p.orange}${p.bold}${o(this.lang,"orc_escalation",{phase:e,type:m.escalationType})}${p.reset}`),m.escalationType==="spec_issue")return this.rollbackToArchitect(e,m);throw new P(e,m.diagnosis,this.reportsDir)}async rollbackToArchitect(e,t){if(this.onEvent||S(`${p.orange}\u21BA${p.reset}`,`${p.gray}${o(this.lang,"orc_rollback")}${p.reset}`),await this.callClaude("architect",`The ${e} phase failed review ${t.roundsCompleted} times due to spec issues.
135
+
136
+ Diagnosis:
137
+ ${t.diagnosis}
138
+
139
+ Revise ${this.specsDir}/spec.md to address these gaps.`),!await this.reviewLoop("spec-revision","architect",[c(this.specsDir,"spec.md")],["Spec addresses previously identified gaps","All requirements have testable criteria"]))throw new P(e,`Spec revision also failed after rollback from ${e}.`,this.reportsDir);return!1}formatReviewHistory(e){let t=[];for(let i of e){let n=this.reviewHistories.get(i);if(n?.length){t.push(`### ${i}`);for(let r of n){let a=r.verdict==="PASS"?"PASS":"FAIL";t.push(`- Round ${r.roundNumber}: ${a}`);for(let d of r.blockingIssues)t.push(` - ${d}`)}t.push("")}}return t.join(`
140
+ `)}async report(e,t,i){let n="";if(i){let a=this.formatReviewHistory(i);a&&(n=`
141
+
142
+ Actual review history (use this data, do not fabricate):
143
+ ${a}`)}let r=await this.callClaude("reporter",`Write a phase report for: ${e}. Read artifacts from ${this.specsDir}/, ${this.plansDir}/, and project files. Output to: ${this.reportsDir}/${t}${n}`);this.timeline("reporter",`${o(this.lang,"tui_done_report")}: ${e}`,r)}async extractExperience(){if(this.reviewHistories.size===0)return;let e=[];for(let[l,u]of this.reviewHistories)for(let g of u){let f=g.verdict==="PASS"?"PASS":"FAIL",v=g.blockingIssues.length>0?g.blockingIssues.map(y=>` - ${y}`).join(`
144
+ `):" (none)";e.push(`Phase: ${l}, Round ${g.roundNumber}: ${f}
145
+ Blocking issues:
146
+ ${v}`)}let t=`You are an experience extraction agent. From the following pipeline review history, extract reusable lessons for each role.
147
+
148
+ ## Review History
149
+ ${e.join(`
150
+
151
+ `)}
152
+
153
+ ## Rules
154
+ - Extract lessons that would help the role avoid the same mistakes next time
155
+ - Focus on patterns, not one-off specifics
156
+ - Skip if a role had no issues (all PASS on first round)
157
+ - Be concise: each lesson is one bullet point
158
+
159
+ ## Output Format
160
+ Output a JSON object (no markdown code block):
161
+ {"architect": ["lesson1", ...], "reviewer": ["lesson1", ...], "reporter": ["lesson1", ...]}
162
+ Omit roles with no lessons. Empty object {} if nothing to learn.`,{query:i}=await import("@anthropic-ai/claude-agent-sdk");this.emit("agent_start",{role:"reporter"}),await this.cooldown();let n="",r={systemPrompt:"You extract structured lessons from development histories.",allowedTools:[],model:this.config.models.orchestrator,permissionMode:this.config.permissionMode,allowDangerouslySkipPermissions:this.config.permissionMode==="bypassPermissions",cwd:this.workingDir,maxTurns:1,settingSources:[]};for await(let l of i({prompt:t,options:r}))l.type==="assistant"&&this.emitContentBlocks("reporter",l),l.type==="result"&&(n=l.result??"");if(this.markQueryDone(),this.emit("agent_done",{role:"reporter"}),!n){this.timeline("reporter",o(this.lang,"topic_experience_extraction"),"(no review history to extract from)");return}let a=n.match(/\{[\s\S]*\}/);if(!a){this.timeline("reporter",o(this.lang,"topic_experience_extraction"),"(could not parse lessons)");return}let d;try{d=JSON.parse(a[0])}catch{this.timeline("reporter",o(this.lang,"topic_experience_extraction"),"(invalid JSON)");return}let m=new Date().toISOString().slice(0,10),h=[];for(let[l,u]of Object.entries(d)){if(!u?.length||!["architect","reviewer","reporter"].includes(l))continue;let g=c(D,l,"experience.md");if(!b(g))continue;let f=`
163
+
164
+ ### ${m}
165
+ `+u.map(v=>`- ${v}`).join(`
166
+ `);Re(g,f),k(o(this.lang,"orc_experience_extracted",{n:String(u.length),role:l})),h.push(`**${l}**: ${u.length} lessons`);for(let v of u)h.push(` - ${v}`)}this.timeline("reporter",o(this.lang,"topic_experience_extraction"),h.length>0?h.join(`
167
+ `):"(nothing to learn)")}hasKnowledge(){return b(c(this.knowledgeDir,"overview.md"))}async initKnowledge(){this.phase("phase_knowledge_scan");let e=`You are analyzing an existing codebase at ${this.workingDir}.
168
+
169
+ CRITICAL RULES:
170
+ - Your job is to understand what CODE actually exists, not what docs SAY should exist.
171
+ - Design docs (README, ARCHITECTURE.md, DESIGN.md, docs/) are NAVIGATION AIDS only \u2014 they tell you where to look and what the intent is, but they are NOT evidence that code exists.
172
+ - A module is only real if it has actual source code files (.ts, .js, .py, .go, .rs, .java, etc.).
173
+ - If a directory contains only .md files with no code, it is NOT a code module.
174
+
175
+ STEPS:
176
+ 1. List the directory structure (skip node_modules, .git, __pycache__, .venv, vendor, build, dist).
177
+ 2. Identify which files are source code vs documentation/config.
178
+ 3. Based ONLY on actual source code files found, propose a module decomposition (3-10 modules).
179
+ 4. If the project has design docs but little or no source code, set has_code to false and return an empty modules object.
180
+
181
+ Output a JSON object (no markdown code block):
182
+ {"has_code": true/false, "has_design_docs": true/false, "design_doc_paths": [...], "code_file_count": <number>, "modules": {"name": {"description": "...", "paths": [...]}}}
183
+
184
+ Each path in modules must point to actual source code files or directories containing source code. Never include paths that only contain documentation.`,t=await this.callClaude("architect",e),i,n=[/```(?:json)?\s*(\{[\s\S]*?\})\s*```/,/(\{"has_code"[\s\S]*?\})\s*$/,/(\{[\s\S]*\})/],r=!1;for(let l of n){let u=t.match(l);if(!u)continue;let g=u[1]??u[0];try{i=JSON.parse(g),r=!0;break}catch{}}if(!r){$(o(this.lang,"ki_invalid_json"));return}if(i.has_code===!1||(i.code_file_count??0)===0){k(o(this.lang,"ki_no_code")),I(this.knowledgeDir,{recursive:!0});let l=(i.design_doc_paths??[]).join(", ");_(c(this.knowledgeDir,"overview.md"),`# Project Overview
185
+
186
+ Project is in design/planning phase \u2014 no source code implemented yet.
187
+ `+(l?`
188
+ Design documents found: ${l}
189
+ `:"")+`
190
+ Knowledge will be populated after code is written.
191
+ `);return}let a=i.modules??{};if(Object.keys(a).length===0){$(o(this.lang,"ki_no_modules"));return}_(c(this.knowledgeDir,"module_plan.json"),JSON.stringify(i,null,2)),k(o(this.lang,"ki_modules_found",{n:String(Object.keys(a).length),files:String(i.code_file_count??"?")})),this.phase("phase_knowledge_analyze");for(let[l,u]of Object.entries(a)){k(o(this.lang,"ki_analyzing",{name:l}));let g=(u.paths??[]).map(y=>` - ${y}`).join(`
192
+ `),f=c(this.modulesDir,`${l}.md`),v=`Analyze the '${l}' module of this project.
193
+ Description: ${u.description??""}
194
+ Source files/directories to read:
195
+ ${g}
196
+
197
+ IMPORTANT: Read the ACTUAL SOURCE CODE in these paths. Do not infer or assume based on design documents. If a listed path does not contain source code (only docs or doesn't exist), note that and skip it.
198
+
199
+ Write a knowledge document to ${f} based on what the code ACTUALLY does:
200
+ - Purpose and responsibility (as implemented, not as planned)
201
+ - Key types, interfaces, and data models (from code)
202
+ - Important functions/classes (from code)
203
+ - Dependencies (from imports/requires)
204
+ - Patterns and conventions (observed in code)
205
+
206
+ Be thorough but concise. If a module has very little code, keep the document short.`;await this.callClaude("architect",v)}this.phase("phase_knowledge_synth");let h=`Read all module knowledge files and synthesize a project overview.
207
+
208
+ Module files:
209
+ ${j(this.modulesDir).filter(l=>l.endsWith(".md")).map(l=>` - ${c(this.modulesDir,l)}`).join(`
210
+ `)}
211
+
212
+ Write the overview to ${c(this.knowledgeDir,"overview.md")} covering:
213
+ - Project purpose and scope (based on what code does, not what docs plan)
214
+ - Technology stack (from actual dependencies and code)
215
+ - Architecture pattern (as implemented)
216
+ - Module map (code modules only)
217
+ - Entry points and key flows
218
+ - Conventions observed in code
219
+
220
+ This document will be loaded as context for all future architect work. It must reflect the ACTUAL state of the codebase, not aspirational design documents.`;await this.callClaude("architect",h),k(o(this.lang,"ki_complete",{path:c(this.knowledgeDir,"overview.md")}))}loadKnowledgeContext(){let e=c(this.knowledgeDir,"overview.md");return b(e)?`## Project Knowledge (from prior analysis)
221
+
222
+ `+x(e,"utf-8").trim()+`
223
+
224
+ ---
225
+
226
+ `:""}async updateKnowledge(){if(!this.hasKnowledge())return;this.phase("phase_knowledge_update");let i=`The project was just modified. Check if any module knowledge files need updating.
227
+
228
+ Existing module files:
229
+ ${j(this.modulesDir).filter(n=>n.endsWith(".md")).map(n=>` - ${c(this.modulesDir,n)}`).join(`
230
+ `)}
231
+ Overview: ${c(this.knowledgeDir,"overview.md")}
232
+
233
+ 1. Look at recently changed files
234
+ 2. Update affected module files
235
+ 3. Create new module files if needed
236
+ 4. Update overview.md if architecture changed
237
+ 5. If nothing significant changed, do nothing
238
+
239
+ Be surgical.`;await this.callClaude("architect",i)}async runImplementation(){let e=fe[this.mode]??fe.greenfield;this.phase("phase_sprint");let t=await this.callAgent("developer",`Read the spec at ${this.specsDir}/spec.md. Produce an implementation plan at ${this.plansDir}/plan.md covering: file structure, key algorithms, dependencies, verification approach for each acceptance criterion.`);this.timeline("developer",o(this.lang,"topic_sprint_contract"),t),this.archiveRound("sprint-contract",0,"developer",t),await this.reviewLoop("sprint-contract","developer",[c(this.plansDir,"plan.md")],e.plan),this.phase("phase_impl"),t=await this.callAgent("developer","The plan is approved. Implement the full solution per the plan. Write production-quality code."),this.timeline("developer",o(this.lang,"topic_implementation"),t),this.archiveRound("implementation",0,"developer",t);let i=await this.reviewLoop("implementation","developer",[c(this.specsDir,"spec.md")],e.code);i||(await this.callAgent("developer",`The spec has been revised. Re-read ${this.specsDir}/spec.md and update your implementation accordingly.`),await this.reviewLoop("implementation-retry","developer",[c(this.specsDir,"spec.md")],e.code.slice(0,2))),await this.report(o(this.lang,"report_implementation"),"02-implementation.md",["sprint-contract","implementation","implementation-retry"]),this.phase("phase_test"),t=await this.callAgent("tester",`Read the spec at ${this.specsDir}/spec.md and the implemented code. Write comprehensive tests and execute them.`),this.timeline("tester",o(this.lang,"topic_test_suite"),t),this.archiveRound("testing",0,"tester",t),i=await this.reviewLoop("testing","tester",[c(this.specsDir,"spec.md")],e.test),i||(await this.callAgent("tester",`The spec has been revised. Re-read ${this.specsDir}/spec.md and update tests accordingly.`),await this.reviewLoop("testing-retry","tester",[c(this.specsDir,"spec.md")],e.test.slice(-2))),await this.report(o(this.lang,"report_testing"),"03-testing.md",["testing","testing-retry"])}async finalize(){this.phase("phase_report");let e=[...this.reviewHistories.keys()];await this.report(o(this.lang,"report_final"),"final.md",e),this.phase("phase_experience"),await this.extractExperience(),this.hasKnowledge()&&await this.updateKnowledge();let t=c(this.reportsDir,"final.md");return this.onEvent?k(o(this.lang,"orc_complete",{path:t})):V(t,this.workBranch??"",{title:o(this.lang,"tui_done_title"),report:o(this.lang,"tui_done_report"),branchLabel:o(this.lang,"tui_done_branch")}),t}async runGreenfield(){this.phase("phase_arch");let e=await this.callClaude("architect",`Analyze this requirement and produce a specification at ${this.specsDir}/spec.md:
240
+
241
+ ${this.requirement}`);return this.timeline("architect",o(this.lang,"topic_specification"),e),this.archiveRound("architecture",0,"architect",e),await this.reviewLoop("architecture","architect",[c(this.specsDir,"spec.md")],["All functional requirements are clearly defined","Every requirement has testable acceptance criteria","Interfaces and data models are precisely specified","No implementation details leak into the spec"]),await this.report(o(this.lang,"report_architecture"),"01-design.md",["architecture"]),await this.runImplementation(),this.finalize()}async runFeature(){let e=this.loadKnowledgeContext();this.phase("phase_incr_arch");let t=await this.callClaude("architect",`${e}A new feature is requested for this existing project.
242
+
243
+ ## New Requirement
244
+ ${this.requirement}
245
+
246
+ Analyze the existing codebase and produce an incremental spec at ${this.specsDir}/spec.md covering:
247
+ - What existing code/modules are affected
248
+ - What new code needs to be added
249
+ - Interface changes (if any) and backward compatibility
250
+ - Acceptance criteria for the new feature
251
+
252
+ The spec should be scoped to the change, not re-describe the whole system.`);return this.timeline("architect",o(this.lang,"topic_incremental_spec"),t),this.archiveRound("architecture",0,"architect",t),await this.reviewLoop("architecture","architect",[c(this.specsDir,"spec.md")],["Change scope is clearly defined against existing code","Affected modules and interfaces are identified","Backward compatibility is addressed","Acceptance criteria are testable"]),await this.report(o(this.lang,"report_incremental"),"01-design.md",["architecture"]),await this.runImplementation(),this.finalize()}async runBugfix(){let e=this.loadKnowledgeContext();this.phase("phase_diagnosis");let t=await this.callClaude("architect",`${e}A bug has been reported in this project.
253
+
254
+ ## Bug Report
255
+ ${this.requirement}
256
+
257
+ Investigate the codebase and produce a diagnosis at ${this.specsDir}/spec.md covering:
258
+ - Root cause analysis
259
+ - Impact assessment
260
+ - Proposed fix
261
+ - Regression risk
262
+ - Acceptance criteria for the fix
263
+ `);this.timeline("architect",o(this.lang,"topic_diagnosis"),t),this.archiveRound("diagnosis",0,"architect",t),await this.reviewLoop("diagnosis","architect",[c(this.specsDir,"spec.md")],["Root cause is identified with specific code references","Proposed fix is concrete and actionable","Regression risks are assessed","Acceptance criteria verify the fix"]),await this.report(o(this.lang,"report_diagnosis"),"01-design.md",["diagnosis"]),this.phase("phase_fix");let i=await this.callAgent("developer",`Read the diagnosis at ${this.specsDir}/spec.md. Implement the proposed fix. Be surgical \u2014 change only what's needed.`);this.timeline("developer",o(this.lang,"topic_fix_implementation"),i),this.archiveRound("implementation",0,"developer",i);let n=await this.reviewLoop("implementation","developer",[c(this.specsDir,"spec.md")],["Fix addresses the root cause identified in diagnosis","Changes are minimal and surgical","No unrelated changes or refactoring"]);n||(await this.callAgent("developer",`The diagnosis has been revised. Re-read ${this.specsDir}/spec.md and update your fix accordingly.`),await this.reviewLoop("implementation-retry","developer",[c(this.specsDir,"spec.md")],["Fix addresses the root cause","Changes are minimal and surgical"])),await this.report(o(this.lang,"report_fix"),"02-implementation.md",["implementation","implementation-retry"]),this.phase("phase_regression");let r=await this.callAgent("tester",`Read the diagnosis at ${this.specsDir}/spec.md and the fix. Write regression tests that:
264
+ 1. Reproduce the original bug (should fail without fix)
265
+ 2. Verify the fix works
266
+ 3. Run existing tests to check for regressions
267
+ `);return this.timeline("tester",o(this.lang,"topic_regression_tests"),r),this.archiveRound("testing",0,"tester",r),n=await this.reviewLoop("testing","tester",[c(this.specsDir,"spec.md")],["Regression test reproduces the original bug scenario","Fix verification test passes","Existing tests still pass (no regressions)"]),n||(await this.callAgent("tester",`The diagnosis has been revised. Re-read ${this.specsDir}/spec.md and update tests accordingly.`),await this.reviewLoop("testing-retry","tester",[c(this.specsDir,"spec.md")],["Regression test covers the bug scenario","All tests pass"])),await this.report(o(this.lang,"report_regression"),"03-testing.md",["testing","testing-retry"]),this.finalize()}};export{R as a,P as b,we as c};
@@ -0,0 +1,2 @@
1
+ import{readFileSync as m,writeFileSync as f,mkdirSync as v,existsSync as h}from"fs";import{execFileSync as x}from"child_process";import{homedir as b}from"os";import{join as p}from"path";var d={architect:"opus",reviewer:"sonnet",reporter:"haiku",developer:"gpt-5.4",tester:"gpt-5.4",orchestrator:"opus"},c={claude:{authMode:"subscription"},codex:{authMode:"subscription"}},n={auth:{...c},models:{...d},maxAgentTurns:30,maxReviewRounds:5,contextHandoffThreshold:.7,codexIdleTimeout:120,permissionMode:"bypassPermissions"},u=p(b(),".wildo"),l=p(u,"config.json");var A=p(u,"personas");function r(){try{let e=m(l,"utf-8");return JSON.parse(e)}catch{return{}}}function g(e){try{return x(e,["--version"],{stdio:"pipe",timeout:5e3}),!0}catch{return!1}}function P(){let e=process.env.ANTHROPIC_API_KEY,t=process.env.OPENAI_API_KEY;return{claude:{hasEnvKey:!!e,hasCli:g("claude"),envKey:e?`${e.slice(0,10)}...${e.slice(-4)}`:void 0},codex:{hasEnvKey:!!t,hasCli:g("codex"),envKey:t?`${t.slice(0,10)}...${t.slice(-4)}`:void 0}}}function R(){return h(l)}function T(){return r().lang??null}function y(){return r().theme??null}function E(){let e=r();return{...d,...e.models}}function K(e){let t=e.toLowerCase();return!!(/^(opus|sonnet|haiku)$/.test(t)||t.startsWith("claude"))}function D(){if(process.env.WILDO_THEME)return;let e=y();e&&e!=="auto"&&(process.env.WILDO_THEME=e)}function S(e){h(u)||v(u,{recursive:!0});let t=r(),i={...t,...e};e.auth&&(i.auth={...t.auth,...e.auth}),f(l,JSON.stringify(i,null,2)+`
2
+ `)}async function O(){let e=r(),t={claude:{...c.claude,...e.auth?.claude},codex:{...c.codex,...e.auth?.codex}},i={...d,...e.models};for(let o of Object.keys(i)){let a=`WILDO_MODEL_${o.toUpperCase()}`,s=process.env[a];s&&(i[o]=s)}return t.claude.authMode==="api_key"&&!t.claude.apiKey&&process.env.ANTHROPIC_API_KEY&&(t.claude.apiKey=process.env.ANTHROPIC_API_KEY),t.codex.authMode==="api_key"&&!t.codex.apiKey&&process.env.OPENAI_API_KEY&&(t.codex.apiKey=process.env.OPENAI_API_KEY),{auth:t,models:i,maxAgentTurns:e.maxAgentTurns??n.maxAgentTurns,maxReviewRounds:e.maxReviewRounds??n.maxReviewRounds,contextHandoffThreshold:e.contextHandoffThreshold??n.contextHandoffThreshold,codexIdleTimeout:e.codexIdleTimeout??n.codexIdleTimeout,permissionMode:e.permissionMode??n.permissionMode}}var _={en:{git_detected:"Git repo detected",git_init:"Initializing git repo",git_branch:"Working on branch: {branch}",git_committed:"Committed: {msg}",setup_intro:"wildo uses AI agents to handle the full dev pipeline. By default it uses both Claude (Anthropic) and Codex (OpenAI), but you can run everything on a single provider.",setup_provider_msg:"Which providers do you have access to?",setup_provider_both:"Both Claude & Codex",setup_provider_both_hint:"recommended \u2014 best of both",setup_provider_claude_only:"Claude only",setup_provider_claude_only_hint:"all roles use Claude models",setup_provider_codex_only:"Codex only",setup_provider_codex_only_hint:"all roles use Codex models",setup_cli_found:"CLI detected \u2014 subscription available",setup_env_found:"API key found in environment",setup_no_auth:"No existing auth detected",setup_opt_sub:"Use CLI subscription",setup_opt_sub_hint:"no API key needed",setup_opt_env:"Use environment variable",setup_opt_new:"Enter API key manually",setup_enter_key:"API key",setup_no_key:"No key entered \u2014 set the environment variable later.",setup_saved:"Configuration saved to ~/.wildo/config.json",setup_reconfig:"Run `wildo --setup` anytime to reconfigure.",setup_model_title:"Configure which model each agent role uses.",setup_model_msg:"{role} model",setup_model_current:"current",setup_model_keep:"Keep current",setup_model_default:"default",setup_model_done:"Model configuration saved.",cli_mode_msg:"Pipeline mode",cli_mode_greenfield:"Greenfield",cli_mode_greenfield_hint:"new project from scratch",cli_mode_feature:"Feature",cli_mode_feature_hint:"add to existing project",cli_mode_bugfix:"Bugfix",cli_mode_bugfix_hint:"fix a bug",cli_req_msg:"Requirement",cli_req_placeholder:"describe what to build, or path to .md file",cli_dir_msg:"Project directory",cli_dir_placeholder:"current directory",cli_output_msg:"Output mode",cli_output_terminal:"Terminal",cli_output_terminal_hint:"inline output",cli_output_web:"Web UI",cli_output_web_hint:"opens browser",cli_starting:"Starting pipeline...",cli_done:"Done. Review the final report at: {path}",cli_cancelled:"Pipeline cancelled.",cli_paused:"Pipeline paused: {msg}",cli_paused_phase:"requires intervention at {phase}",cli_paused_hint:"Review the diagnosis, then re-run to continue.",orc_starting:"[orchestrator] Starting pipeline (mode={mode})",orc_no_knowledge:"[orchestrator] No project knowledge found, running init first",orc_review_round:"[orchestrator] {phase} \u2014 review round {round}/{max}",orc_escalation:"[orchestrator] ESCALATION at {phase}: {type}",orc_rollback:"[orchestrator] Rolling back to architect for spec revision",orc_complete:"[orchestrator] Pipeline complete. Report: {path}",orc_crashed_found:"Found {n} unfinished run(s) from previous session(s):",orc_cleanup_keep:"Keep (preserve branch)",orc_cleanup_discard:"Discard (delete branch & files)",orc_preflight_warn:"Directory already contains files: {files}. You selected 'greenfield' mode which is for new projects. Consider using 'feature' or 'bugfix' mode instead.",orc_preflight_title:"Pipeline Configuration",orc_preflight_dir:"Directory: {dir}",orc_preflight_mode:"Mode: {mode}",orc_preflight_lang:"Language: {lang}",orc_preflight_req:"Requirement: {req}",orc_proceed_yes:"Yes, proceed",orc_proceed_no:"No, cancel",orc_proceed_msg:"Start pipeline?",orc_agent_working:"{role} working...",orc_agent_coding:"{role} \u2192 writing code...",orc_context_handoff:"{name} context at {pct}%, handoff...",orc_experience_extracted:"Extracted {n} lessons for {role}",phase_knowledge_scan:"Knowledge Init: Scanning project",phase_knowledge_analyze:"Knowledge Init: Analyzing modules",phase_knowledge_synth:"Knowledge Init: Synthesizing overview",phase_knowledge_update:"Knowledge Update",phase_sprint:"Sprint Contract",phase_impl:"Implementation",phase_test:"Testing",phase_report:"Final Report",phase_experience:"Experience Extraction",phase_arch:"Architecture",phase_incr_arch:"Incremental Architecture",phase_diagnosis:"Diagnosis",phase_fix:"Fix Implementation",phase_regression:"Regression Testing","phase_id_sprint-contract":"Sprint Contract",phase_id_implementation:"Implementation","phase_id_implementation-retry":"Implementation (retry)",phase_id_testing:"Testing","phase_id_testing-retry":"Testing (retry)",phase_id_architecture:"Architecture",phase_id_diagnosis:"Diagnosis",topic_sprint_contract:"sprint contract",topic_implementation:"implementation",topic_test_suite:"test suite",topic_specification:"specification",topic_incremental_spec:"incremental spec",topic_diagnosis:"diagnosis",topic_fix_implementation:"fix implementation",topic_regression_tests:"regression tests",topic_experience_extraction:"experience extraction",topic_review_round:"{phase} round {round} \u2014 {verdict}",topic_fix_round:"{phase} fix (round {round})",report_architecture:"Architecture & Design",report_incremental:"Incremental Design",report_implementation:"Implementation",report_testing:"Testing",report_final:"Final Acceptance",report_diagnosis:"Bug Diagnosis",report_fix:"Fix Implementation",report_regression:"Regression Testing",ki_parse_fail:"Knowledge init: failed to parse module split",ki_invalid_json:"Knowledge init: invalid JSON",ki_no_code:"Knowledge init: no source code found, skipping (project may be in design phase)",ki_no_modules:"Knowledge init: no code modules found",ki_modules_found:"Knowledge init: {n} modules identified ({files} source files)",ki_analyzing:"Analyzing module: {name}",ki_complete:"Knowledge init complete: {path}",tui_review_label:"Review",tui_config_title:"Pipeline Configuration",tui_config_dir:"Directory",tui_config_mode:"Mode",tui_config_lang:"Language",tui_config_req:"Require.",tui_done_title:"Pipeline Complete",tui_done_report:"Report",tui_done_branch:"Branch",ui_header_pipeline:"Pipeline",ui_status_idle:"idle",ui_status_running:"running",ui_status_done:"done",ui_status_stopped:"stopped",ui_status_paused:"paused",ui_btn_stop:"Stop",ui_btn_abort:"Abort",ui_btn_start:"Start Pipeline",ui_btn_cancel:"Cancel",ui_btn_proceed:"Proceed",ui_btn_continue:"Continue",ui_label_requirement:"Requirement",ui_label_project_dir:"Project Directory",ui_label_mode:"Mode",ui_label_language:"Language",ui_placeholder_requirement:"Describe the requirement, or paste a file path...",ui_mode_greenfield:"Greenfield",ui_mode_feature:"Feature",ui_mode_bugfix:"Bugfix",ui_empty_state:"Configure and start a pipeline to begin",ui_confirm_title:"Confirm Pipeline Configuration",ui_cleanup_title:"Unfinished Runs from Previous Sessions",ui_cleanup_desc:"The following runs didn't complete successfully. Choose Keep or Discard for each.",ui_cleanup_keep:"Keep",ui_cleanup_discard:"Discard (delete)",ui_setup_title:"first-time setup",ui_setup_subtitle:"wildo uses Claude (architect / reviewer / reporter) and Codex (developer / tester). Configure how to authenticate with each provider.",ui_setup_save:"Save Configuration",ui_setup_detected:"detected",ui_setup_no_auth:"no auth found",ui_setup_use_sub:"Use {provider} subscription",ui_setup_sub_hint:"No API key needed \u2014 uses your local CLI login",ui_setup_use_env:"Use API key from environment",ui_setup_use_env_hint:"Detected: {key}",ui_setup_new_key:"Enter a new API key",ui_ev_complete:"Pipeline Complete",ui_ev_stopped:"Pipeline Stopped",ui_ev_paused:"Paused at {phase}",ui_ev_error:"Error",ui_ev_report:"Report",ui_ev_branch:"Branch",ui_ev_partial:"Partial work saved.",ui_ev_streaming:"streaming...",ui_ev_output:"output",ui_ev_interrupted:"interrupted",ui_abort_confirm:"Abort pipeline and rollback all changes?"},zh:{git_detected:"\u68C0\u6D4B\u5230 Git \u4ED3\u5E93",git_init:"\u521D\u59CB\u5316 Git \u4ED3\u5E93",git_branch:"\u5DE5\u4F5C\u5206\u652F: {branch}",git_committed:"\u5DF2\u63D0\u4EA4: {msg}",setup_intro:"wildo \u4F7F\u7528 AI \u4EE3\u7406\u5B8C\u6210\u5B8C\u6574\u7684\u5F00\u53D1\u6D41\u6C34\u7EBF\u3002\u9ED8\u8BA4\u540C\u65F6\u4F7F\u7528 Claude (Anthropic) \u548C Codex (OpenAI)\uFF0C\u4E5F\u53EF\u4EE5\u53EA\u7528\u5176\u4E2D\u4E00\u4E2A\u3002",setup_provider_msg:"\u4F60\u6709\u54EA\u4E9B\u670D\u52A1\u5546\u7684\u8BBF\u95EE\u6743\u9650\uFF1F",setup_provider_both:"Claude \u548C Codex \u90FD\u6709",setup_provider_both_hint:"\u63A8\u8350 \u2014 \u5404\u53D6\u6240\u957F",setup_provider_claude_only:"\u53EA\u6709 Claude",setup_provider_claude_only_hint:"\u6240\u6709\u89D2\u8272\u4F7F\u7528 Claude \u6A21\u578B",setup_provider_codex_only:"\u53EA\u6709 Codex",setup_provider_codex_only_hint:"\u6240\u6709\u89D2\u8272\u4F7F\u7528 Codex \u6A21\u578B",setup_cli_found:"\u68C0\u6D4B\u5230 CLI \u2014 \u53EF\u7528\u8BA2\u9605\u6A21\u5F0F",setup_env_found:"\u5728\u73AF\u5883\u53D8\u91CF\u4E2D\u53D1\u73B0 API key",setup_no_auth:"\u672A\u68C0\u6D4B\u5230\u5DF2\u6709\u8BA4\u8BC1",setup_opt_sub:"\u4F7F\u7528 CLI \u8BA2\u9605",setup_opt_sub_hint:"\u65E0\u9700 API key",setup_opt_env:"\u4F7F\u7528\u73AF\u5883\u53D8\u91CF\u4E2D\u7684 key",setup_opt_new:"\u624B\u52A8\u8F93\u5165 API key",setup_enter_key:"API key",setup_no_key:"\u672A\u8F93\u5165 key \u2014 \u540E\u7EED\u53EF\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF\u3002",setup_saved:"\u914D\u7F6E\u5DF2\u4FDD\u5B58\u5230 ~/.wildo/config.json",setup_reconfig:"\u968F\u65F6\u53EF\u8FD0\u884C `wildo --setup` \u91CD\u65B0\u914D\u7F6E\u3002",setup_model_title:"\u914D\u7F6E\u6BCF\u4E2A\u4EE3\u7406\u89D2\u8272\u4F7F\u7528\u7684\u6A21\u578B\u3002",setup_model_msg:"{role} \u6A21\u578B",setup_model_current:"\u5F53\u524D",setup_model_keep:"\u4FDD\u6301\u5F53\u524D",setup_model_default:"\u9ED8\u8BA4",setup_model_done:"\u6A21\u578B\u914D\u7F6E\u5DF2\u4FDD\u5B58\u3002",cli_mode_msg:"\u6D41\u6C34\u7EBF\u6A21\u5F0F",cli_mode_greenfield:"\u65B0\u9879\u76EE",cli_mode_greenfield_hint:"\u4ECE\u96F6\u5F00\u59CB",cli_mode_feature:"\u65B0\u529F\u80FD",cli_mode_feature_hint:"\u5728\u73B0\u6709\u9879\u76EE\u4E0A\u6DFB\u52A0",cli_mode_bugfix:"\u4FEE\u590D Bug",cli_mode_bugfix_hint:"\u4FEE\u590D\u73B0\u6709\u95EE\u9898",cli_req_msg:"\u9700\u6C42\u63CF\u8FF0",cli_req_placeholder:"\u63CF\u8FF0\u8981\u6784\u5EFA\u7684\u5185\u5BB9\uFF0C\u6216 .md \u6587\u4EF6\u8DEF\u5F84",cli_dir_msg:"\u9879\u76EE\u76EE\u5F55",cli_dir_placeholder:"\u5F53\u524D\u76EE\u5F55",cli_output_msg:"\u8F93\u51FA\u65B9\u5F0F",cli_output_terminal:"\u7EC8\u7AEF",cli_output_terminal_hint:"\u5185\u8054\u8F93\u51FA",cli_output_web:"Web UI",cli_output_web_hint:"\u6253\u5F00\u6D4F\u89C8\u5668",cli_starting:"\u542F\u52A8\u6D41\u6C34\u7EBF...",cli_done:"\u5B8C\u6210\u3002\u67E5\u770B\u6700\u7EC8\u62A5\u544A\uFF1A{path}",cli_cancelled:"\u6D41\u6C34\u7EBF\u5DF2\u53D6\u6D88\u3002",cli_paused:"\u6D41\u6C34\u7EBF\u6682\u505C\uFF1A{msg}",cli_paused_phase:"\u5728 {phase} \u9636\u6BB5\u9700\u8981\u4EBA\u5DE5\u4ECB\u5165",cli_paused_hint:"\u8BF7\u68C0\u67E5\u8BCA\u65AD\u62A5\u544A\uFF0C\u7136\u540E\u91CD\u65B0\u8FD0\u884C\u4EE5\u7EE7\u7EED\u3002",orc_starting:"[orchestrator] \u542F\u52A8\u6D41\u6C34\u7EBF\uFF08\u6A21\u5F0F={mode}\uFF09",orc_no_knowledge:"[orchestrator] \u672A\u53D1\u73B0\u9879\u76EE\u77E5\u8BC6\u5E93\uFF0C\u5148\u6267\u884C\u521D\u59CB\u5316",orc_review_round:"[orchestrator] {phase} \u2014 \u8BC4\u5BA1\u8F6E\u6B21 {round}/{max}",orc_escalation:"[orchestrator] \u5728 {phase} \u9636\u6BB5\u5347\u7EA7: {type}",orc_rollback:"[orchestrator] \u56DE\u9000\u5230\u67B6\u6784\u5E08\u4FEE\u8BA2\u89C4\u683C",orc_complete:"[orchestrator] \u6D41\u6C34\u7EBF\u5B8C\u6210\u3002\u62A5\u544A: {path}",orc_crashed_found:"\u53D1\u73B0 {n} \u4E2A\u672A\u5B8C\u6210\u7684\u5386\u53F2\u8FD0\u884C\uFF1A",orc_cleanup_keep:"\u4FDD\u7559\uFF08\u4FDD\u7559\u5206\u652F\uFF09",orc_cleanup_discard:"\u4E22\u5F03\uFF08\u5220\u9664\u5206\u652F\u548C\u6587\u4EF6\uFF09",orc_preflight_warn:"\u76EE\u5F55\u5DF2\u5305\u542B\u6587\u4EF6\uFF1A{files}\u3002\u4F60\u9009\u62E9\u4E86 'greenfield' \u6A21\u5F0F\uFF0C\u8BE5\u6A21\u5F0F\u7528\u4E8E\u5168\u65B0\u9879\u76EE\u3002\u5EFA\u8BAE\u6539\u7528 'feature' \u6216 'bugfix' \u6A21\u5F0F\u3002",orc_preflight_title:"\u6D41\u6C34\u7EBF\u914D\u7F6E",orc_preflight_dir:"\u76EE\u5F55\uFF1A {dir}",orc_preflight_mode:"\u6A21\u5F0F\uFF1A {mode}",orc_preflight_lang:"\u8BED\u8A00\uFF1A {lang}",orc_preflight_req:"\u9700\u6C42\uFF1A {req}",orc_proceed_yes:"\u662F\uFF0C\u7EE7\u7EED",orc_proceed_no:"\u5426\uFF0C\u53D6\u6D88",orc_proceed_msg:"\u542F\u52A8\u6D41\u6C34\u7EBF\uFF1F",orc_agent_working:"{role} \u5DE5\u4F5C\u4E2D...",orc_agent_coding:"{role} \u2192 \u7F16\u5199\u4EE3\u7801...",orc_context_handoff:"{name} \u4E0A\u4E0B\u6587\u4F7F\u7528 {pct}%\uFF0C\u6B63\u5728\u5207\u6362...",orc_experience_extracted:"\u4E3A {role} \u63D0\u53D6\u4E86 {n} \u6761\u7ECF\u9A8C",phase_knowledge_scan:"\u77E5\u8BC6\u5E93\u521D\u59CB\u5316\uFF1A\u626B\u63CF\u9879\u76EE",phase_knowledge_analyze:"\u77E5\u8BC6\u5E93\u521D\u59CB\u5316\uFF1A\u5206\u6790\u6A21\u5757",phase_knowledge_synth:"\u77E5\u8BC6\u5E93\u521D\u59CB\u5316\uFF1A\u7EFC\u5408\u6982\u89C8",phase_knowledge_update:"\u77E5\u8BC6\u5E93\u66F4\u65B0",phase_sprint:"\u9700\u6C42\u89C4\u5212",phase_impl:"\u4EE3\u7801\u5B9E\u73B0",phase_test:"\u6D4B\u8BD5",phase_report:"\u6700\u7EC8\u62A5\u544A",phase_experience:"\u7ECF\u9A8C\u63D0\u53D6",phase_arch:"\u67B6\u6784\u8BBE\u8BA1",phase_incr_arch:"\u589E\u91CF\u67B6\u6784",phase_diagnosis:"\u95EE\u9898\u8BCA\u65AD",phase_fix:"\u4FEE\u590D\u5B9E\u73B0",phase_regression:"\u56DE\u5F52\u6D4B\u8BD5","phase_id_sprint-contract":"\u9700\u6C42\u89C4\u5212",phase_id_implementation:"\u4EE3\u7801\u5B9E\u73B0","phase_id_implementation-retry":"\u4EE3\u7801\u5B9E\u73B0\uFF08\u91CD\u8BD5\uFF09",phase_id_testing:"\u6D4B\u8BD5","phase_id_testing-retry":"\u6D4B\u8BD5\uFF08\u91CD\u8BD5\uFF09",phase_id_architecture:"\u67B6\u6784\u8BBE\u8BA1",phase_id_diagnosis:"\u95EE\u9898\u8BCA\u65AD",topic_sprint_contract:"\u9700\u6C42\u89C4\u5212",topic_implementation:"\u4EE3\u7801\u5B9E\u73B0",topic_test_suite:"\u6D4B\u8BD5\u5957\u4EF6",topic_specification:"\u67B6\u6784\u89C4\u683C",topic_incremental_spec:"\u589E\u91CF\u89C4\u683C",topic_diagnosis:"\u95EE\u9898\u8BCA\u65AD",topic_fix_implementation:"\u4FEE\u590D\u5B9E\u73B0",topic_regression_tests:"\u56DE\u5F52\u6D4B\u8BD5",topic_experience_extraction:"\u7ECF\u9A8C\u63D0\u53D6",topic_review_round:"{phase} \u8F6E\u6B21 {round} \u2014 {verdict}",topic_fix_round:"{phase} \u4FEE\u590D\uFF08\u8F6E\u6B21 {round}\uFF09",report_architecture:"\u67B6\u6784\u4E0E\u8BBE\u8BA1",report_incremental:"\u589E\u91CF\u8BBE\u8BA1",report_implementation:"\u4EE3\u7801\u5B9E\u73B0",report_testing:"\u6D4B\u8BD5",report_final:"\u6700\u7EC8\u9A8C\u6536",report_diagnosis:"\u95EE\u9898\u8BCA\u65AD",report_fix:"\u4FEE\u590D\u5B9E\u73B0",report_regression:"\u56DE\u5F52\u6D4B\u8BD5",ki_parse_fail:"\u77E5\u8BC6\u5E93\u521D\u59CB\u5316\uFF1A\u89E3\u6790\u6A21\u5757\u62C6\u5206\u5931\u8D25",ki_invalid_json:"\u77E5\u8BC6\u5E93\u521D\u59CB\u5316\uFF1AJSON \u683C\u5F0F\u65E0\u6548",ki_no_code:"\u77E5\u8BC6\u5E93\u521D\u59CB\u5316\uFF1A\u672A\u53D1\u73B0\u6E90\u4EE3\u7801\uFF0C\u8DF3\u8FC7\uFF08\u9879\u76EE\u53EF\u80FD\u5904\u4E8E\u8BBE\u8BA1\u9636\u6BB5\uFF09",ki_no_modules:"\u77E5\u8BC6\u5E93\u521D\u59CB\u5316\uFF1A\u672A\u627E\u5230\u4EE3\u7801\u6A21\u5757",ki_modules_found:"\u77E5\u8BC6\u5E93\u521D\u59CB\u5316\uFF1A\u8BC6\u522B\u5230 {n} \u4E2A\u6A21\u5757\uFF08{files} \u4E2A\u6E90\u6587\u4EF6\uFF09",ki_analyzing:"\u5206\u6790\u6A21\u5757\uFF1A{name}",ki_complete:"\u77E5\u8BC6\u5E93\u521D\u59CB\u5316\u5B8C\u6210\uFF1A{path}",tui_review_label:"\u8BC4\u5BA1",tui_config_title:"\u6D41\u6C34\u7EBF\u914D\u7F6E",tui_config_dir:"\u76EE\u5F55",tui_config_mode:"\u6A21\u5F0F",tui_config_lang:"\u8BED\u8A00",tui_config_req:"\u9700\u6C42",tui_done_title:"\u6D41\u6C34\u7EBF\u5B8C\u6210",tui_done_report:"\u62A5\u544A",tui_done_branch:"\u5206\u652F",ui_header_pipeline:"\u6D41\u6C34\u7EBF",ui_status_idle:"\u7A7A\u95F2",ui_status_running:"\u8FD0\u884C\u4E2D",ui_status_done:"\u5B8C\u6210",ui_status_stopped:"\u5DF2\u505C\u6B62",ui_status_paused:"\u5DF2\u6682\u505C",ui_btn_stop:"\u505C\u6B62",ui_btn_abort:"\u4E2D\u6B62",ui_btn_start:"\u542F\u52A8\u6D41\u6C34\u7EBF",ui_btn_cancel:"\u53D6\u6D88",ui_btn_proceed:"\u7EE7\u7EED",ui_btn_continue:"\u7EE7\u7EED",ui_label_requirement:"\u9700\u6C42\u63CF\u8FF0",ui_label_project_dir:"\u9879\u76EE\u76EE\u5F55",ui_label_mode:"\u6A21\u5F0F",ui_label_language:"\u8BED\u8A00",ui_placeholder_requirement:"\u63CF\u8FF0\u9700\u6C42\uFF0C\u6216\u7C98\u8D34\u6587\u4EF6\u8DEF\u5F84...",ui_mode_greenfield:"\u65B0\u9879\u76EE",ui_mode_feature:"\u65B0\u529F\u80FD",ui_mode_bugfix:"\u4FEE\u590D Bug",ui_empty_state:"\u914D\u7F6E\u5E76\u542F\u52A8\u6D41\u6C34\u7EBF",ui_confirm_title:"\u786E\u8BA4\u6D41\u6C34\u7EBF\u914D\u7F6E",ui_cleanup_title:"\u4E0A\u6B21\u672A\u5B8C\u6210\u7684\u8FD0\u884C",ui_cleanup_desc:"\u4EE5\u4E0B\u8FD0\u884C\u672A\u6210\u529F\u5B8C\u6210\uFF0C\u8BF7\u9009\u62E9\u4FDD\u7559\u6216\u4E22\u5F03\u3002",ui_cleanup_keep:"\u4FDD\u7559",ui_cleanup_discard:"\u4E22\u5F03\uFF08\u5220\u9664\uFF09",ui_setup_title:"\u9996\u6B21\u8BBE\u7F6E",ui_setup_subtitle:"wildo \u4F7F\u7528 Claude\uFF08\u67B6\u6784\u5E08 / \u8BC4\u5BA1\u5458 / \u62A5\u544A\u5458\uFF09\u548C Codex\uFF08\u5F00\u53D1\u8005 / \u6D4B\u8BD5\u5458\uFF09\u3002\u8BF7\u914D\u7F6E\u5404\u63D0\u4F9B\u5546\u7684\u8BA4\u8BC1\u65B9\u5F0F\u3002",ui_setup_save:"\u4FDD\u5B58\u914D\u7F6E",ui_setup_detected:"\u5DF2\u68C0\u6D4B\u5230",ui_setup_no_auth:"\u672A\u68C0\u6D4B\u5230\u8BA4\u8BC1",ui_setup_use_sub:"\u4F7F\u7528 {provider} \u8BA2\u9605",ui_setup_sub_hint:"\u65E0\u9700 API key \u2014 \u4F7F\u7528\u672C\u5730 CLI \u767B\u5F55",ui_setup_use_env:"\u4F7F\u7528\u73AF\u5883\u53D8\u91CF\u4E2D\u7684 API key",ui_setup_use_env_hint:"\u5DF2\u68C0\u6D4B\u5230: {key}",ui_setup_new_key:"\u624B\u52A8\u8F93\u5165 API key",ui_ev_complete:"\u6D41\u6C34\u7EBF\u5B8C\u6210",ui_ev_stopped:"\u6D41\u6C34\u7EBF\u5DF2\u505C\u6B62",ui_ev_paused:"\u6682\u505C\u4E8E {phase}",ui_ev_error:"\u9519\u8BEF",ui_ev_report:"\u62A5\u544A",ui_ev_branch:"\u5206\u652F",ui_ev_partial:"\u90E8\u5206\u5DE5\u4F5C\u5DF2\u4FDD\u5B58\u3002",ui_ev_streaming:"\u8F93\u51FA\u4E2D...",ui_ev_output:"\u8F93\u51FA",ui_ev_interrupted:"\u5DF2\u4E2D\u65AD",ui_abort_confirm:"\u4E2D\u6B62\u6D41\u6C34\u7EBF\u5E76\u56DE\u9000\u6240\u6709\u66F4\u6539\uFF1F"}};function L(e,t,i){let o=(_[e]??_.en)[t]??_.en[t]??t;if(i)for(let[a,s]of Object.entries(i))o=o.replace(`{${a}}`,s);return o}function F(e){return{..._.en,..._[e]??{}}}export{A as a,P as b,R as c,T as d,E as e,K as f,D as g,S as h,O as i,L as j,F as k};
@@ -0,0 +1,61 @@
1
+ import{createInterface as A}from"readline";import*as M from"readline";var f="\x1B[",i=(r,n,s)=>`${f}38;2;${r};${n};${s}m`,b=(r,n,s)=>`${f}48;2;${r};${n};${s}m`;function I(){let r=process.env.WILDO_THEME?.toLowerCase();if(r==="light")return!0;if(r==="dark")return!1;let n=process.env.COLORFGBG;if(n){let s=n.split(";"),o=parseInt(s[s.length-1],10);if(!isNaN(o)&&o>=8)return!0}return!1}var a=I(),e={reset:`${f}0m`,bold:`${f}1m`,dim:`${f}2m`,italic:`${f}3m`,underline:`${f}4m`,accent:i(240,215,140),cyan:a?i(0,150,180):i(86,210,235),teal:a?i(0,160,140):i(45,212,191),green:a?i(30,160,60):i(80,220,120),blue:a?i(30,120,220):i(70,180,255),red:a?i(210,50,50):i(255,100,100),purple:a?i(130,80,220):i(180,140,255),orange:a?i(210,120,20):i(255,170,80),pink:a?i(210,80,130):i(255,130,180),white:a?i(30,34,40):i(235,240,245),gray:a?i(60,66,76):i(195,200,208),darkGray:i(120,128,140),veryDark:a?i(180,186,196):i(60,66,76),bgCard:a?b(240,243,248):b(22,27,34),bgHighlight:a?b(230,235,242):b(30,38,48),bgPass:a?b(220,250,230):b(20,60,30),bgFail:a?b(255,225,225):b(60,20,20)},m=`${f}2K`,L=r=>`${f}${r}A`,R=`${f}?25l`,C=`${f}?25h`;function _(r){let n=r.replace(/\x1b\[[0-9;]*m/g,""),s=0;for(let o of n){let t=o.codePointAt(0);t>=4352&&t<=4447||t>=11904&&t<=12350||t>=12352&&t<=13247||t>=13312&&t<=19903||t>=19968&&t<=42191||t>=44032&&t<=55215||t>=63744&&t<=64255||t>=65072&&t<=65135||t>=65281&&t<=65376||t>=65504&&t<=65510||t>=131072&&t<=195103?s+=2:s+=1}return s}function D(r,n){let s=r.replace(/\x1b\[[0-9;]*m/g,"");if(_(s)<=n)return[r];let o=[],t="",u=0;for(let c of s){let $=c.codePointAt(0),p=$>=4352&&$<=4447||$>=11904&&$<=12350||$>=12352&&$<=13247||$>=13312&&$<=19903||$>=19968&&$<=42191||$>=44032&&$<=55215||$>=63744&&$<=64255||$>=65072&&$<=65135||$>=65281&&$<=65376||$>=65504&&$<=65510||$>=131072&&$<=195103?2:1;u+p>n?(o.push(t),t=c,u=p):(t+=c,u+=p)}return t&&o.push(t),o}var q={architect:e.cyan,developer:e.green,tester:e.blue,reviewer:e.orange,reporter:e.purple,orchestrator:e.teal};function P(r){let n=r.toLowerCase();for(let[s,o]of Object.entries(q))if(n.includes(s))return o;return e.gray}var l=i(240,215,140),g=i(220,198,130),v=i(200,182,120),E=`
2
+ ${l}\u2588\u2588\u2557 \u2588\u2588\u2557${l}\u2588\u2588\u2557${g}\u2588\u2588\u2557 ${g}\u2588\u2588\u2588\u2588\u2588\u2588\u2557 ${v} \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ${e.reset}
3
+ ${l}\u2588\u2588\u2551 \u2588\u2588\u2551${l}\u2588\u2588\u2551${g}\u2588\u2588\u2551 ${g}\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557${v}\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557${e.reset}
4
+ ${l}\u2588\u2588\u2551 \u2588\u2557 \u2588\u2588\u2551${l}\u2588\u2588\u2551${g}\u2588\u2588\u2551 ${g}\u2588\u2588\u2551 \u2588\u2588\u2551${v}\u2588\u2588\u2551 \u2588\u2588\u2551${e.reset}
5
+ ${l}\u2588\u2588\u2551\u2588\u2588\u2588\u2557\u2588\u2588\u2551${l}\u2588\u2588\u2551${g}\u2588\u2588\u2551 ${g}\u2588\u2588\u2551 \u2588\u2588\u2551${v}\u2588\u2588\u2551 \u2588\u2588\u2551${e.reset}
6
+ ${l}\u255A\u2588\u2588\u2588\u2554\u2588\u2588\u2588\u2554\u255D${l}\u2588\u2588\u2551${g}\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557${g}\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D${v}\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D${e.reset}
7
+ ${l} \u255A\u2550\u2550\u255D\u255A\u2550\u2550\u255D ${l}\u255A\u2550\u255D${g}\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D${g}\u255A\u2550\u2550\u2550\u2550\u2550\u255D ${v} \u255A\u2550\u2550\u2550\u2550\u2550\u255D ${e.reset}
8
+ `;function H(){process.stdout.write(E),process.stdout.write(` ${e.gray}AI agents at your service${e.reset}
9
+
10
+ `)}function N(){process.stdout.write(E),process.stdout.write(` ${e.gray}AI \u4EE3\u7406\u4E3A\u60A8\u670D\u52A1${e.reset}
11
+
12
+ `)}function U(r){let n=Math.min(process.stdout.columns||64,64);if(r){let s=Math.max(2,Math.floor((n-r.length-4)/2));process.stdout.write(`${e.veryDark}${"\u2500".repeat(s)} ${e.gray}${r} ${e.veryDark}${"\u2500".repeat(s)}${e.reset}
13
+ `)}else process.stdout.write(`${e.veryDark}${"\u2500".repeat(n)}${e.reset}
14
+ `)}async function W(r){let{message:n,options:s,initial:o=0}=r,t=o;return new Promise(u=>{let{stdin:c}=process,$=c.isRaw;c.isTTY&&c.setRawMode(!0),c.resume();function p(){p._rendered&&process.stdout.write(L(s.length+1)),process.stdout.write(`${m} ${e.accent}${e.bold}?${e.reset} ${e.bold}${e.white}${n}${e.reset}
15
+ `);for(let x=0;x<s.length;x++){let d=s[x],y=x===t,G=y?`${e.accent}\u276F${e.reset}`:" ",O=y?`${e.white}${e.bold}${d.label}${e.reset}`:`${e.gray}${d.label}${e.reset}`,T=d.hint?` ${e.darkGray}${d.hint}${e.reset}`:"";process.stdout.write(`${m} ${G} ${O}${T}
16
+ `)}p._rendered=!0}p(),process.stdout.write(R);function h(){k(),process.stdout.write(L(s.length+1)),process.stdout.write(`${m} ${e.green}${e.bold}\u2713${e.reset} ${e.bold}${e.white}${n}${e.reset} ${e.accent}${s[t].label}${e.reset}
17
+ `);for(let x=0;x<s.length;x++)process.stdout.write(`${m}
18
+ `);process.stdout.write(L(s.length)),u(s[t].value)}function w(x){let d=x.toString();if(d==="\x1B[A"||d==="k"){t=(t-1+s.length)%s.length,p();return}if(d==="\x1B[B"||d==="j"){t=(t+1)%s.length,p();return}if(d==="\r"||d===`
19
+ `||d===" "){h();return}let y=parseInt(d,10);if(y>=1&&y<=s.length){t=y-1,h();return}d===""&&(k(),process.stdout.write(C),process.exit(0))}function k(){c.removeListener("data",w),c.isTTY&&c.setRawMode($??!1),c.pause(),process.stdout.write(C)}c.on("data",w)})}async function j(r){let{message:n,placeholder:s,defaultValue:o,password:t}=r;return new Promise(u=>{let c=A({input:process.stdin,output:process.stdout}),$=` ${e.accent}${e.bold}?${e.reset} ${e.bold}${e.white}${n}${e.reset}`,p=s?` ${e.darkGray}${s}${e.reset}`:o?` ${e.darkGray}${o}${e.reset}`:"";c.question(`${$}${p} `,h=>{let w=h.trim()||o||"";M.moveCursor(process.stdout,0,-1),process.stdout.write(`${m} ${e.green}${e.bold}\u2713${e.reset} ${e.bold}${e.white}${n}${e.reset} ${e.accent}${t?"\u2022".repeat(w.length||3):w||e.darkGray+"(empty)"}${e.reset}
20
+ `),c.close(),u(w)})})}function V(r){process.stdout.write(` ${e.accent}\u2139${e.reset} ${r}
21
+ `)}function B(r){process.stdout.write(` ${e.green}\u2713${e.reset} ${r}
22
+ `)}function Y(r){process.stdout.write(` ${e.orange}\u26A0${e.reset} ${r}
23
+ `)}function z(r){process.stdout.write(` ${e.red}\u2717${e.reset} ${r}
24
+ `)}function K(r,n){let s=Math.max(20,(process.stdout.columns||80)-5),o=n.split(`
25
+ `);process.stdout.write(`
26
+ ${e.veryDark}\u250C\u2500${e.reset} ${e.bold}${e.white}${r}${e.reset}
27
+ `);for(let t of o){let u=D(t,s);for(let c of u)process.stdout.write(` ${e.veryDark}\u2502${e.reset} ${c}
28
+ `)}process.stdout.write(` ${e.veryDark}\u2514\u2500${e.reset}
29
+
30
+ `)}function Z(r){let n=Math.min(process.stdout.columns||64,64),s=` ${r.toUpperCase()} `,o=Math.max(2,Math.floor((n-s.length)/2));process.stdout.write(`
31
+ ${e.veryDark}${"\u2501".repeat(o)}${e.reset}${e.accent}${e.bold}${s}${e.reset}${e.veryDark}${"\u2501".repeat(o)}${e.reset}
32
+
33
+ `)}function J(r,n,s){let o=P(r),t=r.toUpperCase().padEnd(10);n==="start"?process.stdout.write(` ${o}\u250C\u2500${e.reset} ${o}${e.bold}${t}${e.reset}${s?` ${e.gray}${s}${e.reset}`:""}
34
+ `):n==="working"?process.stdout.write(` ${o}\u2502${e.reset} ${e.gray}${s??""}${e.reset}
35
+ `):process.stdout.write(` ${o}\u2514\u2500${e.reset} ${e.gray}done${e.reset}${s?` ${e.darkGray}${s}${e.reset}`:""}
36
+
37
+ `)}function Q(r,n,s,o){let t=P(r),u=r.toUpperCase(),c=`${t}${e.bold}${u}${e.reset} ${e.gray}${n}${e.reset}`;if(o){let h=o==="PASS"?e.green:e.red,w=o==="PASS"?e.bgPass:e.bgFail;c+=` ${w}${h}${e.bold} ${o} ${e.reset}`}process.stdout.write(`
38
+ ${t}\u250C\u2500${e.reset} ${c}
39
+ `);let $=Math.max(20,(process.stdout.columns||80)-5),p=s.split(`
40
+ `);for(let h of p){let w=D(h,$);for(let k of w)process.stdout.write(` ${t}\u2502${e.reset} ${e.gray}${k}${e.reset}
41
+ `)}process.stdout.write(` ${t}\u2514\u2500${e.reset}
42
+
43
+ `)}function X(r,n,s,o="Review"){let t=Array.from({length:s},(u,c)=>c<n?`${e.accent}\u25CF${e.reset}`:`${e.darkGray}\u25CB${e.reset}`).join(" ");process.stdout.write(`
44
+ ${e.orange}\u21BB${e.reset} ${e.white}${e.bold}${o}${e.reset} ${e.gray}${r}${e.reset} ${t} ${e.darkGray}${n}/${s}${e.reset}
45
+
46
+ `)}function ee(r,n){process.stdout.write(` ${r} ${n}
47
+ `)}function te(r,n,s){let o=s??{title:"Pipeline Complete",report:"Report",branchLabel:"Branch"};process.stdout.write(`
48
+ ${e.green}\u250C\u2500${e.reset} ${e.green}${e.bold}\u2713 ${o.title}${e.reset}
49
+ `),process.stdout.write(` ${e.green}\u2502${e.reset} ${e.gray}${o.report} :${e.reset} ${e.white}${r}${e.reset}
50
+ `),process.stdout.write(` ${e.green}\u2502${e.reset} ${e.gray}${o.branchLabel}:${e.reset} ${e.white}${n}${e.reset}
51
+ `),process.stdout.write(` ${e.green}\u2514\u2500${e.reset}
52
+
53
+ `)}function re(r){let n=r.labels??{title:"Pipeline Configuration",dir:"Directory",mode:"Mode",lang:"Language",req:"Require."};process.stdout.write(`
54
+ ${e.accent}\u250C\u2500${e.reset} ${e.accent}${e.bold}${n.title}${e.reset}
55
+ `),process.stdout.write(` ${e.accent}\u2502${e.reset} ${e.gray}${n.dir.padEnd(8)}${e.reset} ${e.white}${r.dir}${e.reset}
56
+ `),process.stdout.write(` ${e.accent}\u2502${e.reset} ${e.gray}${n.mode.padEnd(8)}${e.reset} ${e.white}${r.mode}${e.reset}
57
+ `),process.stdout.write(` ${e.accent}\u2502${e.reset} ${e.gray}${n.lang.padEnd(8)}${e.reset} ${e.white}${r.lang}${e.reset}
58
+ `),r.req&&process.stdout.write(` ${e.accent}\u2502${e.reset} ${e.gray}${n.req.padEnd(8)}${e.reset} ${e.white}${r.req.replace(/\n/g," ")}${e.reset}
59
+ `),process.stdout.write(` ${e.accent}\u2514\u2500${e.reset}
60
+
61
+ `)}var S=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function se(r){let n=0,s=r;process.stdout.write(R);let o=setInterval(()=>{let t=S[n%S.length];process.stdout.write(`${m}\r ${e.accent}${t}${e.reset} ${s}`),n++},80);return{update(t){s=t},stop(t){clearInterval(o),process.stdout.write(`${m}\r${C}`),t&&B(t)}}}export{e as a,q as b,P as c,H as d,N as e,U as f,W as g,j as h,V as i,B as j,Y as k,z as l,K as m,Z as n,J as o,Q as p,X as q,ee as r,te as s,re as t,se as u};
package/dist/cli.js ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import{a as v,b,c as x}from"./chunk-JXNI22FR.js";import{c as g,d as p,g as _,j as r}from"./chunk-TMJX67JD.js";import"./chunk-TOAEOZEP.js";import{Command as S}from"commander";import{readFileSync as E,existsSync as I}from"fs";import{resolve as m}from"path";var h=process.argv.indexOf("--theme");h!==-1&&process.argv[h+1]&&(process.env.WILDO_THEME=process.argv[h+1]);_();async function O(){let{banner:$,bannerZh:e,select:a,text:n,divider:s,info:o,c:t}=await import("./tui-MIW7YP2V.js");if(!g()){let{runSetup:c}=await import("./setup-ONOARWXI.js");await c()}let i=p()??"en";process.stdout.write(`
3
+ `),i==="zh"?e():$(),s(),process.stdout.write(`
4
+ `);let l=await a({message:r(i,"cli_mode_msg"),options:[{value:"greenfield",label:r(i,"cli_mode_greenfield"),hint:r(i,"cli_mode_greenfield_hint")},{value:"feature",label:r(i,"cli_mode_feature"),hint:r(i,"cli_mode_feature_hint")},{value:"bugfix",label:r(i,"cli_mode_bugfix"),hint:r(i,"cli_mode_bugfix_hint")}]}),d=await n({message:r(i,"cli_req_msg"),placeholder:r(i,"cli_req_placeholder")}),M=await n({message:r(i,"cli_dir_msg"),placeholder:r(i,"cli_dir_placeholder"),defaultValue:"."}),w=m(M||"."),y=await a({message:r(i,"cli_output_msg"),options:[{value:"terminal",label:r(i,"cli_output_terminal"),hint:r(i,"cli_output_terminal_hint")},{value:"web",label:r(i,"cli_output_web"),hint:r(i,"cli_output_web_hint")}]}),u="";if(d){let c=m(d);if(I(c))try{u=E(c,"utf-8")}catch{u=d}else u=d}if(process.stdout.write(`
5
+ `),s(),o(`${t.bold}${r(i,"cli_starting")}${t.reset}`),process.stdout.write(`
6
+ `),y==="web"){let{startWebUI:c}=await import("./server.js");c({requirement:u,workingDir:w,mode:l,lang:i})}else await C(u,w,l,i)}async function C($,e,a,n){let{info:s,warn:o}=await import("./tui-MIW7YP2V.js"),t=new x($,e,a,n);try{let i=await t.run();process.stdout.write(`
7
+ `),s(r(n,"cli_done",{path:i}))}catch(i){if(process.stdout.write(`
8
+ `),i instanceof v)o(r(n,"cli_cancelled"));else if(i instanceof b){let l=r(n,"phase_id_"+i.phase),d=l!=="phase_id_"+i.phase?l:i.phase;o(r(n,"cli_paused",{msg:r(n,"cli_paused_phase",{phase:d})})),s(r(n,"cli_paused_hint")),process.exit(1)}else throw i}}var f=new S;function P(){let e="\x1B[0m",a="\x1B[1m",n="\x1B[2m",s="\x1B[38;2;240;215;140m",o="\x1B[38;2;195;200;208m",t="\x1B[38;2;130;138;150m",i=["",` ${s}${a}wildo${e} ${t}AI agents at your service${e}`,"",` ${s}USAGE${e}`,"",` ${o}$ wildo${e} ${t}interactive mode${e}`,` ${o}$ wildo "Build a REST API" -m greenfield${e} ${t}direct mode${e}`,` ${o}$ wildo requirements.md -m feature${e} ${t}from file${e}`,` ${o}$ wildo --setup${e} ${t}reconfigure${e}`,` ${o}$ wildo "Fix login bug" -m bugfix --ui${e} ${t}web UI${e}`,"",` ${s}ARGUMENTS${e}`,"",` ${o}requirement${e} ${t}Inline text or path to .md file${e}`,` ${t}Omit to enter interactive mode${e}`,"",` ${s}OPTIONS${e}`,"",` ${o}-m, --mode ${n}<mode>${e} ${t}greenfield | feature | bugfix ${n}(default: greenfield)${e}`,` ${o}-d, --working-dir ${n}<dir>${e}`,` ${t}Working directory ${n}(default: .)${e}`,` ${o}-l, --lang ${n}<lang>${e} ${t}Output language: en, zh, ...${e}`,` ${o}--ui${e} ${t}Launch web UI instead of terminal${e}`,` ${o}--setup${e} ${t}Run setup wizard${e}`,` ${o}--models${e} ${t}Configure agent models${e}`,` ${o}--theme ${n}<theme>${e} ${t}Color theme: dark, light, auto${e}`,` ${o}-V, --version${e} ${t}Show version${e}`,` ${o}-h, --help${e} ${t}Show this help${e}`,"",` ${s}MODES${e}`,"",` ${o}greenfield${e} ${t}Full pipeline \u2014 new project from scratch${e}`,` ${o}feature${e} ${t}Incremental spec on an existing codebase${e}`,` ${o}bugfix${e} ${t}Diagnose \u2192 fix \u2192 regression test${e}`,"",` ${s}AGENTS${e}`,"",` ${o}Architect${e} ${t}Design specs, decompose modules${e} ${n}Claude${e}`,` ${o}Developer${e} ${t}Write production code${e} ${n}Codex${e}`,` ${o}Tester${e} ${t}Write & run tests${e} ${n}Codex${e}`,` ${o}Reviewer${e} ${t}Multi-round code review${e} ${n}Claude${e}`,` ${o}Reporter${e} ${t}Generate final report${e} ${n}Claude${e}`,"",` ${s}CONFIG${e}`,"",` ${t}Config file${e} ${n}~/.wildo/config.json${e}`,` ${t}Model env${e} ${n}WILDO_MODEL_ARCHITECT=sonnet (per-role override)${e}`,` ${t}Theme env${e} ${n}WILDO_THEME=dark|light|auto${e}`,` ${t}First run${e} ${n}Auto-enters setup wizard${e}`,""];process.stdout.write(i.join(`
9
+ `)+`
10
+ `)}f.name("wildo").description("Will do! Multi-agent pipeline \u2014 AI agents at your service").version("0.5.11").argument("[requirement]","Path to requirement file, or inline text").option("-d, --working-dir <dir>","Working directory for code generation",".").option("-m, --mode <mode>","Pipeline mode: greenfield | feature | bugfix","greenfield").option("-l, --lang <lang>","Output language for documents/reports (e.g., zh, en)").option("--ui","Launch web UI instead of terminal output").option("--setup","Run setup wizard (reconfigure auth & language)").option("--models","Configure agent models").option("--theme <theme>","Color theme: dark | light | auto").addHelpCommand(!1).helpOption("-h, --help","Show this help");f.outputHelp=()=>{P()};f.action(async($,e)=>{if(e.setup){let{runSetup:i}=await import("./setup-ONOARWXI.js");await i();return}if(e.models){let{setupModels:i}=await import("./setup-ONOARWXI.js"),l=p()??"en";await i(l);return}if(!$&&!e.ui&&!process.argv.some(i=>i==="-m"||i==="--mode")){await O();return}if(!g()){let{runSetup:i}=await import("./setup-ONOARWXI.js");await i()}let a=e.mode,n=["greenfield","feature","bugfix"];n.includes(a)||(console.error(`Invalid mode '${a}'. Must be one of: ${n.join(", ")}`),process.exit(1)),!$&&a!=="greenfield"&&(console.error("Error: requirement is required for feature/bugfix modes"),process.exit(1));let s="";if($){let i=m($);if(I(i))try{s=E(i,"utf-8")}catch{s=$}else s=$}let o=e.lang??p()??"en",t=m(e.workingDir);if(e.ui){let{startWebUI:i}=await import("./server.js");i({requirement:s,workingDir:t,mode:a,lang:o})}else await C(s,t,a,o)});f.parse();