@shendu-sdt/sdt-dev-agent 0.1.1 → 0.1.3-beta.9
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 +78 -31
- package/dist/catalog.d.ts +16 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +98 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli/index.js +72 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/add.d.ts +7 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +267 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +31 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts +4 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +20 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +66 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/capability-discovery.d.ts +23 -0
- package/dist/core/capability-discovery.d.ts.map +1 -0
- package/dist/core/capability-discovery.js +49 -0
- package/dist/core/capability-discovery.js.map +1 -0
- package/dist/core/init-options.d.ts +7 -1
- package/dist/core/init-options.d.ts.map +1 -1
- package/dist/core/init-options.js +64 -34
- package/dist/core/init-options.js.map +1 -1
- package/dist/core/init-plan.d.ts +25 -1
- package/dist/core/init-plan.d.ts.map +1 -1
- package/dist/core/init-plan.js +211 -37
- package/dist/core/init-plan.js.map +1 -1
- package/dist/core/init-writer.d.ts +17 -1
- package/dist/core/init-writer.d.ts.map +1 -1
- package/dist/core/init-writer.js +72 -19
- package/dist/core/init-writer.js.map +1 -1
- package/dist/core/manifest.d.ts +8 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +16 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/mcp-config.d.ts +12 -0
- package/dist/core/mcp-config.d.ts.map +1 -0
- package/dist/core/mcp-config.js +60 -0
- package/dist/core/mcp-config.js.map +1 -0
- package/dist/core/project-inspector.d.ts +1 -0
- package/dist/core/project-inspector.d.ts.map +1 -1
- package/dist/core/project-inspector.js +4 -0
- package/dist/core/project-inspector.js.map +1 -1
- package/dist/core/remote-skill-installer.d.ts +16 -0
- package/dist/core/remote-skill-installer.d.ts.map +1 -0
- package/dist/core/remote-skill-installer.js +104 -0
- package/dist/core/remote-skill-installer.js.map +1 -0
- package/dist/core/workflow-installer.d.ts +22 -0
- package/dist/core/workflow-installer.d.ts.map +1 -0
- package/dist/core/workflow-installer.js +103 -0
- package/dist/core/workflow-installer.js.map +1 -0
- package/dist/types.d.ts +103 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/follow-up-notice.d.ts +7 -0
- package/dist/utils/follow-up-notice.d.ts.map +1 -0
- package/dist/utils/follow-up-notice.js +29 -0
- package/dist/utils/follow-up-notice.js.map +1 -0
- package/dist/utils/init-welcome.d.ts.map +1 -1
- package/dist/utils/init-welcome.js +20 -33
- package/dist/utils/init-welcome.js.map +1 -1
- package/dist/utils/mastergo-notice.d.ts +7 -0
- package/dist/utils/mastergo-notice.d.ts.map +1 -0
- package/dist/utils/mastergo-notice.js +14 -0
- package/dist/utils/mastergo-notice.js.map +1 -0
- package/dist/utils/searchable-multi-select.js +5 -6
- package/dist/utils/searchable-multi-select.js.map +1 -1
- package/dist/utils/styled-select.d.ts.map +1 -1
- package/dist/utils/styled-select.js.map +1 -1
- package/dist/utils/terminal-theme.d.ts +4 -0
- package/dist/utils/terminal-theme.d.ts.map +1 -0
- package/dist/utils/terminal-theme.js +25 -0
- package/dist/utils/terminal-theme.js.map +1 -0
- package/package.json +6 -3
- package/templates/bootstrap/project-entry.md +17 -0
- package/templates/mcp/context7/claude-code/server.json +6 -0
- package/templates/mcp/context7/codex/config.toml +3 -0
- package/templates/mcp/mastergo/claude-code/server.json +6 -0
- package/templates/mcp/mastergo/codex/config.toml +4 -0
- package/templates/skills/builtin/bootstrap-project-docs/SKILL.md +16 -0
- package/templates/skills/builtin/bootstrap-project-docs/references/architecture-first.md +7 -0
- package/templates/skills/builtin/bootstrap-project-docs/references/tool-rules-follow-up.md +8 -0
- package/templates/skills/remote/catalog.json +68 -0
- package/templates/workflows/openspec/README.md +7 -0
- package/templates/workflows/openspec/claude-code/README.md +7 -0
- package/templates/workflows/openspec/codex/README.md +7 -0
- package/templates/AGENTS.md +0 -24
- package/templates/ARCHITECTURE.md +0 -26
- package/templates/capabilities/mcp/README.md +0 -8
- package/templates/capabilities/skills/README.md +0 -8
- package/templates/docs/ai-collaboration/README.md +0 -16
- package/templates/tools/claude-code/README.md +0 -8
- package/templates/tools/codex/README.md +0 -8
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DEFAULT_MCP_IDS, DEFAULT_SKILL_IDS, MCP_CATALOG, MCP_IDS, SKILL_CATALOG, SKILL_IDS, } from '../catalog.js';
|
|
2
|
+
import { INSTALL_MODES, SUPPORTED_TOOLS } from '../types.js';
|
|
2
3
|
import { canPrompt } from '../utils/interactive.js';
|
|
3
4
|
import { GO_BACK } from '../utils/prompt-flow.js';
|
|
4
5
|
import { searchableMultiSelect } from '../utils/searchable-multi-select.js';
|
|
5
6
|
import { styledSelect } from '../utils/styled-select.js';
|
|
7
|
+
/** 把逗号分隔字符串解析成受限枚举列表,并对非法值快速失败。 */
|
|
6
8
|
function parseList(input, allowed) {
|
|
7
9
|
if (!input) {
|
|
8
10
|
return [];
|
|
@@ -17,15 +19,21 @@ function parseList(input, allowed) {
|
|
|
17
19
|
}
|
|
18
20
|
return values;
|
|
19
21
|
}
|
|
20
|
-
|
|
22
|
+
/** 推荐安装时忽略用户传入 skill 列表,直接回到默认集合。 */
|
|
23
|
+
function normalizeSkills(installMode, skills) {
|
|
21
24
|
if (installMode === 'recommended') {
|
|
22
|
-
return [...
|
|
25
|
+
return [...DEFAULT_SKILL_IDS];
|
|
23
26
|
}
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
return skills;
|
|
28
|
+
}
|
|
29
|
+
/** 推荐安装时忽略用户传入 MCP 列表,直接回到默认集合。 */
|
|
30
|
+
function normalizeMcps(installMode, mcps) {
|
|
31
|
+
if (installMode === 'recommended') {
|
|
32
|
+
return [...DEFAULT_MCP_IDS];
|
|
26
33
|
}
|
|
27
|
-
return
|
|
34
|
+
return mcps;
|
|
28
35
|
}
|
|
36
|
+
/** 交互式选择目标工具。 */
|
|
29
37
|
async function promptTools() {
|
|
30
38
|
return searchableMultiSelect({
|
|
31
39
|
message: 'Select tools to set up (2 available)',
|
|
@@ -36,6 +44,7 @@ async function promptTools() {
|
|
|
36
44
|
validate: (selected) => (selected.length > 0 ? true : 'Select at least one tool'),
|
|
37
45
|
});
|
|
38
46
|
}
|
|
47
|
+
/** 交互式选择安装模式;支持从后续步骤返回。 */
|
|
39
48
|
async function promptInstallMode(allowBack = false) {
|
|
40
49
|
return styledSelect({
|
|
41
50
|
message: '选择安装方式',
|
|
@@ -44,33 +53,42 @@ async function promptInstallMode(allowBack = false) {
|
|
|
44
53
|
{
|
|
45
54
|
name: '推荐安装(默认)',
|
|
46
55
|
value: 'recommended',
|
|
47
|
-
description: '
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
name: '最小安装',
|
|
51
|
-
value: 'minimal',
|
|
52
|
-
description: '只安装基础协作资产和目标工具接入文件',
|
|
56
|
+
description: '安装 bootstrap skill、默认 skills 集合与默认 MCP',
|
|
53
57
|
},
|
|
54
58
|
{
|
|
55
59
|
name: '自定义安装',
|
|
56
60
|
value: 'custom',
|
|
57
|
-
description: '
|
|
61
|
+
description: 'bootstrap skill 固定安装,其余 skills / MCP 按需选择',
|
|
58
62
|
},
|
|
59
63
|
],
|
|
60
64
|
});
|
|
61
65
|
}
|
|
62
|
-
|
|
66
|
+
/** 自定义安装时选择远端 skills;bootstrap skill 不在这里暴露。 */
|
|
67
|
+
async function promptSkills(allowBack = false) {
|
|
63
68
|
return searchableMultiSelect({
|
|
64
|
-
message: '
|
|
69
|
+
message: '选择要安装的 skills(bootstrap skill 会强制安装)',
|
|
65
70
|
allowBack,
|
|
66
|
-
choices:
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
],
|
|
71
|
-
validate: (selected) => (selected.length > 0 ? true : 'Select at least one capability pack'),
|
|
71
|
+
choices: SKILL_CATALOG.filter((skill) => skill.selection !== 'required').map((skill) => ({
|
|
72
|
+
name: `${skill.displayName}${skill.selection === 'default' ? '(默认集)' : '(选装)'}`,
|
|
73
|
+
value: skill.id,
|
|
74
|
+
})),
|
|
72
75
|
});
|
|
73
76
|
}
|
|
77
|
+
/** 自定义安装时选择 MCP,允许留空。 */
|
|
78
|
+
async function promptMcps(allowBack = false) {
|
|
79
|
+
return searchableMultiSelect({
|
|
80
|
+
message: '选择要安装的 MCP(可留空)',
|
|
81
|
+
allowBack,
|
|
82
|
+
choices: MCP_CATALOG.map((mcp) => ({
|
|
83
|
+
name: `${mcp.displayName}${mcp.selection === 'default' ? '(默认集)' : '(选装)'}`,
|
|
84
|
+
value: mcp.id,
|
|
85
|
+
})),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* `init` 选择解析入口。
|
|
90
|
+
* 优先消费显式命令参数;只有必要时才退回交互式选择。
|
|
91
|
+
*/
|
|
74
92
|
export async function resolveInitSelections(options) {
|
|
75
93
|
const tools = parseList(options.tools, SUPPORTED_TOOLS);
|
|
76
94
|
const installMode = options.installMode
|
|
@@ -81,27 +99,32 @@ export async function resolveInitSelections(options) {
|
|
|
81
99
|
return options.installMode;
|
|
82
100
|
})()
|
|
83
101
|
: undefined;
|
|
84
|
-
const
|
|
102
|
+
const skills = parseList(options.skills, SKILL_IDS);
|
|
103
|
+
const mcps = parseList(options.mcp, MCP_IDS);
|
|
85
104
|
if (options.yes) {
|
|
86
105
|
return {
|
|
87
106
|
tools: tools.length > 0 ? tools : [...SUPPORTED_TOOLS],
|
|
88
107
|
installMode: installMode ?? 'recommended',
|
|
89
|
-
|
|
108
|
+
skills: normalizeSkills(installMode ?? 'recommended', skills),
|
|
109
|
+
mcps: normalizeMcps(installMode ?? 'recommended', mcps),
|
|
90
110
|
};
|
|
91
111
|
}
|
|
92
112
|
if (tools.length > 0 && installMode) {
|
|
93
113
|
return {
|
|
94
114
|
tools,
|
|
95
115
|
installMode,
|
|
96
|
-
|
|
116
|
+
skills: normalizeSkills(installMode, skills),
|
|
117
|
+
mcps: normalizeMcps(installMode, mcps),
|
|
97
118
|
};
|
|
98
119
|
}
|
|
99
120
|
if (!canPrompt()) {
|
|
100
|
-
throw new Error('Interactive prompts are unavailable. Pass --tools, --install-mode, and optionally --
|
|
121
|
+
throw new Error('Interactive prompts are unavailable. Pass --tools, --install-mode, and optionally --skills / --mcp or use --yes.');
|
|
101
122
|
}
|
|
102
123
|
let selectedTools = tools.length > 0 ? tools : undefined;
|
|
103
124
|
let selectedInstallMode = installMode;
|
|
104
|
-
let
|
|
125
|
+
let selectedSkills = skills.length > 0 ? skills : undefined;
|
|
126
|
+
let selectedMcps = mcps.length > 0 ? mcps : undefined;
|
|
127
|
+
/** 这里只记录支持返回的关键步骤,skills/MCP 通过显式清空完成回退。 */
|
|
105
128
|
const history = [];
|
|
106
129
|
while (true) {
|
|
107
130
|
if (!selectedTools) {
|
|
@@ -122,9 +145,9 @@ export async function resolveInitSelections(options) {
|
|
|
122
145
|
history.push('install-mode');
|
|
123
146
|
continue;
|
|
124
147
|
}
|
|
125
|
-
if (selectedInstallMode === 'custom' && !
|
|
126
|
-
const
|
|
127
|
-
if (
|
|
148
|
+
if (selectedInstallMode === 'custom' && !selectedSkills) {
|
|
149
|
+
const skillsResult = await promptSkills(history.length > 0);
|
|
150
|
+
if (skillsResult === GO_BACK) {
|
|
128
151
|
const previousStep = history.pop();
|
|
129
152
|
if (previousStep === 'install-mode') {
|
|
130
153
|
selectedInstallMode = undefined;
|
|
@@ -134,18 +157,25 @@ export async function resolveInitSelections(options) {
|
|
|
134
157
|
}
|
|
135
158
|
continue;
|
|
136
159
|
}
|
|
137
|
-
|
|
160
|
+
selectedSkills = skillsResult;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (selectedInstallMode === 'custom' && !selectedMcps) {
|
|
164
|
+
const mcpsResult = await promptMcps(true);
|
|
165
|
+
if (mcpsResult === GO_BACK) {
|
|
166
|
+
selectedSkills = undefined;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
selectedMcps = mcpsResult;
|
|
138
170
|
continue;
|
|
139
171
|
}
|
|
140
172
|
break;
|
|
141
173
|
}
|
|
142
|
-
if (selectedInstallMode === 'custom' && (!selectedCapabilities || selectedCapabilities.length === 0)) {
|
|
143
|
-
throw new Error('Custom install mode requires at least one capability.');
|
|
144
|
-
}
|
|
145
174
|
return {
|
|
146
175
|
tools: selectedTools,
|
|
147
176
|
installMode: selectedInstallMode,
|
|
148
|
-
|
|
177
|
+
skills: normalizeSkills(selectedInstallMode, selectedSkills ?? []),
|
|
178
|
+
mcps: normalizeMcps(selectedInstallMode, selectedMcps ?? []),
|
|
149
179
|
};
|
|
150
180
|
}
|
|
151
181
|
//# sourceMappingURL=init-options.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-options.js","sourceRoot":"","sources":["../../src/core/init-options.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"init-options.js","sourceRoot":"","sources":["../../src/core/init-options.ts"],"names":[],"mappings":"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"}
|
package/dist/core/init-plan.d.ts
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
|
-
import type { InitPlan, InitSelections, ProjectFacts } from '../types.js';
|
|
1
|
+
import type { InitPlan, InitSelections, ProjectFacts, SkillId, ToolId, WorkflowId } from '../types.js';
|
|
2
|
+
/** 各工具项目级 skill 根目录的事实源。 */
|
|
3
|
+
export declare function getProjectSkillRoot(tool: ToolId): string;
|
|
4
|
+
/** 返回某个远端 skill 在指定工具下的主目标路径。 */
|
|
5
|
+
export declare function getRemoteSkillTargetPath(tool: ToolId, skillId: SkillId): string;
|
|
6
|
+
/**
|
|
7
|
+
* 远端 skill 可能会安装成多个目录。
|
|
8
|
+
* 这里统一展开为“传给安装器的 skillName + 项目内目标路径”集合。
|
|
9
|
+
*/
|
|
10
|
+
export declare function getRemoteSkillInstallTargets(tool: ToolId, skillId: SkillId): Array<{
|
|
11
|
+
skillName: string;
|
|
12
|
+
targetPath: string;
|
|
13
|
+
}>;
|
|
14
|
+
/** 仅负责把命令模板里的 `<tool>` 替换成真实 tool 标识。 */
|
|
15
|
+
export declare function buildRemoteSkillInstallCommand(_skillId: SkillId, tool: ToolId, installCommandTemplate: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* workflow 的“已安装”判定依赖一组关键路径同时存在。
|
|
18
|
+
* 这里集中维护各工具下的目标路径矩阵。
|
|
19
|
+
*/
|
|
20
|
+
export declare function getWorkflowTargetPaths(tool: ToolId, workflowId: WorkflowId): string[];
|
|
21
|
+
/** 生成对外展示和失败提示用的 workflow 安装命令。 */
|
|
22
|
+
export declare function buildWorkflowInstallCommand(workflowId: WorkflowId, tool: ToolId): string;
|
|
23
|
+
/** 当前工具对应的项目级 MCP 配置文件路径。 */
|
|
24
|
+
export declare function getProjectMcpConfigPath(tool: ToolId): string;
|
|
25
|
+
/** `init` 主链路的纯计划构建入口,不在这里做真实文件写入。 */
|
|
2
26
|
export declare function createInitPlan(facts: ProjectFacts, selections: InitSelections): InitPlan;
|
|
3
27
|
//# sourceMappingURL=init-plan.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-plan.d.ts","sourceRoot":"","sources":["../../src/core/init-plan.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init-plan.d.ts","sourceRoot":"","sources":["../../src/core/init-plan.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EASd,YAAY,EACZ,OAAO,EACP,MAAM,EACN,UAAU,EACX,MAAM,aAAa,CAAA;AAgCpB,4BAA4B;AAC5B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,iCAAiC;AACjC,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAK/E;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GACf,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBlD;AAED,yCAAyC;AACzC,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,OAAO,EACjB,IAAI,EAAE,MAAM,EACZ,sBAAsB,EAAE,MAAM,GAC7B,MAAM,CAER;AAOD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,EAAE,CAwBrF;AAED,mCAAmC;AACnC,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxF;AAED,6BAA6B;AAC7B,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAgOD,sCAAsC;AACtC,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,GAAG,QAAQ,CAuBxF"}
|
package/dist/core/init-plan.js
CHANGED
|
@@ -1,16 +1,107 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
1
|
+
import { readdirSync, readFileSync, statSync } from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { REQUIRED_SKILL_ID, getWorkflowCatalogEntry, getMcpCatalogEntry, getSkillCatalogEntry, } from '../catalog.js';
|
|
5
|
+
import { buildClaudeMcpConfig, buildCodexMcpConfig } from './mcp-config.js';
|
|
4
6
|
import { renderTemplate } from '../utils/render-template.js';
|
|
5
7
|
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
6
8
|
const projectRoot = path.resolve(currentDir, '..', '..');
|
|
9
|
+
/** 从仓库内模板目录读取原始模板内容。 */
|
|
7
10
|
function loadTemplate(relativePath) {
|
|
8
11
|
return readFileSync(path.join(projectRoot, 'templates', relativePath), 'utf8');
|
|
9
12
|
}
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
/** 递归收集某个模板目录下的所有文件,用于整目录复制型模板展开。 */
|
|
14
|
+
function walkTemplateFiles(relativeDir) {
|
|
15
|
+
const absoluteDir = path.join(projectRoot, 'templates', relativeDir);
|
|
16
|
+
const entries = readdirSync(absoluteDir);
|
|
17
|
+
const files = [];
|
|
18
|
+
for (const entry of entries) {
|
|
19
|
+
const absoluteEntry = path.join(absoluteDir, entry);
|
|
20
|
+
const relativeEntry = path.join(relativeDir, entry);
|
|
21
|
+
if (statSync(absoluteEntry).isDirectory()) {
|
|
22
|
+
files.push(...walkTemplateFiles(relativeEntry));
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
files.push(relativeEntry);
|
|
26
|
+
}
|
|
27
|
+
return files;
|
|
28
|
+
}
|
|
29
|
+
/** 各工具项目级 skill 根目录的事实源。 */
|
|
30
|
+
export function getProjectSkillRoot(tool) {
|
|
31
|
+
return tool === 'codex' ? path.join('.agents', 'skills') : path.join('.claude', 'skills');
|
|
32
|
+
}
|
|
33
|
+
/** 返回某个远端 skill 在指定工具下的主目标路径。 */
|
|
34
|
+
export function getRemoteSkillTargetPath(tool, skillId) {
|
|
35
|
+
const skill = getSkillCatalogEntry(skillId);
|
|
36
|
+
const firstTarget = skill.remote?.installTargets?.[0]?.targetDirName;
|
|
37
|
+
return path.join(getProjectSkillRoot(tool), firstTarget ?? skillId);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 远端 skill 可能会安装成多个目录。
|
|
41
|
+
* 这里统一展开为“传给安装器的 skillName + 项目内目标路径”集合。
|
|
42
|
+
*/
|
|
43
|
+
export function getRemoteSkillInstallTargets(tool, skillId) {
|
|
44
|
+
const skill = getSkillCatalogEntry(skillId);
|
|
45
|
+
const configuredTargets = skill.remote?.installTargets;
|
|
46
|
+
if (!configuredTargets || configuredTargets.length === 0) {
|
|
47
|
+
return [
|
|
48
|
+
{
|
|
49
|
+
skillName: skillId,
|
|
50
|
+
targetPath: getRemoteSkillTargetPath(tool, skillId),
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
return configuredTargets.map((target) => ({
|
|
55
|
+
skillName: target.skillName,
|
|
56
|
+
targetPath: path.join(getProjectSkillRoot(tool), target.targetDirName),
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
/** 仅负责把命令模板里的 `<tool>` 替换成真实 tool 标识。 */
|
|
60
|
+
export function buildRemoteSkillInstallCommand(_skillId, tool, installCommandTemplate) {
|
|
61
|
+
return installCommandTemplate.replace('<tool>', tool);
|
|
12
62
|
}
|
|
13
|
-
|
|
63
|
+
/** `OpenSpec` CLI 与本仓库 `ToolId` 的工具名有一层映射。 */
|
|
64
|
+
function mapOpenSpecToolId(tool) {
|
|
65
|
+
return tool === 'claude-code' ? 'claude' : 'codex';
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* workflow 的“已安装”判定依赖一组关键路径同时存在。
|
|
69
|
+
* 这里集中维护各工具下的目标路径矩阵。
|
|
70
|
+
*/
|
|
71
|
+
export function getWorkflowTargetPaths(tool, workflowId) {
|
|
72
|
+
if (workflowId !== 'openspec') {
|
|
73
|
+
throw new Error(`Unknown workflow target mapping: ${workflowId}`);
|
|
74
|
+
}
|
|
75
|
+
if (tool === 'codex') {
|
|
76
|
+
return [
|
|
77
|
+
path.join('.codex', 'skills', 'openspec-apply-change', 'SKILL.md'),
|
|
78
|
+
path.join('.codex', 'skills', 'openspec-archive-change', 'SKILL.md'),
|
|
79
|
+
path.join('.codex', 'skills', 'openspec-explore', 'SKILL.md'),
|
|
80
|
+
path.join('.codex', 'skills', 'openspec-propose', 'SKILL.md'),
|
|
81
|
+
];
|
|
82
|
+
}
|
|
83
|
+
return [
|
|
84
|
+
path.join('.claude', 'skills', 'openspec-apply-change', 'SKILL.md'),
|
|
85
|
+
path.join('.claude', 'skills', 'openspec-archive-change', 'SKILL.md'),
|
|
86
|
+
path.join('.claude', 'skills', 'openspec-explore', 'SKILL.md'),
|
|
87
|
+
path.join('.claude', 'skills', 'openspec-propose', 'SKILL.md'),
|
|
88
|
+
path.join('.claude', 'commands', 'opsx', 'apply.md'),
|
|
89
|
+
path.join('.claude', 'commands', 'opsx', 'archive.md'),
|
|
90
|
+
path.join('.claude', 'commands', 'opsx', 'explore.md'),
|
|
91
|
+
path.join('.claude', 'commands', 'opsx', 'propose.md'),
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
/** 生成对外展示和失败提示用的 workflow 安装命令。 */
|
|
95
|
+
export function buildWorkflowInstallCommand(workflowId, tool) {
|
|
96
|
+
const workflow = getWorkflowCatalogEntry(workflowId);
|
|
97
|
+
return workflow.installCommand.replace('<tool>', mapOpenSpecToolId(tool));
|
|
98
|
+
}
|
|
99
|
+
/** 当前工具对应的项目级 MCP 配置文件路径。 */
|
|
100
|
+
export function getProjectMcpConfigPath(tool) {
|
|
101
|
+
return tool === 'codex' ? path.join('.codex', 'config.toml') : '.mcp.json';
|
|
102
|
+
}
|
|
103
|
+
/** 所有模板都会共享的基础插值变量。 */
|
|
104
|
+
function baseTemplateValues(facts, selections, tool) {
|
|
14
105
|
return {
|
|
15
106
|
projectName: facts.projectName,
|
|
16
107
|
packageManager: facts.packageManager,
|
|
@@ -18,54 +109,131 @@ function baseTemplateValues(facts, selections) {
|
|
|
18
109
|
testRoot: facts.testRoot,
|
|
19
110
|
selectedTools: selections.tools.join(', '),
|
|
20
111
|
installMode: selections.installMode,
|
|
21
|
-
|
|
112
|
+
selectedSkills: selections.skills.join(', ') || '(none)',
|
|
113
|
+
selectedMcps: selections.mcps.join(', ') || '(none)',
|
|
114
|
+
toolId: tool ?? '',
|
|
115
|
+
toolRulesDoc: tool === 'codex' ? 'AGENTS.md' : tool === 'claude-code' ? 'CLAUDE.md' : '',
|
|
22
116
|
};
|
|
23
117
|
}
|
|
24
|
-
|
|
25
|
-
|
|
118
|
+
/** 生成目标项目的 bootstrap 入口文档。 */
|
|
119
|
+
function addProjectEntry(files, facts, selections) {
|
|
26
120
|
files.push({
|
|
27
|
-
path: '
|
|
28
|
-
content: renderTemplate(loadTemplate('
|
|
29
|
-
kind: '
|
|
30
|
-
}, {
|
|
31
|
-
path: 'ARCHITECTURE.md',
|
|
32
|
-
content: renderTemplate(loadTemplate('ARCHITECTURE.md'), values),
|
|
33
|
-
kind: 'project-asset',
|
|
34
|
-
}, {
|
|
35
|
-
path: path.join('docs', 'ai-collaboration', 'README.md'),
|
|
36
|
-
content: renderTemplate(loadTemplate(path.join('docs', 'ai-collaboration', 'README.md')), values),
|
|
37
|
-
kind: 'project-asset',
|
|
121
|
+
path: path.join('.sdt-devagent', 'bootstrap-project-docs.md'),
|
|
122
|
+
content: renderTemplate(loadTemplate(path.join('bootstrap', 'project-entry.md')), baseTemplateValues(facts, selections)),
|
|
123
|
+
kind: 'bootstrap',
|
|
38
124
|
});
|
|
39
125
|
}
|
|
40
|
-
|
|
41
|
-
|
|
126
|
+
/** 把内置 bootstrap skill 整目录展开到工具对应的项目级 skill 目录。 */
|
|
127
|
+
function addBuiltinBootstrapSkill(files, facts, selections, tool) {
|
|
128
|
+
const entry = getSkillCatalogEntry(REQUIRED_SKILL_ID);
|
|
129
|
+
if (!entry.templateDir) {
|
|
130
|
+
throw new Error(`Bootstrap skill template directory is missing for ${REQUIRED_SKILL_ID}`);
|
|
131
|
+
}
|
|
132
|
+
const targetRoot = path.join(getProjectSkillRoot(tool), entry.id);
|
|
133
|
+
const templateFiles = walkTemplateFiles(entry.templateDir);
|
|
134
|
+
const values = baseTemplateValues(facts, selections, tool);
|
|
135
|
+
for (const templateFile of templateFiles) {
|
|
136
|
+
const relativeFile = path.relative(entry.templateDir, templateFile);
|
|
42
137
|
files.push({
|
|
43
|
-
path: path.join(
|
|
44
|
-
content: loadTemplate(
|
|
45
|
-
kind: '
|
|
138
|
+
path: path.join(targetRoot, relativeFile),
|
|
139
|
+
content: renderTemplate(loadTemplate(templateFile), values),
|
|
140
|
+
kind: 'bootstrap',
|
|
46
141
|
});
|
|
47
142
|
}
|
|
48
143
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
144
|
+
/** 按工具生成项目级 MCP 配置文件。 */
|
|
145
|
+
function addMcpConfig(files, tool, selectedMcps) {
|
|
146
|
+
if (selectedMcps.length === 0) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
files.push({
|
|
150
|
+
path: getProjectMcpConfigPath(tool),
|
|
151
|
+
content: tool === 'codex' ? buildCodexMcpConfig(selectedMcps) : buildClaudeMcpConfig(selectedMcps),
|
|
152
|
+
kind: 'mcp',
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/** 把需要额外走外部安装命令的远端 skill 收口成执行计划。 */
|
|
156
|
+
function buildRemoteSkillInstalls(tools, skillIds) {
|
|
157
|
+
const installs = [];
|
|
158
|
+
for (const skillId of skillIds) {
|
|
159
|
+
const skill = getSkillCatalogEntry(skillId);
|
|
160
|
+
if (!skill.remote) {
|
|
52
161
|
continue;
|
|
53
162
|
}
|
|
54
163
|
for (const tool of tools) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
164
|
+
installs.push({
|
|
165
|
+
tool,
|
|
166
|
+
skillId,
|
|
167
|
+
targetPath: getRemoteSkillTargetPath(tool, skillId),
|
|
168
|
+
installTargets: getRemoteSkillInstallTargets(tool, skillId),
|
|
169
|
+
source: skill.remote.source,
|
|
170
|
+
installCommand: buildRemoteSkillInstallCommand(skillId, tool, skill.remote.installCommand),
|
|
59
171
|
});
|
|
60
172
|
}
|
|
61
173
|
}
|
|
174
|
+
return installs;
|
|
62
175
|
}
|
|
63
|
-
|
|
176
|
+
/** 统一构造 manifest 中单个 tool 维度的安装记录。 */
|
|
177
|
+
function createInstallRecord(tool, pathValue, source, installCommand) {
|
|
178
|
+
return {
|
|
179
|
+
tool,
|
|
180
|
+
status: 'installed',
|
|
181
|
+
path: pathValue,
|
|
182
|
+
source,
|
|
183
|
+
installCommand,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/** 构造 manifest 的 skill 段,包含必装 bootstrap skill。 */
|
|
187
|
+
function buildSkillManifestEntries(tools, selectedSkillIds) {
|
|
188
|
+
const bootstrap = getSkillCatalogEntry(REQUIRED_SKILL_ID);
|
|
189
|
+
const records = [
|
|
190
|
+
{
|
|
191
|
+
id: REQUIRED_SKILL_ID,
|
|
192
|
+
selection: bootstrap.selection,
|
|
193
|
+
sourceType: bootstrap.sourceType,
|
|
194
|
+
installs: tools.map((tool) => createInstallRecord(tool, path.join(getProjectSkillRoot(tool), REQUIRED_SKILL_ID, 'SKILL.md'))),
|
|
195
|
+
},
|
|
196
|
+
];
|
|
197
|
+
for (const skillId of selectedSkillIds) {
|
|
198
|
+
const skill = getSkillCatalogEntry(skillId);
|
|
199
|
+
records.push({
|
|
200
|
+
id: skillId,
|
|
201
|
+
selection: skill.selection,
|
|
202
|
+
sourceType: skill.sourceType,
|
|
203
|
+
installs: tools.map((tool) => createInstallRecord(tool, getRemoteSkillTargetPath(tool, skillId), skill.remote?.source, skill.remote
|
|
204
|
+
? buildRemoteSkillInstallCommand(skillId, tool, skill.remote.installCommand)
|
|
205
|
+
: undefined)),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
return records;
|
|
209
|
+
}
|
|
210
|
+
/** 构造 manifest 的 MCP 段。 */
|
|
211
|
+
function buildMcpManifestEntries(tools, selectedMcps) {
|
|
212
|
+
return selectedMcps.map((mcpId) => {
|
|
213
|
+
const mcp = getMcpCatalogEntry(mcpId);
|
|
214
|
+
return {
|
|
215
|
+
id: mcpId,
|
|
216
|
+
selection: mcp.selection,
|
|
217
|
+
sourceType: mcp.sourceType,
|
|
218
|
+
installs: tools.map((tool) => createInstallRecord(tool, getProjectMcpConfigPath(tool))),
|
|
219
|
+
};
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
/** `init` 默认不安装 workflow,留给后续 `add workflow` 增量接入。 */
|
|
223
|
+
function buildWorkflowManifestEntries(_tools) {
|
|
224
|
+
return [];
|
|
225
|
+
}
|
|
226
|
+
/** 基于计划文件和外部安装计划,生成最终要回写的 manifest 快照。 */
|
|
227
|
+
function buildManifest(facts, selections, files, remoteSkillInstalls) {
|
|
64
228
|
const generatedFiles = [
|
|
65
229
|
...files.map((file) => ({
|
|
66
230
|
path: file.path,
|
|
67
231
|
kind: file.kind,
|
|
68
232
|
})),
|
|
233
|
+
...remoteSkillInstalls.map((install) => ({
|
|
234
|
+
path: install.targetPath,
|
|
235
|
+
kind: 'bootstrap',
|
|
236
|
+
})),
|
|
69
237
|
{
|
|
70
238
|
path: path.join('.sdt-devagent', 'manifest.json'),
|
|
71
239
|
kind: 'manifest',
|
|
@@ -76,7 +244,10 @@ function buildManifest(facts, selections, files) {
|
|
|
76
244
|
generatedAt: new Date().toISOString(),
|
|
77
245
|
installMode: selections.installMode,
|
|
78
246
|
tools: selections.tools,
|
|
79
|
-
|
|
247
|
+
bootstrapSkillId: REQUIRED_SKILL_ID,
|
|
248
|
+
skills: buildSkillManifestEntries(selections.tools, selections.skills),
|
|
249
|
+
mcps: buildMcpManifestEntries(selections.tools, selections.mcps),
|
|
250
|
+
workflows: buildWorkflowManifestEntries(selections.tools),
|
|
80
251
|
project: {
|
|
81
252
|
path: facts.targetPath,
|
|
82
253
|
name: facts.projectName,
|
|
@@ -87,14 +258,16 @@ function buildManifest(facts, selections, files) {
|
|
|
87
258
|
generatedFiles,
|
|
88
259
|
};
|
|
89
260
|
}
|
|
261
|
+
/** `init` 主链路的纯计划构建入口,不在这里做真实文件写入。 */
|
|
90
262
|
export function createInitPlan(facts, selections) {
|
|
91
263
|
const files = [];
|
|
92
|
-
|
|
93
|
-
|
|
264
|
+
addProjectEntry(files, facts, selections);
|
|
265
|
+
for (const tool of selections.tools) {
|
|
266
|
+
addBuiltinBootstrapSkill(files, facts, selections, tool);
|
|
267
|
+
addMcpConfig(files, tool, selections.mcps);
|
|
94
268
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const manifest = buildManifest(facts, selections, files);
|
|
269
|
+
const remoteSkillInstalls = buildRemoteSkillInstalls(selections.tools, selections.skills);
|
|
270
|
+
const manifest = buildManifest(facts, selections, files, remoteSkillInstalls);
|
|
98
271
|
files.push({
|
|
99
272
|
path: path.join('.sdt-devagent', 'manifest.json'),
|
|
100
273
|
content: `${JSON.stringify(manifest, null, 2)}\n`,
|
|
@@ -102,6 +275,7 @@ export function createInitPlan(facts, selections) {
|
|
|
102
275
|
});
|
|
103
276
|
return {
|
|
104
277
|
files,
|
|
278
|
+
remoteSkillInstalls,
|
|
105
279
|
manifest,
|
|
106
280
|
};
|
|
107
281
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-plan.js","sourceRoot":"","sources":["../../src/core/init-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"init-plan.js","sourceRoot":"","sources":["../../src/core/init-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAiB3E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAE5D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAExD,wBAAwB;AACxB,SAAS,YAAY,CAAC,YAAoB;IACxC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAA;AAChF,CAAC;AAED,qCAAqC;AACrC,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;IACpE,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;IACxC,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QACnD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QAEnD,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAA;YAC/C,SAAQ;QACV,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC3B,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;AAC3F,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,wBAAwB,CAAC,IAAY,EAAE,OAAgB;IACrE,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,CAAA;IAEpE,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,WAAW,IAAI,OAAO,CAAC,CAAA;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,IAAY,EACZ,OAAgB;IAEhB,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,EAAE,cAAc,CAAA;IAEtD,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO;YACL;gBACE,SAAS,EAAE,OAAO;gBAClB,UAAU,EAAE,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC;aACpD;SACF,CAAA;IACH,CAAC;IAED,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC;KACvE,CAAC,CAAC,CAAA;AACL,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,8BAA8B,CAC5C,QAAiB,EACjB,IAAY,EACZ,sBAA8B;IAE9B,OAAO,sBAAsB,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;AACvD,CAAC;AAED,8CAA8C;AAC9C,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAA;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,UAAsB;IACzE,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oCAAoC,UAAU,EAAE,CAAC,CAAA;IACnE,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO;YACL,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE,UAAU,CAAC;YAClE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,yBAAyB,EAAE,UAAU,CAAC;YACpE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,CAAC;YAC7D,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,CAAC;SAC9D,CAAA;IACH,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,uBAAuB,EAAE,UAAU,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,yBAAyB,EAAE,UAAU,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,CAAC;QAC9D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,UAAU,CAAC;QAC9D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC;KACvD,CAAA;AACH,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,2BAA2B,CAAC,UAAsB,EAAE,IAAY;IAC9E,MAAM,QAAQ,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAA;IACpD,OAAO,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAA;AAC3E,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,CAAA;AAC5E,CAAC;AAED,uBAAuB;AACvB,SAAS,kBAAkB,CACzB,KAAmB,EACnB,UAA0B,EAC1B,IAAa;IAEb,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,aAAa,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1C,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ;QACxD,YAAY,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ;QACpD,MAAM,EAAE,IAAI,IAAI,EAAE;QAClB,YAAY,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;KACzF,CAAA;AACH,CAAC;AAED,8BAA8B;AAC9B,SAAS,eAAe,CACtB,KAAoB,EACpB,KAAmB,EACnB,UAA0B;IAE1B,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,2BAA2B,CAAC;QAC7D,OAAO,EAAE,cAAc,CACrB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,EACxD,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,CACtC;QACD,IAAI,EAAE,WAAW;KAClB,CAAC,CAAA;AACJ,CAAC;AAED,mDAAmD;AACnD,SAAS,wBAAwB,CAC/B,KAAoB,EACpB,KAAmB,EACnB,UAA0B,EAC1B,IAAY;IAEZ,MAAM,KAAK,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,CAAA;IACrD,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,qDAAqD,iBAAiB,EAAE,CAAC,CAAA;IAC3F,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;IACjE,MAAM,aAAa,GAAG,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAC1D,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;IAE1D,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;QACnE,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;YACzC,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;YAC3D,IAAI,EAAE,WAAW;SAClB,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,SAAS,YAAY,CAAC,KAAoB,EAAE,IAAY,EAAE,YAAqB;IAC7E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAM;IACR,CAAC;IAED,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,uBAAuB,CAAC,IAAI,CAAC;QACnC,OAAO,EACL,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,YAAY,CAAC;QAC3F,IAAI,EAAE,KAAK;KACZ,CAAC,CAAA;AACJ,CAAC;AAED,qCAAqC;AACrC,SAAS,wBAAwB,CAC/B,KAAe,EACf,QAAmB;IAEnB,MAAM,QAAQ,GAAgC,EAAE,CAAA;IAEhD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;QAC3C,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,SAAQ;QACV,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,OAAO;gBACP,UAAU,EAAE,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC;gBACnD,cAAc,EAAE,4BAA4B,CAAC,IAAI,EAAE,OAAO,CAAC;gBAC3D,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;gBAC3B,cAAc,EAAE,8BAA8B,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC;aAC3F,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,sCAAsC;AACtC,SAAS,mBAAmB,CAC1B,IAAY,EACZ,SAAiB,EACjB,MAAe,EACf,cAAuB;IAEvB,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,WAAW;QACnB,IAAI,EAAE,SAAS;QACf,MAAM;QACN,cAAc;KACf,CAAA;AACH,CAAC;AAED,kDAAkD;AAClD,SAAS,yBAAyB,CAChC,KAAe,EACf,gBAA2B;IAE3B,MAAM,SAAS,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,CAAA;IACzD,MAAM,OAAO,GAA0B;QACrC;YACE,EAAE,EAAE,iBAAiB;YACrB,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3B,mBAAmB,CACjB,IAAI,EACJ,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,iBAAiB,EAAE,UAAU,CAAC,CACpE,CACF;SACF;KACF,CAAA;IAED,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;QAC3C,OAAO,CAAC,IAAI,CAAC;YACX,EAAE,EAAE,OAAO;YACX,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3B,mBAAmB,CACjB,IAAI,EACJ,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,EACvC,KAAK,CAAC,MAAM,EAAE,MAAM,EACpB,KAAK,CAAC,MAAM;gBACV,CAAC,CAAC,8BAA8B,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC;gBAC5E,CAAC,CAAC,SAAS,CACd,CACF;SACF,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,2BAA2B;AAC3B,SAAS,uBAAuB,CAAC,KAAe,EAAE,YAAqB;IACrE,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAChC,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;QACrC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC;SACxF,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,sDAAsD;AACtD,SAAS,4BAA4B,CAAC,MAAgB;IACpD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,0CAA0C;AAC1C,SAAS,aAAa,CACpB,KAAmB,EACnB,UAA0B,EAC1B,KAAoB,EACpB,mBAAgD;IAEhD,MAAM,cAAc,GAAG;QACrB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QACH,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,EAAE,OAAO,CAAC,UAAU;YACxB,IAAI,EAAE,WAAoB;SAC3B,CAAC,CAAC;QACH;YACE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC;YACjD,IAAI,EAAE,UAAmB;SAC1B;KACF,CAAA;IAED,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,gBAAgB,EAAE,iBAAiB;QACnC,MAAM,EAAE,yBAAyB,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC;QACtE,IAAI,EAAE,uBAAuB,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC;QAChE,SAAS,EAAE,4BAA4B,CAAC,UAAU,CAAC,KAAK,CAAC;QACzD,OAAO,EAAE;YACP,IAAI,EAAE,KAAK,CAAC,UAAU;YACtB,IAAI,EAAE,KAAK,CAAC,WAAW;YACvB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB;QACD,cAAc;KACf,CAAA;AACH,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,cAAc,CAAC,KAAmB,EAAE,UAA0B;IAC5E,MAAM,KAAK,GAAkB,EAAE,CAAA;IAE/B,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;IAEzC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,wBAAwB,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;QACxD,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;IAC5C,CAAC;IAED,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IACzF,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAA;IAC7E,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC;QACjD,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;QACjD,IAAI,EAAE,UAAU;KACjB,CAAC,CAAA;IAEF,OAAO;QACL,KAAK;QACL,mBAAmB;QACnB,QAAQ;KACT,CAAA;AACH,CAAC"}
|
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
import type { InitPlan } from '../types.js';
|
|
2
|
+
/** 应用安装计划后的写入摘要。 */
|
|
2
3
|
export interface WriteResult {
|
|
3
4
|
writtenFiles: string[];
|
|
5
|
+
failedRemoteSkills: Array<{
|
|
6
|
+
skillId: string;
|
|
7
|
+
tool: string;
|
|
8
|
+
installCommand: string;
|
|
9
|
+
error: string;
|
|
10
|
+
}>;
|
|
4
11
|
}
|
|
5
|
-
|
|
12
|
+
/** 提供给命令层的进度回调,避免 `core` 直接耦合终端输出。 */
|
|
13
|
+
export interface ApplyInitPlanHooks {
|
|
14
|
+
onRemoteSkillInstallStart?: (install: InitPlan['remoteSkillInstalls'][number], index: number, total: number) => void;
|
|
15
|
+
onRemoteSkillInstallFinish?: (install: InitPlan['remoteSkillInstalls'][number], result: 'installed' | 'already-present' | 'failed') => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 执行 `createInitPlan` 产出的计划。
|
|
19
|
+
* 这里负责真实写盘、MCP 合并、远端 skill 安装以及 manifest 最终回写。
|
|
20
|
+
*/
|
|
21
|
+
export declare function applyInitPlan(targetPath: string, plan: InitPlan, hooks?: ApplyInitPlanHooks): Promise<WriteResult>;
|
|
6
22
|
//# sourceMappingURL=init-writer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-writer.d.ts","sourceRoot":"","sources":["../../src/core/init-writer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init-writer.d.ts","sourceRoot":"","sources":["../../src/core/init-writer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,oBAAoB;AACpB,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,kBAAkB,EAAE,KAAK,CAAC;QACxB,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,EAAE,MAAM,CAAA;QACZ,cAAc,EAAE,MAAM,CAAA;QACtB,KAAK,EAAE,MAAM,CAAA;KACd,CAAC,CAAA;CACH;AAED,sCAAsC;AACtC,MAAM,WAAW,kBAAkB;IACjC,yBAAyB,CAAC,EAAE,CAC1B,OAAO,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC,MAAM,CAAC,EAChD,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,KACV,IAAI,CAAA;IACT,0BAA0B,CAAC,EAAE,CAC3B,OAAO,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC,MAAM,CAAC,EAChD,MAAM,EAAE,WAAW,GAAG,iBAAiB,GAAG,QAAQ,KAC/C,IAAI,CAAA;CACV;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,QAAQ,EACd,KAAK,GAAE,kBAAuB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAyFtB"}
|