@doubao-dev/cli 0.0.34 → 0.0.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/1232.js +1 -0
- package/dist/1264.js +1 -0
- package/dist/1611.js +2 -0
- package/dist/2232.js +60 -0
- package/dist/2507.js +1 -0
- package/dist/275.js +5 -8
- package/dist/2932.js +1 -1
- package/dist/4525.js +1 -1
- package/dist/4880.js +1 -1
- package/dist/4931.js +1 -1
- package/dist/{3688.js → 5887.js} +3 -3
- package/dist/6438.js +140 -0
- package/dist/6976.js +280 -0
- package/dist/{8981.js.LICENSE.txt → 6976.js.LICENSE.txt} +108 -0
- package/dist/7410.js +1 -2
- package/dist/@byted-doubao-apps/create.js +1 -1
- package/dist/@byted-doubao-apps/kit.js +1 -1
- package/dist/@byted-doubao-apps/login.js +2 -2
- package/dist/@byted-doubao-apps/login~1.js +2 -2
- package/dist/@byted-doubao-apps/template-empty/package.json +3 -3
- package/dist/@byted-doubao-apps/template-starter/package.json +3 -3
- package/dist/@byted-hdt/cli.js +1 -1
- package/dist/@inquirer/select.js +1 -1
- package/dist/{assets/web-sdk-debugger/static/wasm/eaf690f2cd.module.wasm → @lynx-js/static/wasm/77fb77f77f.module.wasm} +0 -0
- package/dist/@lynx-js/{web-core-canary.js → web-core.js} +2 -2
- package/dist/app.js +1 -1
- package/dist/assets/web-sdk-debugger/__doubao_web_sdk_native_modules/applet-bridge-module-core.js +1 -1
- package/dist/assets/web-sdk-debugger/index.html +1 -1
- package/dist/assets/web-sdk-debugger/preact-devtools/index.js +4 -1
- package/dist/assets/web-sdk-debugger/static/css/index.ef5d8bc5ad.css +1 -0
- package/dist/assets/web-sdk-debugger/static/js/{682.de47e82f6b.js → 426.53c43a8594.js} +2 -2
- package/dist/assets/web-sdk-debugger/static/js/479.26e0b1d922.js +1829 -0
- package/dist/assets/web-sdk-debugger/static/js/async/503.259fed5610.js +1 -0
- package/dist/assets/web-sdk-debugger/static/js/async/{legacy-wasm-js.bacc8b5564.js → legacy-wasm-js.9b9367f818.js} +2 -2
- package/dist/assets/web-sdk-debugger/static/js/async/lynx-core-chunk.7f5e94dfae.js +5 -0
- package/dist/assets/web-sdk-debugger/static/js/async/web-core-main-chunk.f78260697f.js +1 -0
- package/dist/assets/web-sdk-debugger/static/js/async/web-core-markup-encoder.33c43c480e.js +4 -0
- package/dist/assets/web-sdk-debugger/static/js/async/web-core-template-loader-thread.ba290b32d7.js +4 -0
- package/dist/assets/web-sdk-debugger/static/js/async/web-core-worker-chunk.9a5989b104.js +1 -0
- package/dist/assets/web-sdk-debugger/static/js/async/web-elements.3fbd53918e.js +365 -0
- package/dist/assets/web-sdk-debugger/static/js/async/xmarkdown-deps.efd0ffb051.js +5 -0
- package/dist/assets/web-sdk-debugger/static/js/async/{xmarkdown-deps.3ea5672b2c.js.LICENSE.txt → xmarkdown-deps.efd0ffb051.js.LICENSE.txt} +1 -1
- package/dist/assets/web-sdk-debugger/static/js/index.b6e5c76345.js +44 -0
- package/dist/assets/web-sdk-debugger/static/js/lib-polyfill.c91181f230.js +1 -0
- package/dist/assets/web-sdk-debugger/static/wasm/{69a8ba8eb9.module.wasm → 4c402c7981.module.wasm} +0 -0
- package/dist/assets/web-sdk-debugger/static/wasm/{03b02f9e5a.module.wasm → 72aaf7d0aa.module.wasm} +0 -0
- package/dist/{@lynx-js/static/wasm/eaf690f2cd.module.wasm → assets/web-sdk-debugger/static/wasm/77fb77f77f.module.wasm} +0 -0
- package/dist/assets/web-sdk-debugger/wsd/doubao-apps-api.template.js +0 -0
- package/dist/assets/web-sdk-debugger/wsd/doubao-apps-framework.template.js +0 -0
- package/dist/assets/web-sdk-debugger/wsd/doubao-apps-react-dev.template.js +0 -0
- package/dist/assets/web-sdk-debugger/wsd/doubao-apps-react.template.js +0 -0
- package/dist/browser.js +1 -1
- package/dist/build.js +1 -1
- package/dist/build~1.js +10 -10
- package/dist/check.js +1 -1
- package/dist/client.js +1 -0
- package/dist/client~1.js +1 -0
- package/dist/components-loader.js +1 -1
- package/dist/demo-server.js +2 -2
- package/dist/demo.js +2 -2
- package/dist/dev-config.js +2 -2
- package/dist/dev-shell.js +1 -1
- package/dist/dev.js +19 -16
- package/dist/explore.js +10 -0
- package/dist/gen-explore.js +1 -1
- package/dist/gen-trajectory.js +1 -1
- package/dist/info.js +2 -2
- package/dist/init.js +4 -4
- package/dist/ink.js +1 -1
- package/dist/inquirer.js +1 -1
- package/dist/json-file.js +2 -2
- package/dist/legacy-status.js +1 -1
- package/dist/legacy-upload.js +1 -1
- package/dist/lepus.js +1 -1
- package/dist/login.js +2 -1
- package/dist/main.js +1 -1
- package/dist/{manifest-mcp-config.js → manifest-headers.js} +1 -1
- package/dist/ora.js +1 -1
- package/dist/portal.js +1 -1
- package/dist/project-layout.js +1 -1
- package/dist/project.js +1 -1
- package/dist/prompt.js +8 -8
- package/dist/prompts.js +1 -1
- package/dist/qrcode.js +1 -0
- package/dist/report.js +1 -1
- package/dist/run-registry.js +1 -1
- package/dist/run.js +321 -321
- package/dist/sandbox.js +1 -1
- package/dist/scan.js +1 -1
- package/dist/sdk.js +192 -59
- package/dist/sdk~1.js +66 -58
- package/dist/server.js +10 -10
- package/dist/skill.js +1 -1
- package/dist/skills.js +1 -1
- package/dist/skills~1.js +1 -1
- package/dist/status.js +1 -1
- package/dist/status~1.js +2 -2
- package/dist/stop.js +1 -1
- package/dist/sync.js +1 -1
- package/dist/trajectory.js +3 -0
- package/dist/update.js +1 -1
- package/dist/upgrade.js +1 -1
- package/dist/workspace.js +1 -1
- package/dist/yaml.js +1 -1
- package/package.json +7 -7
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/02-/347/263/273/347/273/237.md +2 -2
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/06-/350/267/257/347/224/261.md +4 -0
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/07-/347/225/214/351/235/242.md +8 -0
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/26-/345/237/272/347/241/200/344/277/241/346/201/257.md +2 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/33-/345/261/217/345/271/225.md +124 -8
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/groups.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/doubao-agentic-service-api/quick-reference.md +2 -1
- package/skills/doubao-agentic-service-development/references/frontend/examples/page-widget-basics.md +1 -0
- package/skills/doubao-agentic-service-development/references/frontend/guides/client-tools-and-events.md +209 -0
- package/skills/doubao-agentic-service-development/references/frontend/guides/component-development.md +7 -1
- package/skills/doubao-agentic-service-development/references/frontend/guides/debugger-mcp.md +1 -1
- package/skills/doubao-agentic-service-development/references/frontend/widget-templates/overview.md +13 -9
- package/skills/doubao-agentic-service-development/references/frontend/widget-templates/props.md +26 -1
- package/skills/doubao-agentic-service-development/references/frontend-dev.md +2 -0
- package/dist/2168.js +0 -60
- package/dist/318.js +0 -1
- package/dist/3974.js +0 -151
- package/dist/6427.js +0 -126
- package/dist/7417.js +0 -204
- package/dist/7417.js.LICENSE.txt +0 -107
- package/dist/7945.js +0 -1
- package/dist/8981.js +0 -78
- package/dist/assets/web-sdk-debugger/static/css/index.7c65607402.css +0 -1
- package/dist/assets/web-sdk-debugger/static/js/670.8a8f0f7d57.js +0 -1829
- package/dist/assets/web-sdk-debugger/static/js/async/503.cf61731bba.js +0 -1
- package/dist/assets/web-sdk-debugger/static/js/async/lynx-core-chunk.afc1ded023.js +0 -5
- package/dist/assets/web-sdk-debugger/static/js/async/web-core-main-chunk.7fe9af852c.js +0 -1
- package/dist/assets/web-sdk-debugger/static/js/async/web-core-markup-encoder.f81d6d2cae.js +0 -4
- package/dist/assets/web-sdk-debugger/static/js/async/web-core-template-loader-thread.4a49f8a286.js +0 -4
- package/dist/assets/web-sdk-debugger/static/js/async/web-core-worker-chunk.c315fd6753.js +0 -1
- package/dist/assets/web-sdk-debugger/static/js/async/web-elements.43d1e29387.js +0 -365
- package/dist/assets/web-sdk-debugger/static/js/async/xmarkdown-deps.3ea5672b2c.js +0 -5
- package/dist/assets/web-sdk-debugger/static/js/index.9f626ba3a2.js +0 -44
- package/dist/assets/web-sdk-debugger/static/js/lib-polyfill.9daa7c863e.js +0 -1
- package/dist/simulator-client.js +0 -1
- /package/dist/{7410.js.LICENSE.txt → 1611.js.LICENSE.txt} +0 -0
- /package/dist/assets/web-sdk-debugger/static/js/{670.8a8f0f7d57.js.LICENSE.txt → 479.26e0b1d922.js.LICENSE.txt} +0 -0
package/dist/explore.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import"node:module";import{requestStructuredOutput as e,logger as t,connectMCPClient as o,formatMs as n,buildExploreStepPrompt as r,parseJSONObject as a,parseJSONOrText as l,registerStructuredOutputDiagnostics as s,LLMClient as i,buildExploreSystemPrompt as p}from"./6438.js";import{isRecord as _}from"./2232.js";let d=/(^|[_.-])(add|book|cancel|confirm|create|delete|edit|modify|pay|purchase|refund|remove|reserve|save|send|set|submit|update|upsert|write)([_.-]|$)/i,m=/^(?:\[[^\]]+\]\s*)?(创建|新增|更新|修改|删除|移除|取消|提交|支付|写入|设置|保存|发送|预订|预约|退款)/;function g(e){return!d.test(e.name)&&!m.test(e.description?.trim()??"")}async function u(e,a={}){e.signal?.throwIfAborted();let _=new Date().toISOString();t.debug("[gen-explore] 正在连接 MCP 服务");let d=await o(e.mcp.url,e.app.appId,e.mcp.headers);try{var m;e.signal?.throwIfAborted();let o=d.tools.tools,u=o.filter(g),h=o.filter(e=>!g(e));t.log(`[gen-explore] MCP 服务连接完成(工具 ${o.length} 个)`),h.length>0&&t.log(`[gen-explore] 已排除写操作工具(${h.length} 个)`);let $=new i({...e.llm,appKey:e.app.appId},e.signal);a.diagnosticDir&&s($,a.diagnosticDir);let y=[],S={},w=new Set,b=c(a.trajectories,1),x=c(a.maxSteps,(m=u.length,Math.max(0,3*m))),v=new Set(u.map(e=>e.name)),I=p(u,a.referenceTime??_);t.debug(`[gen-explore] 正在探索(${b} 条轨迹,每条最多 ${x} 步)……`);for(let o=1;o<=b;o++){let s=[],i={},p=new Set;for(let _=0;_<x;_++){let m;if(e.signal?.throwIfAborted(),u.every(e=>p.has(e.name))){t.debug(`[gen-explore] 轨迹 ${o}:已覆盖所有工具。`);break}let g=r({tools:u,traces:s,entityPool:i,toolsCovered:[...p],step:_,trajectory:o,apiDependencies:a.apiDependencies}),c=await f($,I,g,v);if(c.done){t.log(`[gen-explore] 探索轨迹 ${o} 已完成(Step ${_+1})`);break}t.log(`[gen-explore] 正在调用工具:${c.tool_name}(轨迹 ${o},Step ${_+1})`);let h=Date.now();try{m=await d.callTool({tool_name:c.tool_name,arguments:c.arguments})}catch(t){if(e.signal?.aborted)throw e.signal.reason;m={content:t.message,is_error:!0}}t.log(`[gen-explore] 工具调用完成:${c.tool_name}(轨迹 ${o},Step ${_+1},${m.is_error?"失败":"成功"},耗时 ${n(Date.now()-h)})`);let b=m.structured||(m.content?l(m.content):null)||m.content,x=function(e){if(!e||"object"!=typeof e)return[];for(let t of["products","entities","entity_list","items","orders","results","data"])if(Array.isArray(e[t]))return e[t];return Array.isArray(e)?e:Object.keys(e).some(e=>e.includes("id"))?[e]:[]}(b);x.length>0&&(S[c.tool_name]||(S[c.tool_name]=[]),i[c.tool_name]||(i[c.tool_name]=[]),S[c.tool_name].push(...x),i[c.tool_name].push(...x)),m.is_error||(w.add(c.tool_name),p.add(c.tool_name));let O={trajectory:o,step:_+1,tool_name:c.tool_name,arguments:c.arguments,result:b,is_error:m.is_error||!1,entities_extracted:x};s.push(O),y.push(O)}}let O=u.map(e=>e.name),A=y.filter(e=>e.is_error).length,j=y.length-A,D=O.filter(e=>!w.has(e));return t.log(`[gen-explore] 已完成 ${b} 条轨迹、${y.length} 步(${j} 步成功 / ${A} 步失败),覆盖: ${w.size}/${O.length}${D.length?`,未覆盖:${D.join(", ")}`:""}`),{metadata:{app_id:e.app.appId,total_steps:y.length,total_trajectories:b,tools_covered:O.filter(e=>w.has(e)),tools_not_covered:O.filter(e=>!w.has(e)),started_at:_,finished_at:new Date().toISOString(),run_id:a.runId},traces:y,entity_pool:S}}finally{d.close()}}function c(e,t){let o=Number(e);return Number.isInteger(o)&&o>0?o:t}async function f(t,o,n,r){return e({llmClient:t,stage:"explore:action",messages:[{role:"system",content:o},{role:"user",content:n}],completionOptions:{response_format:{type:"json_object"}},parse:e=>(function(e,t){let o=a(e),n="string"==typeof o.selected_function?o.selected_function:"string"==typeof o.tool_name?o.tool_name:void 0;if("__STOP__"===n||!0===o.done)return{done:!0,reason:"string"==typeof o.reasoning?o.reasoning:"string"==typeof o.reason?o.reason:"done"};if(!n)throw Error('response must contain string field "selected_function"');if(!t.has(n))throw Error(`selected_function "${n}" is not an allowed read-only tool`);let r=o.arguments??{};if(!_(r))throw Error('"arguments" must be a JSON object');return{done:!1,tool_name:n,arguments:r}})(e,r),buildRepairPrompt:({error:e})=>{var t;return t=[...r],`上一个 Explore 决策未通过结构校验,请只修复 JSON,不要解释。
|
|
2
|
+
|
|
3
|
+
校验错误:${e}
|
|
4
|
+
允许的只读工具:${JSON.stringify(t)}
|
|
5
|
+
|
|
6
|
+
只输出以下两种结构之一:
|
|
7
|
+
{"selected_function":"允许的只读工具名","arguments":{}}
|
|
8
|
+
{"selected_function":"__STOP__","arguments":{}}
|
|
9
|
+
|
|
10
|
+
arguments 必须是 JSON 对象,selected_function 必须严格取自允许工具列表。`}})}export{u as genExplore};
|
package/dist/gen-explore.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./
|
|
1
|
+
import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./1264.js";import{projectEvalConfigPath as o,buildConfig as e}from"./6438.js";import{command_Command as p,runCommand as n}from"./2232.js";import{genExplore as r}from"./explore.js";let a=t("node:fs"),i=t("node:path");export default function(){return new p("gen-explore").description("系统探索全部 MCP 工具,收集调用轨迹和实体池").option("-c, --config <path>","YAML 配置文件路径").option("--project-path <path>","dbx 项目路径",".").option("--mcp-url <url>","MCP 服务地址").option("--app-id <id>","AppID").option("--max-step <n>","每个工具的最大调用步数").option("--model <model>","网关模型别名或自定义 LLM").option("--base-url <url>","兼容 OpenAI 的自定义 LLM 服务地址").option("--api-key <key>","自定义 LLM API 密钥").option("-o, --output <path>","输出文件路径").action(async(t,p)=>n(p,async p=>{let n=await e(t);p.targetAppId=n.app.appId,p.log(`项目评测配置:${o(t.projectPath)}`);let l=(0,i.resolve)("./data");(0,a.existsSync)(l)||(0,a.mkdirSync)(l,{recursive:!0});let _=t.output?(0,i.resolve)(t.output):(0,i.join)(l,`explore-${Date.now()}.json`),d=await r(n,{referenceTime:new Date().toISOString(),diagnosticDir:(0,i.resolve)(_,"..")});return(0,a.writeFileSync)(_,JSON.stringify(d,null,2)),p.log("探索结果已保存"),p.log(`调用步数:${d.metadata.total_steps},已覆盖工具:${d.metadata.tools_covered.length}/${d.metadata.tools_covered.length+d.metadata.tools_not_covered.length}`),d}))};
|
package/dist/gen-trajectory.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./
|
|
1
|
+
import"node:module";import{__webpack_require__ as t}from"./rslib-runtime.js";import"./1264.js";import{projectEvalConfigPath as o,buildConfig as e}from"./6438.js";import{command_Command as n,runCommand as i}from"./2232.js";import{genTrajectory as p}from"./trajectory.js";let r=t("node:fs"),a=t("node:path");export default function(){return new n("gen-trajectory").description("通过用户代理(UA)和模拟器生成多轮对话轨迹").requiredOption("-i, --intent <text>","用户意图或任务描述").option("-c, --config <path>","YAML 配置文件路径").option("--project-path <path>","dbx 项目路径",".").option("--mcp-url <url>","MCP 服务地址").option("--app-id <id>","AppID").option("--gateway <url>","网关地址").option("--max-rounds <n>","最大对话轮数").option("--max-step <n>","每轮最大工具调用步数").option("--model <model>","网关模型别名或自定义 LLM").option("--base-url <url>","兼容 OpenAI 的自定义 LLM 服务地址").option("--api-key <key>","自定义 LLM API 密钥").option("--manifest <path>","Manifest YAML 文件路径").option("--skill <path>","Skill 目录路径").option("-o, --output <path>","输出文件路径").action(async(t,n)=>i(n,async n=>{let i=await e(t);if(!i.app.appId)throw Error("缺少必填项 app_id");n.targetAppId=i.app.appId,n.log(`项目评测配置:${o(t.projectPath)}`);let l=(0,a.resolve)("./data");(0,r.existsSync)(l)||(0,r.mkdirSync)(l,{recursive:!0});let _=t.output?(0,a.resolve)(t.output):(0,a.join)(l,`trajectory-${Date.now()}.json`);i.dev&&(i.dev.screenshotDir=(0,a.join)((0,a.resolve)(_,".."),"screenshot"));let s=await p(i,t.intent,{referenceTime:new Date().toISOString(),diagnosticDir:(0,a.resolve)(_,"..")});(0,r.writeFileSync)(_,JSON.stringify(s,null,2));let d={ua_stop:"用户代理结束对话",max_rounds:"已达最大轮数",terminated:"已终止"}[s.metadata.stop_reason];return n.log("评测轨迹已保存"),n.log(`对话轮数:${s.metadata.total_rounds},停止原因:${d}`),s}))};
|
package/dist/info.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"node:module";import{CliUsageError as e,runCommand as o,command_Command as t,CliError as n}from"./
|
|
2
|
-
`),
|
|
1
|
+
import"node:module";import{CliUsageError as e,runCommand as o,command_Command as t,CliError as n}from"./2232.js";import{fetchSandboxAppCredentials as a,resolveExistingSandboxProjectDirectory as p}from"./sandbox.js";async function r(o,t,_=a){let c,d=p(t.project);if(!d)throw new e(t.project?`在 ${t.project} 中未找到 DBX 项目:请指定包含 manifest.yaml(或旧版 .dbx/config.json)的项目目录`:"未找到 DBX 项目:请在包含 manifest.yaml(或旧版 .dbx/config.json)的项目中运行,或通过 --project 指定项目目录","DBX_PROJECT_INVALID");try{c=await _(d)}catch{throw new n("无法获取 Sandbox 凭证",{code:"DBX_REMOTE_ERROR"})}o.targetAppId=c.sandbox_app_id;let i={sandbox_app_id:c.sandbox_app_id,secret_available:!!c.sandbox_app_secret,...t.includeSecret?{sandbox_app_secret:c.sandbox_app_secret}:{}};return o.log(`sandbox_app_id: ${i.sandbox_app_id}`),o.log(`应用密钥:${i.secret_available?"可用":"不可用"}`),t.includeSecret&&!o.json&&process.stdout.write(`Sandbox 应用密钥:${c.sandbox_app_secret}
|
|
2
|
+
`),i}export default function(){return new t("info").description("查看 Sandbox 信息").option("--project <path>","项目目录,默认从当前目录向上查找最近的项目").option("--include-secret","同时显示 AppSecret(默认隐藏)",!1).action(async(e,t)=>o(t,o=>r(o,e)))};export{r as runSandboxInfo};
|
package/dist/init.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./
|
|
1
|
+
import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";import"./1264.js";import"./ora.js";import"./yaml.js";import{collectChoiceValues as t,auth_login as r,isRecord as i,version_version as n,command_Command as s,option_Option as o,types_TokenStatus as a,formatPollStatus as p,runCommand as l,getAuthStatus as d,execa as c}from"./2232.js";import{AGENTIC_SERVICE_SKILL_NAME as u,AGENTIC_SERVICE_DISPLAY_NAME as h,DEFAULT_FRONTEND_DIRECTORY as m}from"./app.js";import{source as _}from"./5887.js";import{resolveProjectLayout as f}from"./project-layout.js";import{INIT_AGENT_IDS as g,selectInitAgents as y,selectGitInitialization as S,inputProjectDirectory as w}from"./prompts.js";import{fetchSandboxAppCredentials as b}from"./sandbox.js";import{installSkills as v,SUPPORTED_AGENTS as x}from"./skills~1.js";import{openUrlInBrowser as k}from"./browser.js";var E={};e.r(E),e.d(E,{default:()=>ei});let j=e("node:fs");var A=e.n(j);let $=e("node:path");var P=e.n($);let R=new Set(["node_modules",".git"]);async function C(e){var t;let r=e.appId.trim();if(!r)throw Error("创建前端项目需要 Sandbox AppID");let i=e.directory?.trim()||".",n=P().resolve(e.projectPath),s=P().resolve(n,i),o=(t=s,P().basename(t)||m),a=!!(e.overwriteExisting&&(0,j.existsSync)(s));a&&s!==n&&(e.onStatus?.("clearing_existing_directory"),function(e){if(!(0,j.statSync)(e).isDirectory())throw Error(`前端项目目标路径不是目录: ${e}`);for(let t of(0,j.readdirSync)(e))R.has(t)||(0,j.rmSync)(P().join(e,t),{recursive:!0,force:!0});(0,j.mkdirSync)(e,{recursive:!0})}(s)),e.onStatus?.("creating_scaffold");let{create:p}=await import("./@byted-doubao-apps/create.js");return await p({template:"starter",projectDir:s,public:!0,appId:r,name:h,packageName:o,overwrite:!0,git:e.initializeGit??!1,login:!0}),{directory:i,path:s,app_id:r,template:"starter",package_name:o,overwritten:a}}let N=`这是一个豆包智能服务工程,请结合 ${u} Skill 进行开发`,K=e("../../../node_modules/.pnpm/ora@5.4.1/node_modules/ora/index.js");var I=e.n(K);class U{options;spinner;constructor(e){this.options=e}header(e){if(!this.options.enabled)return;let t=this.options.useSpinner?_.bold.cyan(e):`== ${e} ==`;this.options.log(t)}section(e){if(!this.options.enabled)return;let t=this.options.useSpinner?_.bold(e):e;this.options.log(t)}blank(){this.options.enabled&&this.options.log("")}info(e,t){this.options.enabled&&this.options.log(function(e,t,r){if(void 0===t)return` ${e}`;let i=r?_.cyan(e):e;return` ${i}: ${t}`}(e,t,this.options.useSpinner))}note(e){this.options.enabled&&this.options.log(` - ${e}`)}warn(e){this.options.enabled&&(this.stopActive(),this.options.warn(e))}startStep(e){if(this.options.enabled){if(this.stopActive(),this.options.useSpinner){this.spinner=I()({text:e,color:"cyan",stream:process.stderr}).start();return}this.options.log(O("run",e,this.options.useSpinner))}}updateStep(e){if(this.options.enabled){if(!this.spinner)return void this.options.log(O("run",e,this.options.useSpinner));this.spinner.text=e}}succeedStep(e){if(this.options.enabled){if(this.spinner){this.spinner.succeed(e),this.spinner=void 0;return}this.options.log(O("ok",e,this.options.useSpinner))}}warnStep(e){if(this.options.enabled){if(this.spinner){this.spinner.warn(e),this.spinner=void 0;return}this.options.warn(O("warn",e,this.options.useSpinner))}}failStep(e){if(this.options.enabled){if(this.spinner){this.spinner.fail(e),this.spinner=void 0;return}this.options.warn(O("fail",e,this.options.useSpinner))}}stopActive(){this.spinner&&(this.spinner.stop(),this.spinner=void 0)}}function M(){return!!(process.stderr.isTTY&&!process.env.CI)}function O(e,t,r){let i=`[${{run:"进行中",ok:"完成",warn:"警告",fail:"失败"}[e]}]`;if(!r)return` ${i} ${t}`;let n="ok"===e?_.green:"warn"===e?_.yellow:"fail"===e?_.red:_.cyan;return` ${n(i)} ${t}`}let T=e("node:util"),D=["@swc/core","@speedy-js/esbuild","core-js","crc64-ecma182.js","esbuild"],G=["@byted-lynx/js-check-"],H={commandVersion:async e=>(await c(e,["--version"],{env:process.env,stdio:["ignore","pipe","pipe"]})).stdout.trim(),pnpmInstall:async(e,t={})=>J(["install"],e,{streamOutput:t.streamOutput??!1}),pnpmApproveBuilds:async(e,t)=>J("all"===t?["approve-builds","--all"]:["approve-builds",...t],e,{streamOutput:!1})};async function V(e=H){try{return{version:await e.commandVersion("npm")}}catch{throw Error("在 PATH 中未找到 npm。dbx init 需要 npm,请安装 Node.js/npm 后重试。")}}async function F(e=H){try{return{version:await e.commandVersion("pnpm")}}catch{throw Error("在 PATH 中未找到 pnpm。dbx init 需要 pnpm,请安装后重试。")}}async function B(e,t={}){let r=t.runner??H,i=t.autoApproveBuilds??"known",n=0;try{return n+=1,await r.pnpmInstall(e,{streamOutput:t.streamOutput}),{dependencies_installed:!0,install_attempts:n,recovered_from_ignored_builds:!1,approved_builds:[]}}catch(a){let s;if(!1===i||!((s=X(a)).includes("ERR_PNPM_IGNORED_BUILDS")||s.includes("Ignored build scripts:")))return Y(e,n,a);let o=function(e,t){var r;let i;if(t.pnpmVersion&&!q(t.pnpmVersion,"10.1.0"))return null;let n=(r=X(e),(i=(0,T.stripVTControlCharacters)(r).match(/Ignored build scripts:\s*([\s\S]*?)(?:\n\s*\n|\nRun\s+"pnpm approve-builds"|$)/))?i[1].split(",").map(e=>(function(e){if(!e)return null;if(e.startsWith("@")){let t=e.indexOf("@",1);return t>0?e.slice(0,t):e}let t=e.lastIndexOf("@");return t>0?e.slice(0,t):e})(e.trim().replace(/[.。]$/,""))).filter(e=>!!e):[]),s="all-pending"===t.mode?n:n.filter(z);return s.length>0?[...new Set(s)]:"all-pending"===t.mode&&t.pnpmVersion&&q(t.pnpmVersion,"10.32.0")?"all":null}(a,{mode:i,pnpmVersion:t.pnpmVersion});if(!o)return Y(e,n,a);try{return await r.pnpmApproveBuilds(e,o),n+=1,await r.pnpmInstall(e,{streamOutput:t.streamOutput}),{dependencies_installed:!0,install_attempts:n,recovered_from_ignored_builds:!0,approved_builds:"all"===o?["*"]:[...o]}}catch(t){return Y(e,n,t,{approvedBuilds:"all"===o?["*"]:[...o]})}}}function z(e){return D.includes(e)||G.some(t=>e.startsWith(t))}function q(e,t){let r=L(e),i=L(t);if(!r||!i)return!1;for(let e=0;e<r.length&&!(r[e]>i[e]);e+=1)if(r[e]<i[e])return!1;return!0}function L(e){let t=e.trim().match(/^v?(\d+)\.(\d+)\.(\d+)/);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}function Y(e,t,r,i={}){return{dependencies_installed:!1,install_attempts:t,recovered_from_ignored_builds:!1,approved_builds:i.approvedBuilds??[],install_warning:`在 ${e} 中执行 pnpm install 未完成: ${W(r)}`}}async function J(e,t,r){var i;let n=c("pnpm",[...e],{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"],all:!0});return r.streamOutput&&n.all?.pipe(process.stderr),{stdout:(i=await n).stdout??"",stderr:i.stderr??"",all:i.all??[i.stdout,i.stderr].filter(Boolean).join("\n")}}function W(e){if(e&&"object"==typeof e&&"shortMessage"in e){let t=e.shortMessage;if("string"==typeof t&&t.length>0)return t}return e instanceof Error&&e.message?e.message:String(e)}function X(e){let t=[W(e)];return e&&"object"==typeof e&&("string"==typeof e.all&&t.push(e.all),"string"==typeof e.stdout&&t.push(e.stdout),"string"==typeof e.stderr&&t.push(e.stderr)),t.filter(Boolean).join("\n")}let Q=e("node:url"),Z=e("../../../node_modules/.pnpm/yaml@2.9.0/node_modules/yaml/dist/index.js"),ee="__DBX_APP_KEY__";function et(e){let t=P().dirname((0,Q.fileURLToPath)(import.meta.url)),r=P().join(t,"templates",e);if(!A().existsSync(r))throw Error(`未找到 dbx init 模板: ${e}`);return A().readFileSync(r,"utf8")}let er="项目文件夹名";function ei(){return new s("init").description("创建一个新的 dbx 项目").argument("[directory]","要创建的新项目目录名").option("-y, --yes","允许覆盖已有非软链 Skill 目录;覆盖前会自动备份",!1).addOption(new o("--agent <agent>","要初始化的 Agent,可重复传入;universal 会自动包含").default([]).argParser(t(g))).option("--no-install-deps","创建前端脚手架后不安装依赖").option("--git","在项目根目录初始化 Git 仓库").option("--schema","输出 dbx init 的机器可读参数契约;不执行初始化",!1).addHelpText("after",`
|
|
2
2
|
Examples:
|
|
3
|
-
${
|
|
4
|
-
`,"utf8"),{path:t,created:!0,updated:!1,already_present:!1};let r=(0,j.readFileSync)(t,"utf8");if(r.includes(
|
|
5
|
-
`,"utf8"),{path:t,created:!1,updated:!0,already_present:!1}}(P),this.reporter().succeedStep("project files: wrote AGENTS.md"),this.reporter().startStep("skills: syncing bundled skills"),S=await b({agents:N.agents,cwd:P,cliVersion:i,yes:R.yes}),this.reporter().succeedStep(`skills: synced ${S.skillNames.length} bundled skill(s)`)}catch(e){throw this.reporter().failStep("dbx init failed"),e}let I={success:!0,project_path:P,agent_response:(r=P,n=N,s=_,o=w,a=S.skillNames,{tone:"concise_user_facing",summary:(k=((x=(p=n.agents).filter(e=>"universal"!==e)).length>0?x:p).join(", "),`dbx 初始化完成,已为 ${k} 创建完整项目并配置内置 Skills。`),changes:(l=r,d=n,c=s,u=o,h=a,{agent_md:u.path,frontend:{directory:c.directory,description:"已在项目根目录创建前端工程"},skills:{names:h,targets:d.agents.map(e=>{let t=v.find(t=>t.id===e);return{id:e,skills_path:t?.projectPath??""}}).map(e=>({agent:e.id,path:`${l.replace(/\/+$/,"")}/${e.skills_path}`}))}}),notes:eo(s),response_guidance:["Lead with the outcome, not the command line.","Group generated paths by purpose instead of listing every raw file when that would be noisy.","Do not add unrelated git status notes unless the user asked or the git state changes the next step."]}),auth:g,environment:f,agents:N.agents,frontend:_,project_artifacts:y,agent_md:w,skills:S.skillNames,skills_version:S.skillsVersion,bundled_root:S.bundledRoot,hosted_root:S.hostedRoot};return this.jsonEnabled()||this.emitInitSuccess(P,_),I}emitSchema(){let e={command:"dbx init",description:"Create a new dbx project with a frontend scaffold, project artifacts, AGENTS.md guidance, and bundled skills.",risk:"write",writes_project_files:!0,requires_interactive_confirmation_to_apply:!1,requires_complete_user_decisions_to_apply:!0,json_supported:!0,user_decisions:{must_ask_user_before_choosing_flags:!0,preferred_user_prompt_style:"Ask a short product question with choices first; keep raw CLI flags as secondary detail only.",project_directory:`${et}(默认:my-app)`,agent:"Ask which agent targets to install for, for example codex, trae, or claude-code. Universal is always included.",git:"Ask whether to initialize a Git repository at the project root. The recommended default is true."},agent_guidance:{recommended_flow:["Run `dbx init --schema --json` if you need the command contract.","For any uncertain user_decisions item, ask the user with the provided prompt and choices instead of exposing raw flags first.","Use `dbx init <directory> --agent <id> --json` to create and inspect a new project."],cautions:["The directory argument must name a new directory; dbx init never initializes the current directory.","--yes only allows replacing existing Skill directories; it does not choose unspecified init parameters.","Use --no-install-deps only when dependency installation should be deferred."]},flags:{path:{kind:"argument",type:"string",required_for_non_interactive_plan:!0,default:"my-app",description:"New project directory name under the current directory."},agent:{type:"array",repeatable:!0,options:[...g],auto_includes:["universal"],description:"Agent skill targets to initialize."},"no-install-deps":{type:"boolean",default:!1,description:"Skip dependency installation for the generated frontend project."},git:{type:"boolean",default:!1,description:"Initialize a Git repository at the project root."},yes:{type:"boolean",description:"Allows replacing existing non-symlink Skill directories only. Does not choose unspecified init parameters."},json:{type:"boolean",description:"Output machine-readable JSON."}},examples:es()};return this.context.log(JSON.stringify(e,null,2)),e}reporter(){return this.initReporter||(this.initReporter=new K({enabled:!this.jsonEnabled(),useSpinner:U(),log:e=>this.log(e),warn:e=>this.warn(e)})),this.initReporter}async collectInitPlan(e,t){let r=function(e){var t;let r,i=function e(t){return Array.isArray(t)?t.flatMap(t=>e(t)):"string"!=typeof t?[]:t.split(",").map(e=>e.trim()).filter(Boolean)}(e);if(0===i.length)return;let n=new Set(g),s=i.filter(e=>!n.has(e));if(s.length>0)throw Error(`Unsupported init agent(s): ${s.join(", ")}. Supported agents: ${g.join(", ")}.`);return t=["universal",...i],r=new Set,t.filter(e=>!r.has(e)&&(r.add(e),!0))}(e.agent);return r||t||ea("dbx init needs --agent <id> when prompts are disabled or unavailable.",{code:"missing_init_decision",missing_flags:["--agent"],user_prompt:"要为哪个 Agent 安装 dbx Skills?",choices:g.filter(e=>"universal"!==e).map(e=>({value:e,label:e})),examples:es()}),{agents:r??await _(),frontend:{directory:".",initializeGit:e.git||!!t&&await y()}}}emitInitStart(e,t){var r;let i=this.reporter();i.header("Initializing dbx project"),i.section("Plan"),i.info("project",(r=e,(0,E.resolve)(r))),i.info("agents",t.agents.join(", ")),i.info("git",t.frontend.initializeGit?"initialize at project root":"skip"),i.blank(),i.section("Progress")}emitInitSuccess(e,t){let r=this.reporter();r.blank(),r.header("dbx project initialized");let i=eo(t);if(i.length>0)for(let e of(r.blank(),r.info("notes"),i))r.note(e)}async ensureRequiredRuntime(){this.reporter().startStep("runtime: checking npm");try{let e=await z();return this.reporter().succeedStep(`runtime: npm ${e.version}`),{npm:e}}catch(e){throw this.reporter().failStep("runtime: npm check failed"),e}}async ensureAuthenticated(e){let r,i;this.reporter().startStep("auth: checking login status");try{r=await l({fetch:async(e,t)=>{let r=new AbortController,i=setTimeout(()=>r.abort(),5e3);try{return await fetch(e,{...t,signal:r.signal})}finally{clearTimeout(i)}}})}catch(e){this.reporter().warnStep(`auth: login status check failed, starting login: ${ep(e)}`),r={loggedIn:!1,tokenPath:""}}if(r.loggedIn)return this.reporter().succeedStep("auth: already logged in"),{already_logged_in:!0,login_performed:!1,uid:r.uid,expires_at:r.expiresAt,base_url:r.baseUrl};if("require"===e)throw this.reporter().failStep("auth: login required"),Error("dbx init requires an existing login when prompts are disabled or JSON output is enabled. Run `dbx auth login` first.");this.reporter().succeedStep("auth: not logged in, starting login"),this.reporter().startStep("auth: waiting for login");let n=await t({onVerification:e=>{this.jsonEnabled()||(this.reporter().info("auth visit",e.verificationUrl),this.reporter().info("auth expires in",`${e.expiresIn} seconds`),this.openVerificationUrl(e.verificationUrl),this.reporter().updateStep(`auth: ${a(o.Pending)}`),i=o.Pending)},onPoll:e=>{this.context.json||e.status!==i&&(i=e.status,this.reporter().updateStep(`auth: ${a(e.status)}`))}});return this.reporter().succeedStep(`auth: logged in, token expires at ${new Date(1e3*n.expiresAt).toISOString()}`),{already_logged_in:!1,login_performed:!0,uid:n.uid,expires_at:n.expiresAt,base_url:n.baseUrl,token_path:n.tokenPath}}async openVerificationUrl(e){this.reporter().info("auth","opening link in browser");try{await x(e)}catch(e){this.reporter().warn(`failed to open browser: ${ep(e)}`)}}async executeFrontendProjectPlan(e,t,r){let i,n;this.reporter().startStep("sandbox app: fetching AppID");let s=await S(e);this.context.targetAppId=s.sandbox_app_id,this.reporter().succeedStep(`sandbox app: ready (${s.sandbox_app_id})`),this.reporter().startStep("frontend: creating scaffold in the new project root");let o=await R({projectPath:e,directory:t.directory,appId:s.sandbox_app_id,initializeGit:t.initializeGit,onStatus:e=>{"clearing_existing_directory"===e?this.reporter().updateStep("frontend: clearing existing scaffold files (keeping node_modules cache)"):this.reporter().updateStep("frontend: writing scaffold files in the new project root")}});if(this.reporter().succeedStep("frontend: scaffold ready in the new project root"),t.initializeGit&&(this.reporter().startStep("git: checking repository initialization"),(0,j.existsSync)((0,E.resolve)(o.path,".git"))?this.reporter().succeedStep("git: repository initialized at project root"):this.reporter().warnStep("git: repository initialization was requested but .git was not created")),!r)return{directory:t.directory,scaffold:o,package_manager:{dependencies:{dependencies_installed:!1,install_attempts:0,recovered_from_ignored_builds:!1,approved_builds:[],install_warning:"skipped by --no-install-deps"}}};this.reporter().startStep("dependencies: checking pnpm");try{i=await H()}catch(e){return n={dependencies_installed:!1,install_attempts:0,recovered_from_ignored_builds:!1,approved_builds:[],install_warning:ep(e)},this.reporter().warnStep(`frontend dependencies were not installed: ${n.install_warning}`),{directory:t.directory,scaffold:o,package_manager:{dependencies:n}}}if(this.reporter().startStep(`dependencies: installing frontend packages with pnpm ${i.version}`),(n=await V(o.path,{pnpmVersion:i.version,autoApproveBuilds:"all-pending",streamOutput:this.context.debug})).dependencies_installed?this.reporter().succeedStep(`dependencies: installed frontend packages with pnpm ${i.version}`):this.reporter().warnStep(`dependencies: install incomplete (${n.install_warning??"unknown reason"})`),!this.jsonEnabled()&&n.recovered_from_ignored_builds){let e=n.approved_builds.includes("*")?"all pending dependency build scripts":`${n.approved_builds.length} dependency build script package(s)`;this.reporter().warn(`pnpm blocked dependency build scripts; approved ${e} and retried install`)}return{directory:t.directory,scaffold:o,package_manager:{pnpm:i,dependencies:n}}}}async function en(e,t){let r=e?.trim()||(t?await w():"");return r||ea("dbx init requires a new project directory when prompts are disabled or unavailable.",{code:"missing_project_directory",missing_flags:["directory"],user_prompt:et,examples:es()}),function(e){let t=e.trim().replace(/\\/g,"/").replace(/\/+$/,"");if(!t||"."===t)throw Error("dbx init requires a new project directory name.");if((0,E.isAbsolute)(t)||E.win32.isAbsolute(t))throw Error("dbx init project directory must be relative.");if(t.split("/").includes(".."))throw Error("dbx init project directory must stay inside the current directory.");return(0,E.resolve)(process.cwd(),t)}(r)}function es(){return["dbx init my-app --agent codex --json","dbx init my-app --agent codex --no-install-deps --json"]}function eo(e){let t=[];return e.package_manager?.dependencies.install_warning&&t.push(`前端依赖未完整安装:${e.package_manager.dependencies.install_warning}`),t}function ea(e,t){let r=Error(e);throw r.details=t,r}function ep(e){return e instanceof Error&&"AbortError"===e.name?"timed out":e instanceof Error&&e.message?e.message:String(e)}export{k as init_namespaceObject};
|
|
3
|
+
${eo().map(e=>` ${e}`).join("\n")}`).action(async(e,t,r)=>l(r,r=>new en(r).run(e,t)))}class en{context;initReporter;constructor(e){this.context=e}jsonEnabled(){return this.context.json}log(e){this.context.log(e)}warn(e){this.context.warn(e)}async run(e,t){var r,s,o,a,p,l,d,c,u,h,m;let _,g,y,S,w,b,k,E;if(t.schema)return this.emitSchema();let $=!process.env.DBX_PROMPT_DISABLED&&!this.context.json&&process.stdin.isTTY&&process.stderr.isTTY,R=await es(e,$);!function(e){try{(0,j.lstatSync)(e)}catch(e){var t;if("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code)return;throw e}throw Error(`dbx init 目标目录已存在:${e}。请选择新的目录名。`)}(R);let C={authMode:$?"login":"require",installFrontendDependencies:t.installDeps,yes:t.yes},K=await this.collectInitPlan(t,$);this.initReporter=new U({enabled:!this.jsonEnabled(),useSpinner:M(),log:e=>this.log(e),warn:e=>this.warn(e)}),this.jsonEnabled()||this.emitInitStart(R,K);try{let e;_=await this.ensureRequiredRuntime(),g=await this.ensureAuthenticated(C.authMode),y=await this.executeFrontendProjectPlan(R,K.frontend,C.installFrontendDependencies),this.reporter().startStep("项目文件:正在检查 manifest.yaml 和运行时 Skill 目录"),S=function(e,t={}){let r=f(e,{kind:t.layout}),n=r.root,s=r.manifestPath,o=P().join(r.skillDirectory,"SKILL.md"),a=r.skillResolution;if("invalid"===a.layout)throw Error(a.error);let p={app_key:"",layout:r.kind,manifest_path:s,skill_path:o,created:[],preserved:[]};return A().existsSync(s)?(function(e,t){if(!A().statSync(e).isFile())throw Error(`项目产物路径必须是文件: ${t}`)}(s,"manifest.yaml"),p.app_key=function(e){let t=Z.qg(A().readFileSync(e,"utf8")),r=i(t)?t.app_key:void 0;if("string"==typeof r&&r.trim())return r.trim();throw Error(`manifest 缺少必填字段 app_key: ${e}`)}(s),p.preserved.push(P().relative(n,s))):(p.app_key=t.appKey?.trim()||"db_app_xxxxxx",A().mkdirSync(P().dirname(s),{recursive:!0}),A().writeFileSync(s,function(e){let t=et("manifest.yaml");if(2!==t.split(ee).length)throw Error(`dbx init 的 manifest 模板必须且只能包含一个 ${ee}`);return t.replace(ee,JSON.stringify(e))}(p.app_key),"utf8"),p.created.push(P().relative(n,s))),"resolved"===a.layout?p.preserved.push(...a.entries.map(e=>P().relative(n,e.absolutePath))):(A().mkdirSync(P().dirname(o),{recursive:!0}),A().writeFileSync(o,et(P().join("skill","SKILL.md")),"utf8"),p.created.push(P().relative(n,o))),p}(R,{appKey:y.scaffold.app_id,layout:"root"}),this.reporter().succeedStep(`项目文件:已创建 ${S.created.length} 个,保留 ${S.preserved.length} 个`),e=P().resolve(R,"README.md"),A().writeFileSync(e,et("README.md"),"utf8"),this.reporter().startStep("项目文件:正在写入 AGENTS.md"),w=function(e){let t=P().resolve(e,"AGENTS.md");if(!(0,j.existsSync)(t))return(0,j.writeFileSync)(t,`${N}
|
|
4
|
+
`,"utf8"),{path:t,created:!0,updated:!1,already_present:!1};let r=(0,j.readFileSync)(t,"utf8");if(r.includes(N))return{path:t,created:!1,updated:!1,already_present:!0};let i=0===r.length||r.endsWith("\n")?"":"\n";return(0,j.writeFileSync)(t,`${r}${i}${N}
|
|
5
|
+
`,"utf8"),{path:t,created:!1,updated:!0,already_present:!1}}(R),this.reporter().succeedStep("项目文件:已写入 AGENTS.md"),this.reporter().startStep("Skill:正在同步内置 Skill"),b=await v({agents:K.agents,cwd:R,cliVersion:n,yes:C.yes}),this.reporter().succeedStep(`Skill:已同步 ${b.skillNames.length} 个内置 Skill`)}catch(e){throw this.reporter().failStep("dbx init 初始化失败"),e}let I={success:!0,project_path:R,agent_response:(r=R,s=K,o=y,a=w,p=b.skillNames,{tone:"concise_user_facing",summary:(E=((k=(l=s.agents).filter(e=>"universal"!==e)).length>0?k:l).join(", "),`dbx 初始化完成,已为 ${E} 创建完整项目并配置内置 Skills。`),changes:(d=r,c=s,u=o,h=a,m=p,{agent_md:h.path,frontend:{directory:u.directory,description:"已在项目根目录创建前端工程"},skills:{names:m,targets:c.agents.map(e=>{let t=x.find(t=>t.id===e);return{id:e,skills_path:t?.projectPath??""}}).map(e=>({agent:e.id,path:`${d.replace(/\/+$/,"")}/${e.skills_path}`}))}}),notes:ea(o),response_guidance:["Lead with the outcome, not the command line.","Group generated paths by purpose instead of listing every raw file when that would be noisy.","Do not add unrelated git status notes unless the user asked or the git state changes the next step."]}),auth:g,environment:_,agents:K.agents,frontend:y,project_artifacts:S,agent_md:w,skills:b.skillNames,skills_version:b.skillsVersion,bundled_root:b.bundledRoot,hosted_root:b.hostedRoot};return this.jsonEnabled()||this.emitInitSuccess(y),I}emitSchema(){let e={command:"dbx init",description:"Create a new dbx project with a frontend scaffold, project artifacts, AGENTS.md guidance, and bundled skills.",risk:"write",writes_project_files:!0,requires_interactive_confirmation_to_apply:!1,requires_complete_user_decisions_to_apply:!0,json_supported:!0,user_decisions:{must_ask_user_before_choosing_flags:!0,preferred_user_prompt_style:"Ask a short product question with choices first; keep raw CLI flags as secondary detail only.",project_directory:`${er}(默认:my-app)`,agent:"Ask which agent targets to install for, for example codex, trae, or claude-code. Universal is always included.",git:"Ask whether to initialize a Git repository at the project root. The recommended default is true."},agent_guidance:{recommended_flow:["Run `dbx init --schema --json` if you need the command contract.","For any uncertain user_decisions item, ask the user with the provided prompt and choices instead of exposing raw flags first.","Use `dbx init <directory> --agent <id> --json` to create and inspect a new project."],cautions:["The directory argument must name a new directory; dbx init never initializes the current directory.","--yes only allows replacing existing Skill directories; it does not choose unspecified init parameters.","Use --no-install-deps only when dependency installation should be deferred."]},flags:{path:{kind:"argument",type:"string",required_for_non_interactive_plan:!0,default:"my-app",description:"New project directory name under the current directory."},agent:{type:"array",repeatable:!0,options:[...g],auto_includes:["universal"],description:"Agent skill targets to initialize."},"no-install-deps":{type:"boolean",default:!1,description:"Skip dependency installation for the generated frontend project."},git:{type:"boolean",default:!1,description:"Initialize a Git repository at the project root."},yes:{type:"boolean",description:"Allows replacing existing non-symlink Skill directories only. Does not choose unspecified init parameters."},json:{type:"boolean",description:"Output machine-readable JSON."}},examples:eo()};return this.context.log(JSON.stringify(e,null,2)),e}reporter(){return this.initReporter||(this.initReporter=new U({enabled:!this.jsonEnabled(),useSpinner:M(),log:e=>this.log(e),warn:e=>this.warn(e)})),this.initReporter}async collectInitPlan(e,t){let r=function(e){var t;let r,i=function e(t){return Array.isArray(t)?t.flatMap(t=>e(t)):"string"!=typeof t?[]:t.split(",").map(e=>e.trim()).filter(Boolean)}(e);if(0===i.length)return;let n=new Set(g),s=i.filter(e=>!n.has(e));if(s.length>0)throw Error(`不支持以下初始化 Agent:${s.join(", ")}。支持的 Agent:${g.join(", ")}。`);return t=["universal",...i],r=new Set,t.filter(e=>!r.has(e)&&(r.add(e),!0))}(e.agent);return r||t||ep("禁用或无法使用交互提示时,dbx init 需要指定 --agent <id>。",{code:"missing_init_decision",missing_flags:["--agent"],user_prompt:"要为哪个 Agent 安装 dbx Skills?",choices:g.filter(e=>"universal"!==e).map(e=>({value:e,label:e})),examples:eo()}),{agents:r??await y(),frontend:{directory:".",initializeGit:e.git||!!t&&await S()}}}emitInitStart(e,t){var r;let i=this.reporter();i.header("正在初始化 dbx 项目"),i.section("计划"),i.info("项目",(r=e,(0,$.resolve)(r))),i.info("Agent",t.agents.join(", ")),i.info("git",t.frontend.initializeGit?"在项目根目录初始化":"跳过"),i.blank(),i.section("进度")}emitInitSuccess(e){let t=this.reporter();t.blank(),t.header("dbx 项目初始化完成");let r=ea(e);if(r.length>0)for(let e of(t.blank(),t.info("说明"),r))t.note(e)}async ensureRequiredRuntime(){this.reporter().startStep("运行环境:正在检查 npm");try{let e=await V();return this.reporter().succeedStep(`运行环境:npm ${e.version}`),{npm:e}}catch(e){throw this.reporter().failStep("运行环境:npm 检查失败"),e}}async ensureAuthenticated(e){let t,i;this.reporter().startStep("认证:正在检查登录状态");try{t=await d({fetch:async(e,t)=>{let r=new AbortController,i=setTimeout(()=>r.abort(),5e3);try{return await fetch(e,{...t,signal:r.signal})}finally{clearTimeout(i)}}})}catch(e){this.reporter().warnStep(`认证:检查登录状态失败,正在发起登录:${el(e)}`),t={loggedIn:!1,tokenPath:""}}if(t.loggedIn)return this.reporter().succeedStep("认证:已登录"),{already_logged_in:!0,login_performed:!1,uid:t.uid,expires_at:t.expiresAt,base_url:t.baseUrl};if("require"===e)throw this.reporter().failStep("认证:需要登录"),Error("当前命令无法交互登录。请先运行 `dbx auth login`,完成登录后再运行初始化命令。");this.reporter().succeedStep("认证:尚未登录,正在发起登录"),this.reporter().startStep("认证:正在等待登录");let n=await r({onVerification:e=>{this.jsonEnabled()||(this.reporter().info("授权地址",e.verificationUrl),this.reporter().info("授权有效期",`${e.expiresIn} 秒`),this.openVerificationUrl(e.verificationUrl),this.reporter().updateStep(`登录:${p(a.Pending)}`),i=a.Pending)},onPoll:e=>{this.context.json||e.status!==i&&(i=e.status,this.reporter().updateStep(`登录:${p(e.status)}`))}});return this.reporter().succeedStep(`认证:登录成功,凭证过期时间为 ${new Date(1e3*n.expiresAt).toISOString()}`),{already_logged_in:!1,login_performed:!0,uid:n.uid,expires_at:n.expiresAt,base_url:n.baseUrl,token_path:n.tokenPath}}async openVerificationUrl(e){this.reporter().info("登录","正在浏览器中打开链接");try{await k(e)}catch(e){this.reporter().warn(`打开浏览器失败:${el(e)}`)}}async executeFrontendProjectPlan(e,t,r){let i,n;this.reporter().startStep("Sandbox 应用:正在获取 AppID");let s=await b(e);this.context.targetAppId=s.sandbox_app_id,this.reporter().succeedStep(`Sandbox 应用:已就绪(${s.sandbox_app_id})`),this.reporter().startStep("前端:正在新项目根目录创建脚手架");let o=await C({projectPath:e,directory:t.directory,appId:s.sandbox_app_id,initializeGit:t.initializeGit,onStatus:e=>{"clearing_existing_directory"===e?this.reporter().updateStep("前端:正在清理已有脚手架文件(保留 node_modules 缓存)"):this.reporter().updateStep("前端:正在新项目根目录写入脚手架文件")}});if(this.reporter().succeedStep("前端:新项目根目录的脚手架已就绪"),t.initializeGit&&(this.reporter().startStep("Git:正在检查仓库初始化状态"),(0,j.existsSync)((0,$.resolve)(o.path,".git"))?this.reporter().succeedStep("Git:已在项目根目录初始化仓库"):this.reporter().warnStep("Git:已请求初始化仓库,但未创建 .git 目录")),!r)return{directory:t.directory,scaffold:o,package_manager:{dependencies:{dependencies_installed:!1,install_attempts:0,recovered_from_ignored_builds:!1,approved_builds:[],install_warning:"已通过 --no-install-deps 跳过"}}};this.reporter().startStep("依赖:正在检查 pnpm");try{i=await F()}catch(e){return n={dependencies_installed:!1,install_attempts:0,recovered_from_ignored_builds:!1,approved_builds:[],install_warning:el(e)},this.reporter().warnStep(`前端依赖未安装:${n.install_warning}`),{directory:t.directory,scaffold:o,package_manager:{dependencies:n}}}if(this.reporter().startStep(`依赖:正在使用 pnpm ${i.version} 安装前端依赖`),(n=await B(o.path,{pnpmVersion:i.version,autoApproveBuilds:"all-pending",streamOutput:this.context.verbose})).dependencies_installed?this.reporter().succeedStep(`依赖:已使用 pnpm ${i.version} 安装前端依赖`):this.reporter().warnStep(`依赖:安装未完成(${n.install_warning??"原因未知"})`),!this.jsonEnabled()&&n.recovered_from_ignored_builds){let e=n.approved_builds.includes("*")?"所有待执行的依赖构建脚本":`${n.approved_builds.length} 个包的依赖构建脚本`;this.reporter().warn(`pnpm 阻止了依赖构建脚本;已允许运行${e}并重试安装`)}return{directory:t.directory,scaffold:o,package_manager:{pnpm:i,dependencies:n}}}}async function es(e,t){let r=e?.trim()||(t?await w():"");return r||ep("禁用或无法使用交互提示时,dbx init 需要指定新项目目录。",{code:"missing_project_directory",missing_flags:["directory"],user_prompt:er,examples:eo()}),function(e){let t=e.trim().replace(/\\/g,"/").replace(/\/+$/,"");if(!t||"."===t)throw Error("请指定一个新项目目录,例如 `dbx init my-app`。");if((0,$.isAbsolute)(t)||$.win32.isAbsolute(t))throw Error("请用相对路径指定项目目录,例如 `dbx init my-app`。");if(t.split("/").includes(".."))throw Error("项目目录不能包含 `..`。请在当前目录下创建新项目。");return(0,$.resolve)(process.cwd(),t)}(r)}function eo(){return["dbx init my-app --agent codex --json","dbx init my-app --agent codex --no-install-deps --json"]}function ea(e){let t=[];return e.package_manager?.dependencies.install_warning&&t.push(`前端依赖未完整安装:${e.package_manager.dependencies.install_warning}`),t}function ep(e,t){let r=Error(e);throw r.details=t,r}function el(e){return e instanceof Error&&"AbortError"===e.name?"已超时":e instanceof Error&&e.message?e.message:String(e)}export{E as init_namespaceObject};
|