@shendu-sdt/sdt-dev-agent 0.1.2 → 0.1.3-beta.10
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 +70 -14
- 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 -35
- 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/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
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":"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"}
|
|
@@ -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"}
|
package/dist/core/init-writer.js
CHANGED
|
@@ -1,28 +1,81 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return conflicts;
|
|
12
|
-
}
|
|
13
|
-
export async function applyInitPlan(targetPath, plan) {
|
|
14
|
-
const conflicts = await collectConflicts(targetPath, plan);
|
|
15
|
-
if (conflicts.length > 0) {
|
|
16
|
-
throw new Error(`Initialization aborted. Existing files would be overwritten:\n${conflicts
|
|
17
|
-
.map((item) => `- ${item}`)
|
|
18
|
-
.join('\n')}`);
|
|
19
|
-
}
|
|
2
|
+
import { detectSkillAvailability } from './capability-discovery.js';
|
|
3
|
+
import { mergeMcpConfig, parseConfiguredMcpIds } from './mcp-config.js';
|
|
4
|
+
import { installRemoteSkill } from './remote-skill-installer.js';
|
|
5
|
+
import { exists, readText, toPosixPath, writeText } from '../utils/fs.js';
|
|
6
|
+
/**
|
|
7
|
+
* 执行 `createInitPlan` 产出的计划。
|
|
8
|
+
* 这里负责真实写盘、MCP 合并、远端 skill 安装以及 manifest 最终回写。
|
|
9
|
+
*/
|
|
10
|
+
export async function applyInitPlan(targetPath, plan, hooks = {}) {
|
|
20
11
|
const writtenFiles = [];
|
|
12
|
+
const failedRemoteSkills = [];
|
|
21
13
|
for (const file of plan.files) {
|
|
14
|
+
if (file.kind === 'manifest') {
|
|
15
|
+
// manifest 需要在远端安装结果落定后再写一次,避免状态不一致。
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
22
18
|
const absolutePath = path.join(targetPath, file.path);
|
|
19
|
+
if (file.kind === 'mcp' && (await exists(absolutePath))) {
|
|
20
|
+
const tool = file.path === '.mcp.json' ? 'claude-code' : 'codex';
|
|
21
|
+
const existingContent = await readText(absolutePath);
|
|
22
|
+
const selectedMcps = plan.manifest.mcps
|
|
23
|
+
.filter((mcp) => mcp.installs.some((install) => install.tool === tool && install.path === file.path))
|
|
24
|
+
.map((mcp) => mcp.id);
|
|
25
|
+
const existingServers = parseConfiguredMcpIds(tool, existingContent);
|
|
26
|
+
for (const mcp of plan.manifest.mcps) {
|
|
27
|
+
const installRecord = mcp.installs.find((install) => install.tool === tool && install.path === file.path);
|
|
28
|
+
if (installRecord && existingServers.has(mcp.id)) {
|
|
29
|
+
installRecord.status = 'already-present';
|
|
30
|
+
installRecord.reason = 'already-present';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const mergedContent = mergeMcpConfig(tool, existingContent, selectedMcps);
|
|
34
|
+
if (mergedContent !== existingContent) {
|
|
35
|
+
await writeText(absolutePath, mergedContent);
|
|
36
|
+
writtenFiles.push(toPosixPath(file.path));
|
|
37
|
+
}
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
23
40
|
await writeText(absolutePath, file.content);
|
|
24
41
|
writtenFiles.push(toPosixPath(file.path));
|
|
25
42
|
}
|
|
26
|
-
|
|
43
|
+
for (const [index, install] of plan.remoteSkillInstalls.entries()) {
|
|
44
|
+
hooks.onRemoteSkillInstallStart?.(install, index + 1, plan.remoteSkillInstalls.length);
|
|
45
|
+
const availability = await detectSkillAvailability(targetPath, install.tool, install.skillId);
|
|
46
|
+
const skillRecord = plan.manifest.skills.find((skill) => skill.id === install.skillId);
|
|
47
|
+
const installRecord = skillRecord?.installs.find((item) => item.tool === install.tool);
|
|
48
|
+
if (!installRecord) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (availability.status === 'already-present') {
|
|
52
|
+
installRecord.status = availability.status;
|
|
53
|
+
installRecord.reason = availability.reason;
|
|
54
|
+
hooks.onRemoteSkillInstallFinish?.(install, 'already-present');
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const result = await installRemoteSkill(targetPath, install);
|
|
58
|
+
if (!result.success) {
|
|
59
|
+
installRecord.status = 'failed';
|
|
60
|
+
installRecord.reason = 'install-failed';
|
|
61
|
+
hooks.onRemoteSkillInstallFinish?.(install, 'failed');
|
|
62
|
+
failedRemoteSkills.push({
|
|
63
|
+
skillId: install.skillId,
|
|
64
|
+
tool: install.tool,
|
|
65
|
+
installCommand: install.installCommand,
|
|
66
|
+
error: result.error ?? 'Unknown error',
|
|
67
|
+
});
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
writtenFiles.push(...result.targetPaths.map((targetPath) => toPosixPath(targetPath)));
|
|
71
|
+
hooks.onRemoteSkillInstallFinish?.(install, 'installed');
|
|
72
|
+
}
|
|
73
|
+
const manifestPath = path.join(targetPath, '.sdt-devagent', 'manifest.json');
|
|
74
|
+
await writeText(manifestPath, `${JSON.stringify(plan.manifest, null, 2)}\n`);
|
|
75
|
+
writtenFiles.push('.sdt-devagent/manifest.json');
|
|
76
|
+
return {
|
|
77
|
+
writtenFiles,
|
|
78
|
+
failedRemoteSkills,
|
|
79
|
+
};
|
|
27
80
|
}
|
|
28
81
|
//# sourceMappingURL=init-writer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-writer.js","sourceRoot":"","sources":["../../src/core/init-writer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"init-writer.js","sourceRoot":"","sources":["../../src/core/init-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { InstallManifest } from '../types.js';
|
|
2
|
+
/** `.sdt-devagent/manifest.json` 的固定位置。 */
|
|
3
|
+
export declare function getManifestPath(projectRoot: string): string;
|
|
4
|
+
/** 读取并解析项目内 manifest。 */
|
|
5
|
+
export declare function readInstallManifest(projectRoot: string): Promise<InstallManifest>;
|
|
6
|
+
/** 用格式化 JSON 回写 manifest。 */
|
|
7
|
+
export declare function writeInstallManifest(projectRoot: string, manifest: InstallManifest): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,2CAA2C;AAC3C,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,yBAAyB;AACzB,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAGvF;AAED,6BAA6B;AAC7B,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { readText, writeText } from '../utils/fs.js';
|
|
3
|
+
/** `.sdt-devagent/manifest.json` 的固定位置。 */
|
|
4
|
+
export function getManifestPath(projectRoot) {
|
|
5
|
+
return path.join(projectRoot, '.sdt-devagent', 'manifest.json');
|
|
6
|
+
}
|
|
7
|
+
/** 读取并解析项目内 manifest。 */
|
|
8
|
+
export async function readInstallManifest(projectRoot) {
|
|
9
|
+
const raw = await readText(getManifestPath(projectRoot));
|
|
10
|
+
return JSON.parse(raw);
|
|
11
|
+
}
|
|
12
|
+
/** 用格式化 JSON 回写 manifest。 */
|
|
13
|
+
export async function writeInstallManifest(projectRoot, manifest) {
|
|
14
|
+
await writeText(getManifestPath(projectRoot), `${JSON.stringify(manifest, null, 2)}\n`);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAGpD,2CAA2C;AAC3C,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,eAAe,CAAC,CAAA;AACjE,CAAC;AAED,yBAAyB;AACzB,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IAC3D,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAA;IACxD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAA;AAC3C,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAmB,EACnB,QAAyB;IAEzB,MAAM,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;AACzF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { McpId, ToolId } from '../types.js';
|
|
2
|
+
/** 获取某个 MCP 在指定工具下的模板片段。 */
|
|
3
|
+
export declare function getMcpSnippet(tool: ToolId, mcpId: McpId): string;
|
|
4
|
+
/** 组装 Codex 项目的 `config.toml` 片段。 */
|
|
5
|
+
export declare function buildCodexMcpConfig(selectedMcps: McpId[]): string;
|
|
6
|
+
/** 组装 Claude Code 项目的 `.mcp.json` 内容。 */
|
|
7
|
+
export declare function buildClaudeMcpConfig(selectedMcps: McpId[]): string;
|
|
8
|
+
/** 从已有配置中解析出已经声明过的 MCP server ID。 */
|
|
9
|
+
export declare function parseConfiguredMcpIds(tool: ToolId, content: string): Set<string>;
|
|
10
|
+
/** 仅把缺失的 MCP 片段追加进去,已存在的 server 不覆盖。 */
|
|
11
|
+
export declare function mergeMcpConfig(tool: ToolId, existingContent: string, selectedMcps: McpId[]): string;
|
|
12
|
+
//# sourceMappingURL=mcp-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../src/core/mcp-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAUhD,4BAA4B;AAC5B,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAIhE;AAED,qCAAqC;AACrC,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,MAAM,CAQjE;AAED,yCAAyC;AACzC,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,MAAM,CASlE;AAED,qCAAqC;AACrC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAShF;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,KAAK,EAAE,GACpB,MAAM,CAsBR"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
const projectRoot = path.resolve(currentDir, '..', '..');
|
|
6
|
+
/** 从模板目录读取单个 MCP 片段。 */
|
|
7
|
+
function loadTemplate(relativePath) {
|
|
8
|
+
return readFileSync(path.join(projectRoot, 'templates', relativePath), 'utf8');
|
|
9
|
+
}
|
|
10
|
+
/** 获取某个 MCP 在指定工具下的模板片段。 */
|
|
11
|
+
export function getMcpSnippet(tool, mcpId) {
|
|
12
|
+
return tool === 'codex'
|
|
13
|
+
? loadTemplate(path.join('mcp', mcpId, 'codex', 'config.toml'))
|
|
14
|
+
: loadTemplate(path.join('mcp', mcpId, 'claude-code', 'server.json'));
|
|
15
|
+
}
|
|
16
|
+
/** 组装 Codex 项目的 `config.toml` 片段。 */
|
|
17
|
+
export function buildCodexMcpConfig(selectedMcps) {
|
|
18
|
+
const lines = ['# Managed by SDT DevAgent'];
|
|
19
|
+
for (const mcpId of selectedMcps) {
|
|
20
|
+
lines.push('', getMcpSnippet('codex', mcpId).trimEnd());
|
|
21
|
+
}
|
|
22
|
+
return `${lines.join('\n')}\n`;
|
|
23
|
+
}
|
|
24
|
+
/** 组装 Claude Code 项目的 `.mcp.json` 内容。 */
|
|
25
|
+
export function buildClaudeMcpConfig(selectedMcps) {
|
|
26
|
+
const mcpServers = {};
|
|
27
|
+
for (const mcpId of selectedMcps) {
|
|
28
|
+
const parsed = JSON.parse(getMcpSnippet('claude-code', mcpId));
|
|
29
|
+
Object.assign(mcpServers, parsed);
|
|
30
|
+
}
|
|
31
|
+
return `${JSON.stringify({ mcpServers }, null, 2)}\n`;
|
|
32
|
+
}
|
|
33
|
+
/** 从已有配置中解析出已经声明过的 MCP server ID。 */
|
|
34
|
+
export function parseConfiguredMcpIds(tool, content) {
|
|
35
|
+
if (tool === 'codex') {
|
|
36
|
+
return new Set([...content.matchAll(/^\[mcp_servers\.([A-Za-z0-9_-]+)\]$/gm)].map((match) => match[1]));
|
|
37
|
+
}
|
|
38
|
+
const parsed = JSON.parse(content);
|
|
39
|
+
return new Set(Object.keys(parsed.mcpServers ?? {}));
|
|
40
|
+
}
|
|
41
|
+
/** 仅把缺失的 MCP 片段追加进去,已存在的 server 不覆盖。 */
|
|
42
|
+
export function mergeMcpConfig(tool, existingContent, selectedMcps) {
|
|
43
|
+
const existingServers = parseConfiguredMcpIds(tool, existingContent);
|
|
44
|
+
const missingMcps = selectedMcps.filter((mcpId) => !existingServers.has(mcpId));
|
|
45
|
+
if (missingMcps.length === 0) {
|
|
46
|
+
return existingContent.endsWith('\n') ? existingContent : `${existingContent}\n`;
|
|
47
|
+
}
|
|
48
|
+
if (tool === 'codex') {
|
|
49
|
+
const additions = missingMcps.map((mcpId) => getMcpSnippet(tool, mcpId).trim());
|
|
50
|
+
const base = existingContent.trimEnd();
|
|
51
|
+
return `${base}\n\n${additions.join('\n\n')}\n`;
|
|
52
|
+
}
|
|
53
|
+
const parsed = JSON.parse(existingContent);
|
|
54
|
+
const mergedServers = { ...(parsed.mcpServers ?? {}) };
|
|
55
|
+
for (const mcpId of missingMcps) {
|
|
56
|
+
Object.assign(mergedServers, JSON.parse(getMcpSnippet(tool, mcpId)));
|
|
57
|
+
}
|
|
58
|
+
return `${JSON.stringify({ ...parsed, mcpServers: mergedServers }, null, 2)}\n`;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=mcp-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/core/mcp-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAIxC,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,4BAA4B;AAC5B,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,KAAY;IACtD,OAAO,IAAI,KAAK,OAAO;QACrB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QAC/D,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAA;AACzE,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,mBAAmB,CAAC,YAAqB;IACvD,MAAM,KAAK,GAAG,CAAC,2BAA2B,CAAC,CAAA;IAE3C,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;IACzD,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;AAChC,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,oBAAoB,CAAC,YAAqB;IACxD,MAAM,UAAU,GAA4B,EAAE,CAAA;IAE9C,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,CAAC,CAA4B,CAAA;QACzF,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;AACvD,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,OAAe;IACjE,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,GAAG,CACZ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACxF,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA6C,CAAA;IAC9E,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAA;AACtD,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,eAAuB,EACvB,YAAqB;IAErB,MAAM,eAAe,GAAG,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;IACpE,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;IAE/E,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,IAAI,CAAA;IAClF,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAC/E,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,CAAA;QACtC,OAAO,GAAG,IAAI,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;IACjD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAA6C,CAAA;IACtF,MAAM,aAAa,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAA;IAEtD,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAA4B,CAAC,CAAA;IACjG,CAAC;IAED,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;AACjF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-inspector.d.ts","sourceRoot":"","sources":["../../src/core/project-inspector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"project-inspector.d.ts","sourceRoot":"","sources":["../../src/core/project-inspector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAqD/C,uCAAuC;AACvC,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAa9E"}
|