@actiondock/builder 2.15.0 → 2.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -15
- package/dist/dependency-check.d.ts +1 -1
- package/dist/dependency-check.js +5 -0
- package/dist/entry-generators.d.ts +2 -9
- package/dist/entry-generators.js +21 -43
- package/dist/export-composite.d.ts +1 -1
- package/dist/export-composite.js +54 -125
- package/dist/export-source.d.ts +1 -1
- package/dist/export-source.js +8 -32
- package/dist/exporter.js +7 -36
- package/dist/planner.js +78 -74
- package/dist/skill/templates.d.ts +5 -7
- package/dist/skill/templates.js +67 -96
- package/dist/skill-md.d.ts +0 -8
- package/dist/skill-md.js +0 -46
- package/dist/types.d.ts +8 -9
- package/package.json +3 -3
- package/dist/derived-graph.d.ts +0 -4
- package/dist/derived-graph.js +0 -30
- package/dist/source-graph.d.ts +0 -4
- package/dist/source-graph.js +0 -33
package/dist/skill/templates.js
CHANGED
|
@@ -13,7 +13,7 @@ function renderActionListMarkdown(actions, options = {}) {
|
|
|
13
13
|
.map((a) => {
|
|
14
14
|
const aDesc = a.description ? ` - ${a.description}` : "";
|
|
15
15
|
const idLabel = options.packageId
|
|
16
|
-
? `\`${options.packageId}/${a.id}
|
|
16
|
+
? `\`${options.packageId}/${a.id}\` (或 \`${a.id}\`)`
|
|
17
17
|
: `\`${a.id}\``;
|
|
18
18
|
const lines = [`- ${idLabel}${aDesc}`];
|
|
19
19
|
// 标注元数据解析(安全标注不得从主说明移走)
|
|
@@ -124,60 +124,30 @@ function renderJsonEnvelopeSection(wording, options) {
|
|
|
124
124
|
* 由主说明按需链接调阅,不在每个技能正文重复展开整套安装与框架管理教程。
|
|
125
125
|
*/
|
|
126
126
|
export function renderRuntimeReferenceContent(options) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
## 调用方式
|
|
134
|
-
|
|
135
|
-
\`\`\`bash
|
|
136
|
-
${entry} list
|
|
137
|
-
${entry} describe <package-id>/<action-id>
|
|
138
|
-
${entry} run <package-id>/<action-id> -- ASSIGNMENT...
|
|
139
|
-
\`\`\`
|
|
140
|
-
|
|
141
|
-
## 按需排查与依赖安装
|
|
142
|
-
|
|
143
|
-
正常执行直接调用入口,不做前置体检。仅在模块缺失或运行环境报错时修复:
|
|
144
|
-
|
|
145
|
-
- Node.js 版本要求大于等于 24.12.0。
|
|
146
|
-
- ${options.dependencyStepLabel}:在技能根目录执行 \`npm install --omit=dev\`,由 npm 安装生产依赖。
|
|
147
|
-
- 默认共享统一数据存储。仅在需要数据隔离等特殊场景下追加 \`--data-dir <path>\`。
|
|
148
|
-
- 验证就绪:执行 \`${entry} list\`。
|
|
149
|
-
`;
|
|
150
|
-
}
|
|
151
|
-
if (options.invocationStyle === "source-ad") {
|
|
152
|
-
return `# ActionDock 运行时环境参考
|
|
153
|
-
|
|
154
|
-
本技能通过 \`ad ... -P "<skill_root>"\` 执行,封闭加载本地包集合,不读取全局 Registry 或当前工作目录项目。
|
|
155
|
-
|
|
156
|
-
## 调用方式
|
|
127
|
+
const relinkNote = options.compositeLinkNote
|
|
128
|
+
? `\`ad link\` 会自动识别并注册工作区下的所有子包,使其中的 Action 随时可以通过完全限定标识调用。`
|
|
129
|
+
: "";
|
|
130
|
+
const invocationSection = options.invocationStyle === "node-entry"
|
|
131
|
+
? `本技能为 Node 目录型交付,可直接使用自身入口执行,不要求全局安装 \`ad\` 命令行工具:
|
|
157
132
|
|
|
158
133
|
\`\`\`bash
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
134
|
+
${options.entryRelPath || "node ./entry.mjs"} list
|
|
135
|
+
${options.entryRelPath || "node ./entry.mjs"} describe <action-id>
|
|
136
|
+
${options.entryRelPath || "node ./entry.mjs"} run <action-id> -- ASSIGNMENT...
|
|
162
137
|
\`\`\`
|
|
163
138
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
? `\`ad link\` 会自动识别并注册工作区下的所有子包,使其中的 Action 随时可以通过完全限定标识调用。`
|
|
177
|
-
: "";
|
|
178
|
-
const invocationSection = `本说明书用于开发工作区,通过全局安装的 \`ad\` 命令行工具执行,不代表完整技能导出。`;
|
|
179
|
-
const probePrinciple = `默认宿主环境中已预置 \`ad\` 命令行工具与 Node.js 运行环境。正常执行流程直接调用上述 Action 即可,严禁在任务启动前盲目进行前置环境检查或体检;仅在终端明确报错提示命令不存在或依赖缺失时,方可按本文指引安装初始化。`;
|
|
180
|
-
const cliInstallSection = `- **环境要求**:Node.js 版本大于等于 24.12.0(执行 \`node -v\` 确认)。
|
|
139
|
+
若宿主环境已全局安装 \`ad\`,亦可将其链接后统一调度。`
|
|
140
|
+
: `本技能为源码型交付,通过全局安装的 \`ad\` 命令行工具执行。`;
|
|
141
|
+
const isNodeEntry = options.invocationStyle === "node-entry";
|
|
142
|
+
const probePrinciple = isNodeEntry
|
|
143
|
+
? `默认宿主环境中已预置 Node.js 运行环境。本目录型交付直接使用自身入口执行,不依赖全局 \`ad\`;正常执行流程直接调用上述 Action 即可,严禁在任务启动前盲目进行前置环境检查或体检;仅在入口报错提示模块缺失(如 \`Cannot find package\`)或 Node.js 版本不满足时,方可按本文指引修复。`
|
|
144
|
+
: `默认宿主环境中已预置 \`ad\` 命令行工具与 Node.js 运行环境。正常执行流程直接调用上述 Action 即可,严禁在任务启动前盲目进行前置环境检查或体检;仅在终端明确报错提示命令不存在(如 \`ad: command not found\`)或提示依赖缺失时,方可按本文指引安装初始化。`;
|
|
145
|
+
const cliInstallSection = isNodeEntry
|
|
146
|
+
? `- **Node.js 环境要求**:Node.js 版本大于等于 24.12.0(执行 \`node -v\` 确认)。目录型交付不需要全局安装 \`ad\`;若需要接入全局调度,可另行安装:
|
|
147
|
+
\`\`\`bash
|
|
148
|
+
npm install -g @actiondock/cli
|
|
149
|
+
\`\`\``
|
|
150
|
+
: `- **环境要求**:Node.js 版本大于等于 24.12.0(执行 \`node -v\` 确认)。
|
|
181
151
|
- **全局安装 ActionDock 命令行工具**:
|
|
182
152
|
\`\`\`bash
|
|
183
153
|
npm install -g @actiondock/cli
|
|
@@ -205,7 +175,7 @@ ${cliInstallSection}
|
|
|
205
175
|
cd "<skill_root>" && npm install --omit=dev
|
|
206
176
|
\`\`\`
|
|
207
177
|
- **验证就绪**:
|
|
208
|
-
ad --version
|
|
178
|
+
${isNodeEntry ? `${options.entryRelPath || "node ./entry.mjs"} list` : "ad --version"}
|
|
209
179
|
- **环境诊断与体检**(仅全局接入 \`ad\` 后适用):
|
|
210
180
|
安装完成后若仍遇到异常,执行体检命令排查:
|
|
211
181
|
\`\`\`bash
|
|
@@ -234,9 +204,10 @@ function renderTroubleshootingSection(referenceRelPath) {
|
|
|
234
204
|
export const RUNTIME_REFERENCE_REL_PATH = "references/actiondock-runtime.md";
|
|
235
205
|
export function generateSourceSkillMd(config, actions, playbooks) {
|
|
236
206
|
const { cleanName, desc } = getCleanSkillMetadata(config);
|
|
237
|
-
const
|
|
238
|
-
const
|
|
239
|
-
const
|
|
207
|
+
const pkgId = config.id;
|
|
208
|
+
const firstAction = actions[0]?.id || "sample.greet";
|
|
209
|
+
const playbookSection = renderPlaybookSectionMarkdown(playbooks, config.playbooksDir || "playbooks");
|
|
210
|
+
const actionListMd = renderActionListMarkdown(actions, { packageId: pkgId });
|
|
240
211
|
return `---
|
|
241
212
|
name: ${cleanName}
|
|
242
213
|
description: ${desc}
|
|
@@ -246,32 +217,56 @@ description: ${desc}
|
|
|
246
217
|
|
|
247
218
|
${desc}
|
|
248
219
|
|
|
249
|
-
##
|
|
220
|
+
## ActionDock 运行时
|
|
221
|
+
|
|
222
|
+
本技能为 **ActionDock 源码型技能包**。智能体可直接通过宿主环境中已安装的 ActionDock 命令行工具 \`ad\` 执行其中的 Action。
|
|
223
|
+
|
|
224
|
+
### 注册与链接(全局调用)
|
|
225
|
+
|
|
226
|
+
本技能面向全局挂载使用:在初次调用或初始化时,将包含本 \`SKILL.md\` 的目录解析为 \`<skill_root>\` 并完成注册链接,之后可在任意工作目录通过完全限定 ID 全局调用:
|
|
227
|
+
|
|
228
|
+
\`\`\`bash
|
|
229
|
+
ad link "<skill_root>"
|
|
230
|
+
\`\`\`
|
|
231
|
+
|
|
232
|
+
> \`ad link\` 天然具备幂等性,同一 Package 多次执行会直接更新路径,可安全重复调用。若初次运行提示依赖缺失,可在 \`<skill_root>\` 目录下执行 \`npm install --omit=dev\` 安装生产依赖。
|
|
250
233
|
|
|
251
|
-
|
|
252
|
-
首次缺少依赖时,在技能根目录执行 \`npm install --omit=dev\`。
|
|
253
|
-
默认共享统一数据存储,仅在需要数据隔离等特殊场景下追加 \`--data-dir <path>\`。
|
|
254
|
-
本地封闭执行不支持 \`--async\`。
|
|
234
|
+
### 动作参数契约按需调阅
|
|
255
235
|
|
|
256
|
-
|
|
236
|
+
在调用未知参数的 Action 前,可在终端执行命令查阅该 Action 的输入输出模式与详细说明:
|
|
237
|
+
|
|
238
|
+
\`\`\`bash
|
|
239
|
+
ad describe ${pkgId}/${firstAction}
|
|
240
|
+
\`\`\`
|
|
241
|
+
|
|
242
|
+
### 执行 Action
|
|
243
|
+
|
|
244
|
+
为避免多技能之间的 Action ID 命名冲突,建议统一使用带有 Package 前缀的完全限定 ID。
|
|
245
|
+
|
|
246
|
+
${renderInvocationGuidance(`ad describe ${pkgId}/${firstAction}`, `ad run ${pkgId}/${firstAction}`)}
|
|
257
247
|
|
|
258
248
|
${renderJsonEnvelopeSection("envelope")}
|
|
259
|
-
${
|
|
249
|
+
${playbookSection}
|
|
250
|
+
---
|
|
260
251
|
|
|
261
252
|
## Action 目录
|
|
262
253
|
|
|
263
|
-
${
|
|
254
|
+
${actionListMd}
|
|
255
|
+
|
|
256
|
+
---
|
|
264
257
|
|
|
265
258
|
## 运行时配置与持久化状态
|
|
266
259
|
|
|
260
|
+
如需检查或配置该 Package 的运行时参数与持久化数据:
|
|
261
|
+
|
|
267
262
|
\`\`\`bash
|
|
268
263
|
# 查看与设置配置项
|
|
269
|
-
ad config list
|
|
270
|
-
ad config set KEY VALUE
|
|
264
|
+
ad config list --package ${pkgId}
|
|
265
|
+
ad config set KEY VALUE --package ${pkgId}
|
|
271
266
|
|
|
272
267
|
# 查看与检索状态数据
|
|
273
|
-
ad state list
|
|
274
|
-
ad state get KEY
|
|
268
|
+
ad state list --package ${pkgId}
|
|
269
|
+
ad state get KEY --package ${pkgId}
|
|
275
270
|
\`\`\`
|
|
276
271
|
|
|
277
272
|
${renderTroubleshootingSection(RUNTIME_REFERENCE_REL_PATH)}
|
|
@@ -367,8 +362,8 @@ export function generateCompositeSkillMd(bundleName, description, packages, opti
|
|
|
367
362
|
for (const pkg of packages) {
|
|
368
363
|
for (const pb of pkg.playbooks) {
|
|
369
364
|
const relPath = packagesBaseDir === "."
|
|
370
|
-
? `./${pkg.packageDir}
|
|
371
|
-
: `packages/${pkg.packageDir}
|
|
365
|
+
? `./${pkg.packageDir}/playbooks/${basename(pb.filePath)}`
|
|
366
|
+
: `packages/${pkg.packageDir}/playbooks/${basename(pb.filePath)}`;
|
|
372
367
|
playbookEntries.push(`- [${pb.name || pb.id}](${relPath}): ${pb.description || "标准操作规程"}`);
|
|
373
368
|
}
|
|
374
369
|
}
|
|
@@ -380,36 +375,12 @@ description: ${description}
|
|
|
380
375
|
# ${bundleName} 复合技能套件
|
|
381
376
|
|
|
382
377
|
${description}`;
|
|
383
|
-
const invocationStyle = options?.invocationStyle ?? "source-ad";
|
|
384
|
-
const isGlobalAd = invocationStyle === "global-ad";
|
|
385
|
-
const isNodeEntry = invocationStyle === "node-entry";
|
|
386
|
-
const describeCmd = isGlobalAd
|
|
387
|
-
? `ad describe ${sampleActionId}`
|
|
388
|
-
: isNodeEntry
|
|
389
|
-
? `node "<skill_root>/entry.mjs" describe ${sampleActionId}`
|
|
390
|
-
: `ad describe ${sampleActionId} -P "<skill_root>"`;
|
|
391
|
-
const runCmd = isGlobalAd
|
|
392
|
-
? `ad run ${sampleActionId}`
|
|
393
|
-
: isNodeEntry
|
|
394
|
-
? `node "<skill_root>/entry.mjs" run ${sampleActionId}`
|
|
395
|
-
: `ad run ${sampleActionId} -P "<skill_root>"`;
|
|
396
|
-
const localGuidance = isGlobalAd
|
|
397
|
-
? ""
|
|
398
|
-
: isNodeEntry
|
|
399
|
-
? `将本文件所在目录解析为 \`<skill_root>\`。直接使用随附的 \`node "<skill_root>/entry.mjs"\` 入口执行,不要求全局安装 \`ad\` 命令行工具,不读取 Registry 或当前工作目录项目。
|
|
400
|
-
缺少依赖时,在技能根目录执行 \`npm install --omit=dev\`。默认共享统一数据存储,仅在需要数据隔离等特殊场景下追加 \`--data-dir <path>\`。
|
|
401
|
-
本地封闭执行不支持 \`--async\`;复合技能不提供配置与状态管理子命令,配置覆盖使用 \`--config KEY=VALUE\`。`
|
|
402
|
-
: `将本文件所在目录解析为 \`<skill_root>\`。默认通过 \`ad ... -P "<skill_root>"\` 执行,仅使用本技能封闭包含的本地包集合,不通过 Registry 或当前工作目录项目执行,亦不需要 \`ad link\`。此执行约定优先于自定义正文中的历史调用说明。
|
|
403
|
-
缺少依赖时,在技能根目录执行 \`npm install --omit=dev\`。默认共享统一数据存储,仅在需要数据隔离等特殊场景下追加 \`--data-dir <path>\`。
|
|
404
|
-
本地封闭执行不支持 \`--async\`;复合技能不提供配置与状态管理子命令,配置覆盖使用 \`--config KEY=VALUE\`。`;
|
|
405
378
|
const sDescribe = `## 动作参数契约按需调阅
|
|
406
379
|
|
|
407
|
-
${localGuidance}
|
|
408
|
-
|
|
409
380
|
为节省上下文开销,各 Action 的详细参数结构不静态内嵌在说明书中。在调用未知参数的 Action 前,可在终端执行命令查阅输入输出约束:
|
|
410
381
|
|
|
411
382
|
\`\`\`bash
|
|
412
|
-
${
|
|
383
|
+
ad describe ${sampleActionId}
|
|
413
384
|
\`\`\``;
|
|
414
385
|
const sActions = `## 可用 Action 工具清单
|
|
415
386
|
|
|
@@ -426,8 +397,8 @@ ${playbookEntries.join("\n")}
|
|
|
426
397
|
---`
|
|
427
398
|
: "";
|
|
428
399
|
const sInvoke = `## 标准调用命令
|
|
429
|
-
|
|
430
|
-
${renderInvocationGuidance(
|
|
400
|
+
|
|
401
|
+
${renderInvocationGuidance(`ad describe ${sampleActionId}`, `ad run ${sampleActionId}`)}
|
|
431
402
|
|
|
432
403
|
${renderJsonEnvelopeSection("envelope", { withDescriptions: false })}`;
|
|
433
404
|
const sTroubleshooting = renderTroubleshootingSection(RUNTIME_REFERENCE_REL_PATH);
|
package/dist/skill-md.d.ts
CHANGED
|
@@ -35,11 +35,3 @@ export declare function writeSkillMd(root: string, destDir: string, options: {
|
|
|
35
35
|
* 构造模板生成所需的 ProjectConfig 视图。
|
|
36
36
|
*/
|
|
37
37
|
export declare function buildConfigForTemplates(plan: SelectionPlan, actionsDir: string, playbooksDir: string): ProjectConfig;
|
|
38
|
-
/** 刷新有边界标记的本地执行约定,保留生成块之外的用户正文。 */
|
|
39
|
-
export declare function appendLocalExecutionContract(file: string, packages: Array<{
|
|
40
|
-
packageId: string;
|
|
41
|
-
actions: Array<{
|
|
42
|
-
id: string;
|
|
43
|
-
isExternal?: boolean;
|
|
44
|
-
}>;
|
|
45
|
-
}>): void;
|
package/dist/skill-md.js
CHANGED
|
@@ -159,49 +159,3 @@ export function buildConfigForTemplates(plan, actionsDir, playbooksDir) {
|
|
|
159
159
|
config: plan.configDefs,
|
|
160
160
|
};
|
|
161
161
|
}
|
|
162
|
-
/** 刷新有边界标记的本地执行约定,保留生成块之外的用户正文。 */
|
|
163
|
-
export function appendLocalExecutionContract(file, packages) {
|
|
164
|
-
const commands = packages.flatMap((pkg) => pkg.actions
|
|
165
|
-
.filter((action) => !action.isExternal)
|
|
166
|
-
.map((action) => `- \`${pkg.packageId}/${action.id}\``));
|
|
167
|
-
const content = readFileSync(file, "utf-8");
|
|
168
|
-
const block = `<!-- actiondock:local-execution -->
|
|
169
|
-
## 本地执行约定
|
|
170
|
-
|
|
171
|
-
本节为导出器根据实际包清单生成的执行约定,优先于上文保留的历史调用或初始化说明。
|
|
172
|
-
将本文件所在目录解析为 \`<skill_root>\`。默认使用 \`ad ... -P "<skill_root>"\` 执行,仅加载本技能封闭包含的本地包集合,不通过 Registry、当前工作目录项目或 \`ad link\` 调度。
|
|
173
|
-
|
|
174
|
-
\`\`\`bash
|
|
175
|
-
cd "<skill_root>" && npm install --omit=dev
|
|
176
|
-
ad list -P "<skill_root>"
|
|
177
|
-
ad describe <package-id>/<action-id> -P "<skill_root>"
|
|
178
|
-
ad run <package-id>/<action-id> -P "<skill_root>" -- ASSIGNMENT...
|
|
179
|
-
\`\`\`
|
|
180
|
-
|
|
181
|
-
默认共享统一数据存储,仅在需要数据隔离等特殊场景下追加 \`--data-dir <path>\`;封闭执行不支持 \`--async\`。
|
|
182
|
-
|
|
183
|
-
### 本次导出的可用动作
|
|
184
|
-
|
|
185
|
-
${commands.join("\n")}
|
|
186
|
-
<!-- actiondock:local-execution:end -->`;
|
|
187
|
-
const startMarker = "<!-- actiondock:local-execution -->";
|
|
188
|
-
const endMarker = "<!-- actiondock:local-execution:end -->";
|
|
189
|
-
let cursor = 0;
|
|
190
|
-
let refreshed = "";
|
|
191
|
-
let found = false;
|
|
192
|
-
while (true) {
|
|
193
|
-
const start = content.indexOf(startMarker, cursor);
|
|
194
|
-
const end = content.indexOf(endMarker, cursor);
|
|
195
|
-
if (start < 0 && end < 0)
|
|
196
|
-
break;
|
|
197
|
-
const nextStart = start < 0 ? -1 : content.indexOf(startMarker, start + startMarker.length);
|
|
198
|
-
if (start < 0 || end < start || (nextStart >= 0 && nextStart < end)) {
|
|
199
|
-
throw new BuilderError("Incomplete or misordered local execution block markers; refusing to replace user content");
|
|
200
|
-
}
|
|
201
|
-
refreshed += content.slice(cursor, start) + (found ? "" : block);
|
|
202
|
-
found = true;
|
|
203
|
-
cursor = end + endMarker.length;
|
|
204
|
-
}
|
|
205
|
-
refreshed += content.slice(cursor);
|
|
206
|
-
writeFileSync(file, found ? refreshed : content + "\n\n" + block + "\n", "utf-8");
|
|
207
|
-
}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { ProjectConfig } from "@actiondock/core";
|
|
2
|
-
import type { PackageGraph } from "@actiondock/core/graph";
|
|
3
2
|
import type { ActionDockManifest } from "@actiondock/core/project";
|
|
4
3
|
/**
|
|
5
4
|
* 规划输入侧的项目配置扩展字段。
|
|
@@ -151,8 +150,6 @@ export type SelectionPlan = BuildPlan;
|
|
|
151
150
|
* 声明式选择规划器配置选项。
|
|
152
151
|
*/
|
|
153
152
|
export interface SelectionPlannerOptions {
|
|
154
|
-
/** 显式共享包图,提供时不再发现 Registry 或当前工程。 */
|
|
155
|
-
packageGraph?: PackageGraph;
|
|
156
153
|
/** 项目根目录绝对路径 */
|
|
157
154
|
projectRoot: string;
|
|
158
155
|
/** 显式传入的项目配置(若未提供则从 actiondock.json 读取) */
|
|
@@ -307,12 +304,14 @@ export interface PackResult {
|
|
|
307
304
|
* Skill 导出选项。
|
|
308
305
|
*/
|
|
309
306
|
export interface SkillExporterOptions {
|
|
310
|
-
/** 复合导出共享的明确包集合。 */
|
|
311
|
-
packageGraph?: PackageGraph;
|
|
312
307
|
/** 源码项目根目录绝对路径 */
|
|
313
308
|
projectRoot: string;
|
|
314
309
|
/** 导出模式:source 源码型 Skill 或 node 目录型 Skill(默认 source) */
|
|
315
310
|
mode?: "source" | "node";
|
|
311
|
+
/** 独立自包含模式(若为 true 则将导出模式设为 node 目录型) */
|
|
312
|
+
standalone?: boolean;
|
|
313
|
+
/** 是否将跨包依赖物理物化为微型工作区复合结构(默认 false) */
|
|
314
|
+
bundleDeps?: boolean;
|
|
316
315
|
/** 导出产物目标目录(默认输出至 dist 目录) */
|
|
317
316
|
outDir?: string;
|
|
318
317
|
/** 是否执行归档压缩,亦可直接指定归档格式 */
|
|
@@ -341,8 +340,6 @@ export interface SkillExporterOptions {
|
|
|
341
340
|
skipDependencyValidation?: boolean;
|
|
342
341
|
/** 内部标识:是否作为复合套件子包导出(避免闭包再次触发嵌套 mini-workspace) */
|
|
343
342
|
_isSubpackage?: boolean;
|
|
344
|
-
/** 复合套件子包缺省 npm 包名(当子包无 package.json 或缺少 name 时使用) */
|
|
345
|
-
defaultPackageName?: string;
|
|
346
343
|
/** 自定义复合技能说明书文件路径 */
|
|
347
344
|
customMdPath?: string;
|
|
348
345
|
/** 所属 Workspace 根目录(可选) */
|
|
@@ -387,14 +384,16 @@ export type ExportSkillResult = SkillExportResult;
|
|
|
387
384
|
* 复合 Skill 套件导出选项。
|
|
388
385
|
*/
|
|
389
386
|
export interface CompositeSkillExportOptions {
|
|
390
|
-
/** 复用源码导出已解析的有效包图,避免丢失显式清单。 */
|
|
391
|
-
packageGraph?: PackageGraph;
|
|
392
387
|
/** 复合技能套件名称 */
|
|
393
388
|
bundleName: string;
|
|
394
389
|
/** 参与聚合的项目根目录绝对路径列表 */
|
|
395
390
|
projectRoots: string[];
|
|
396
391
|
/** 复合套件输出目标目录(默认输出至 dist 目录) */
|
|
397
392
|
outDir?: string;
|
|
393
|
+
/** 是否将外部依赖物理物化进复合产物(默认 false) */
|
|
394
|
+
bundleDeps?: boolean;
|
|
395
|
+
/** 独立自包含模式(复合导出暂不支持) */
|
|
396
|
+
standalone?: boolean;
|
|
398
397
|
/** 复合技能描述信息 */
|
|
399
398
|
description?: string;
|
|
400
399
|
/** 是否执行归档压缩,亦可直接指定归档格式 */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actiondock/builder",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.17.0",
|
|
4
4
|
"description": "ActionDock Build Planner, distribution packaging, and Skill exporter",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"test": "node ../../scripts/run-tests.ts"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@actiondock/core": "^2.
|
|
33
|
-
"@actiondock/sdk": "^2.
|
|
32
|
+
"@actiondock/core": "^2.17.0",
|
|
33
|
+
"@actiondock/sdk": "^2.17.0"
|
|
34
34
|
},
|
|
35
35
|
"keywords": [
|
|
36
36
|
"actiondock",
|
package/dist/derived-graph.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { type ActionDockManifest, type PlaybookSourceManifest } from "@actiondock/core/project";
|
|
2
|
-
import { type PackageGraph } from "@actiondock/core/graph";
|
|
3
|
-
/** 仅从共享包集合派生有效清单图,不修改调用方图或重新发现外部包。 */
|
|
4
|
-
export declare function deriveEffectivePackageGraph(baseGraph: PackageGraph, root: string, effectiveManifest?: ActionDockManifest | PlaybookSourceManifest): PackageGraph;
|
package/dist/derived-graph.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { resolve } from "node:path";
|
|
2
|
-
import { computeManifestDigest } from "@actiondock/core/project";
|
|
3
|
-
import { PackageGraphBuilder } from "@actiondock/core/graph";
|
|
4
|
-
import { BuilderError } from "./errors.js";
|
|
5
|
-
/** 仅从共享包集合派生有效清单图,不修改调用方图或重新发现外部包。 */
|
|
6
|
-
export function deriveEffectivePackageGraph(baseGraph, root, effectiveManifest) {
|
|
7
|
-
const packages = Array.from(baseGraph.packages.values());
|
|
8
|
-
const target = packages.find((pkg) => resolve(pkg.root) === resolve(root));
|
|
9
|
-
if (!target) {
|
|
10
|
-
throw new BuilderError(`Project root '${root}' not found in provided packageGraph.`, "PACKAGE_NOT_FOUND");
|
|
11
|
-
}
|
|
12
|
-
if (!effectiveManifest)
|
|
13
|
-
return baseGraph;
|
|
14
|
-
if (effectiveManifest.id !== target.packageId) {
|
|
15
|
-
throw new BuilderError(`Cannot change package identity from '${target.packageId}' to '${effectiveManifest.id}' in shared package graph.`, "CANNOT_CHANGE_PACKAGE_IDENTITY");
|
|
16
|
-
}
|
|
17
|
-
// 合并配置可能仅创建等价对象;相同声明继续复用共享图。
|
|
18
|
-
if (computeManifestDigest(effectiveManifest) === target.manifestDigest)
|
|
19
|
-
return baseGraph;
|
|
20
|
-
return new PackageGraphBuilder({
|
|
21
|
-
packages: packages.map((pkg) => ({
|
|
22
|
-
id: pkg.packageId,
|
|
23
|
-
root: pkg.root,
|
|
24
|
-
manifest: pkg === target ? effectiveManifest : pkg.manifest,
|
|
25
|
-
isCurrentProject: pkg === target,
|
|
26
|
-
})),
|
|
27
|
-
root: target.root,
|
|
28
|
-
validateDependencies: true,
|
|
29
|
-
}).buildSync();
|
|
30
|
-
}
|
package/dist/source-graph.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { type ActionDockManifest } from "@actiondock/core/project";
|
|
2
|
-
import { type PackageGraph } from "@actiondock/core/graph";
|
|
3
|
-
/** 源码导出只使用显式包与正式安装依赖;显式兄弟包优先于任何依赖查找。 */
|
|
4
|
-
export declare function createSourcePackageGraph(projectRoots: string[], rootManifest?: ActionDockManifest): PackageGraph;
|
package/dist/source-graph.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { realpathSync } from "node:fs";
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
|
-
import { ActionDockError } from "@actiondock/core";
|
|
4
|
-
import { loadManifest } from "@actiondock/core/project";
|
|
5
|
-
import { PackageGraphBuilder } from "@actiondock/core/graph";
|
|
6
|
-
import { BuilderError } from "./errors.js";
|
|
7
|
-
/** 源码导出只使用显式包与正式安装依赖;显式兄弟包优先于任何依赖查找。 */
|
|
8
|
-
export function createSourcePackageGraph(projectRoots, rootManifest) {
|
|
9
|
-
const packages = new Map();
|
|
10
|
-
const register = (pkg) => {
|
|
11
|
-
const existing = packages.get(pkg.id);
|
|
12
|
-
if (existing && realpathSync(existing.root) !== realpathSync(pkg.root)) {
|
|
13
|
-
throw new ActionDockError("PACKAGE_ID_CONFLICT", `Package ID '${pkg.id}' is declared by multiple directories: '${existing.root}' and '${pkg.root}'`);
|
|
14
|
-
}
|
|
15
|
-
packages.set(pkg.id, pkg);
|
|
16
|
-
};
|
|
17
|
-
for (const [index, root] of projectRoots.entries()) {
|
|
18
|
-
const absRoot = resolve(root);
|
|
19
|
-
const manifest = index === 0 && rootManifest ? rootManifest : loadManifest(absRoot);
|
|
20
|
-
if (!manifest)
|
|
21
|
-
throw new BuilderError(`Missing actiondock.json at '${absRoot}'`);
|
|
22
|
-
register({ id: manifest.id, root: absRoot, manifest });
|
|
23
|
-
}
|
|
24
|
-
const packageRoots = Object.fromEntries(Array.from(packages.values(), (p) => [p.id, p.root]));
|
|
25
|
-
// 每个显式包的正式依赖均纳入闭包,统一查重后再构造供所有规划共享的图。
|
|
26
|
-
for (const pkg of Array.from(packages.values())) {
|
|
27
|
-
const graph = new PackageGraphBuilder({ root: pkg.root, manifest: pkg.manifest, packageRoots, allowDevLinks: false }).buildSync();
|
|
28
|
-
for (const node of graph.packages.values()) {
|
|
29
|
-
register({ id: node.packageId, root: node.root, manifest: node.manifest });
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return new PackageGraphBuilder({ packages: Array.from(packages.values()), validateDependencies: true }).buildSync();
|
|
33
|
-
}
|