@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.
Files changed (97) hide show
  1. package/README.md +70 -14
  2. package/dist/catalog.d.ts +16 -0
  3. package/dist/catalog.d.ts.map +1 -0
  4. package/dist/catalog.js +98 -0
  5. package/dist/catalog.js.map +1 -0
  6. package/dist/cli/index.js +72 -3
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/commands/add.d.ts +7 -0
  9. package/dist/commands/add.d.ts.map +1 -0
  10. package/dist/commands/add.js +267 -0
  11. package/dist/commands/add.js.map +1 -0
  12. package/dist/commands/init.d.ts.map +1 -1
  13. package/dist/commands/init.js +31 -5
  14. package/dist/commands/init.js.map +1 -1
  15. package/dist/commands/list.d.ts +4 -0
  16. package/dist/commands/list.d.ts.map +1 -0
  17. package/dist/commands/list.js +20 -0
  18. package/dist/commands/list.js.map +1 -0
  19. package/dist/commands/status.d.ts +2 -0
  20. package/dist/commands/status.d.ts.map +1 -0
  21. package/dist/commands/status.js +66 -0
  22. package/dist/commands/status.js.map +1 -0
  23. package/dist/core/capability-discovery.d.ts +23 -0
  24. package/dist/core/capability-discovery.d.ts.map +1 -0
  25. package/dist/core/capability-discovery.js +49 -0
  26. package/dist/core/capability-discovery.js.map +1 -0
  27. package/dist/core/init-options.d.ts +7 -1
  28. package/dist/core/init-options.d.ts.map +1 -1
  29. package/dist/core/init-options.js +64 -35
  30. package/dist/core/init-options.js.map +1 -1
  31. package/dist/core/init-plan.d.ts +25 -1
  32. package/dist/core/init-plan.d.ts.map +1 -1
  33. package/dist/core/init-plan.js +211 -37
  34. package/dist/core/init-plan.js.map +1 -1
  35. package/dist/core/init-writer.d.ts +17 -1
  36. package/dist/core/init-writer.d.ts.map +1 -1
  37. package/dist/core/init-writer.js +72 -19
  38. package/dist/core/init-writer.js.map +1 -1
  39. package/dist/core/manifest.d.ts +8 -0
  40. package/dist/core/manifest.d.ts.map +1 -0
  41. package/dist/core/manifest.js +16 -0
  42. package/dist/core/manifest.js.map +1 -0
  43. package/dist/core/mcp-config.d.ts +12 -0
  44. package/dist/core/mcp-config.d.ts.map +1 -0
  45. package/dist/core/mcp-config.js +60 -0
  46. package/dist/core/mcp-config.js.map +1 -0
  47. package/dist/core/project-inspector.d.ts +1 -0
  48. package/dist/core/project-inspector.d.ts.map +1 -1
  49. package/dist/core/project-inspector.js +4 -0
  50. package/dist/core/project-inspector.js.map +1 -1
  51. package/dist/core/remote-skill-installer.d.ts +16 -0
  52. package/dist/core/remote-skill-installer.d.ts.map +1 -0
  53. package/dist/core/remote-skill-installer.js +104 -0
  54. package/dist/core/remote-skill-installer.js.map +1 -0
  55. package/dist/core/workflow-installer.d.ts +22 -0
  56. package/dist/core/workflow-installer.d.ts.map +1 -0
  57. package/dist/core/workflow-installer.js +103 -0
  58. package/dist/core/workflow-installer.js.map +1 -0
  59. package/dist/types.d.ts +103 -6
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/types.js +10 -2
  62. package/dist/types.js.map +1 -1
  63. package/dist/utils/follow-up-notice.d.ts +7 -0
  64. package/dist/utils/follow-up-notice.d.ts.map +1 -0
  65. package/dist/utils/follow-up-notice.js +29 -0
  66. package/dist/utils/follow-up-notice.js.map +1 -0
  67. package/dist/utils/init-welcome.d.ts.map +1 -1
  68. package/dist/utils/init-welcome.js +20 -33
  69. package/dist/utils/init-welcome.js.map +1 -1
  70. package/dist/utils/mastergo-notice.d.ts +7 -0
  71. package/dist/utils/mastergo-notice.d.ts.map +1 -0
  72. package/dist/utils/mastergo-notice.js +14 -0
  73. package/dist/utils/mastergo-notice.js.map +1 -0
  74. package/dist/utils/terminal-theme.d.ts +4 -0
  75. package/dist/utils/terminal-theme.d.ts.map +1 -0
  76. package/dist/utils/terminal-theme.js +25 -0
  77. package/dist/utils/terminal-theme.js.map +1 -0
  78. package/package.json +6 -3
  79. package/templates/bootstrap/project-entry.md +17 -0
  80. package/templates/mcp/context7/claude-code/server.json +6 -0
  81. package/templates/mcp/context7/codex/config.toml +3 -0
  82. package/templates/mcp/mastergo/claude-code/server.json +6 -0
  83. package/templates/mcp/mastergo/codex/config.toml +4 -0
  84. package/templates/skills/builtin/bootstrap-project-docs/SKILL.md +16 -0
  85. package/templates/skills/builtin/bootstrap-project-docs/references/architecture-first.md +7 -0
  86. package/templates/skills/builtin/bootstrap-project-docs/references/tool-rules-follow-up.md +8 -0
  87. package/templates/skills/remote/catalog.json +68 -0
  88. package/templates/workflows/openspec/README.md +7 -0
  89. package/templates/workflows/openspec/claude-code/README.md +7 -0
  90. package/templates/workflows/openspec/codex/README.md +7 -0
  91. package/templates/AGENTS.md +0 -24
  92. package/templates/ARCHITECTURE.md +0 -26
  93. package/templates/capabilities/mcp/README.md +0 -8
  94. package/templates/capabilities/skills/README.md +0 -8
  95. package/templates/docs/ai-collaboration/README.md +0 -16
  96. package/templates/tools/claude-code/README.md +0 -8
  97. package/templates/tools/codex/README.md +0 -8
@@ -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
- function toolDir(tool) {
11
- return tool === 'codex' ? '.codex' : '.claude';
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
- function baseTemplateValues(facts, selections) {
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
- capabilities: selections.capabilities.join(', '),
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
- function addBaseAssets(files, facts, selections) {
25
- const values = baseTemplateValues(facts, selections);
118
+ /** 生成目标项目的 bootstrap 入口文档。 */
119
+ function addProjectEntry(files, facts, selections) {
26
120
  files.push({
27
- path: 'AGENTS.md',
28
- content: renderTemplate(loadTemplate('AGENTS.md'), values),
29
- kind: 'project-asset',
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
- function addToolFiles(files, tools) {
41
- for (const tool of tools) {
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(toolDir(tool), 'README.md'),
44
- content: loadTemplate(path.join('tools', tool, 'README.md')),
45
- kind: 'tool-integration',
138
+ path: path.join(targetRoot, relativeFile),
139
+ content: renderTemplate(loadTemplate(templateFile), values),
140
+ kind: 'bootstrap',
46
141
  });
47
142
  }
48
143
  }
49
- function addCapabilityFiles(files, tools, capabilities) {
50
- for (const capability of capabilities) {
51
- if (capability === 'base-assets') {
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
- files.push({
56
- path: path.join(toolDir(tool), capability, 'README.md'),
57
- content: loadTemplate(path.join('capabilities', capability, 'README.md')),
58
- kind: 'tool-integration',
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
- function buildManifest(facts, selections, files) {
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
- capabilities: selections.capabilities,
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
- if (selections.capabilities.includes('base-assets')) {
93
- addBaseAssets(files, facts, selections);
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
- addToolFiles(files, selections.tools);
96
- addCapabilityFiles(files, selections.tools, selections.capabilities);
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":"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"}
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
- export declare function applyInitPlan(targetPath: string, plan: InitPlan): Promise<WriteResult>;
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":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAeD,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAmB5F"}
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"}
@@ -1,28 +1,81 @@
1
1
  import path from 'node:path';
2
- import { exists, toPosixPath, writeText } from '../utils/fs.js';
3
- async function collectConflicts(targetPath, plan) {
4
- const conflicts = [];
5
- for (const file of plan.files) {
6
- const absolutePath = path.join(targetPath, file.path);
7
- if (await exists(absolutePath)) {
8
- conflicts.push(file.path);
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
- return { writtenFiles };
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;AAO/D,KAAK,UAAU,gBAAgB,CAAC,UAAkB,EAAE,IAAc;IAChE,MAAM,SAAS,GAAa,EAAE,CAAA;IAE9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QACrD,IAAI,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB,EAAE,IAAc;IACpE,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IAC1D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,iEAAiE,SAAS;aACvE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;aAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAA;IACH,CAAC;IAED,MAAM,YAAY,GAAa,EAAE,CAAA;IAEjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QACrD,MAAM,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAC3C,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3C,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,CAAA;AACzB,CAAC"}
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":"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"}
@@ -1,3 +1,4 @@
1
1
  import type { ProjectFacts } from '../types.js';
2
+ /** `init` 当前只关注最小项目事实,不做框架和业务层深入探测。 */
2
3
  export declare function inspectProject(targetPath: string): Promise<ProjectFacts>;
3
4
  //# sourceMappingURL=project-inspector.d.ts.map
@@ -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;AAkD/C,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAa9E"}
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"}