@shendu-sdt/sdt-dev-agent 0.1.1 → 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 (101) hide show
  1. package/README.md +85 -31
  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 -34
  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/searchable-multi-select.js +5 -6
  75. package/dist/utils/searchable-multi-select.js.map +1 -1
  76. package/dist/utils/styled-select.d.ts.map +1 -1
  77. package/dist/utils/styled-select.js.map +1 -1
  78. package/dist/utils/terminal-theme.d.ts +4 -0
  79. package/dist/utils/terminal-theme.d.ts.map +1 -0
  80. package/dist/utils/terminal-theme.js +25 -0
  81. package/dist/utils/terminal-theme.js.map +1 -0
  82. package/package.json +6 -3
  83. package/templates/bootstrap/project-entry.md +17 -0
  84. package/templates/mcp/context7/claude-code/server.json +6 -0
  85. package/templates/mcp/context7/codex/config.toml +3 -0
  86. package/templates/mcp/mastergo/claude-code/server.json +6 -0
  87. package/templates/mcp/mastergo/codex/config.toml +4 -0
  88. package/templates/skills/builtin/bootstrap-project-docs/SKILL.md +16 -0
  89. package/templates/skills/builtin/bootstrap-project-docs/references/architecture-first.md +7 -0
  90. package/templates/skills/builtin/bootstrap-project-docs/references/tool-rules-follow-up.md +8 -0
  91. package/templates/skills/remote/catalog.json +68 -0
  92. package/templates/workflows/openspec/README.md +7 -0
  93. package/templates/workflows/openspec/claude-code/README.md +7 -0
  94. package/templates/workflows/openspec/codex/README.md +7 -0
  95. package/templates/AGENTS.md +0 -24
  96. package/templates/ARCHITECTURE.md +0 -26
  97. package/templates/capabilities/mcp/README.md +0 -8
  98. package/templates/capabilities/skills/README.md +0 -8
  99. package/templates/docs/ai-collaboration/README.md +0 -16
  100. package/templates/tools/claude-code/README.md +0 -8
  101. package/templates/tools/codex/README.md +0 -8
@@ -1,8 +1,10 @@
1
- import { CAPABILITIES, INSTALL_MODES, SUPPORTED_TOOLS } from '../types.js';
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
- function normalizeCapabilities(installMode, capabilities) {
22
+ /** 推荐安装时忽略用户传入 skill 列表,直接回到默认集合。 */
23
+ function normalizeSkills(installMode, skills) {
21
24
  if (installMode === 'recommended') {
22
- return [...CAPABILITIES];
25
+ return [...DEFAULT_SKILL_IDS];
23
26
  }
24
- if (installMode === 'minimal') {
25
- return ['base-assets'];
27
+ return skills;
28
+ }
29
+ /** 推荐安装时忽略用户传入 MCP 列表,直接回到默认集合。 */
30
+ function normalizeMcps(installMode, mcps) {
31
+ if (installMode === 'recommended') {
32
+ return [...DEFAULT_MCP_IDS];
26
33
  }
27
- return capabilities;
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: '安装基础协作资产、内置 Skills、内置 MCP',
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
- async function promptCapabilities(allowBack = false) {
66
+ /** 自定义安装时选择远端 skills;bootstrap skill 不在这里暴露。 */
67
+ async function promptSkills(allowBack = false) {
63
68
  return searchableMultiSelect({
64
- message: 'Select capability packs to install (3 available)',
69
+ message: '选择要安装的 skills(bootstrap skill 会强制安装)',
65
70
  allowBack,
66
- choices: [
67
- { name: '基础协作资产', value: 'base-assets' },
68
- { name: '内置 Skills', value: 'skills' },
69
- { name: '内置 MCP', value: 'mcp' },
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 capabilities = parseList(options.capabilities, CAPABILITIES);
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
- capabilities: normalizeCapabilities(installMode ?? 'recommended', capabilities),
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
- capabilities: normalizeCapabilities(installMode, capabilities),
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 --capabilities or use --yes.');
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 selectedCapabilities = capabilities.length > 0 ? capabilities : undefined;
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' && !selectedCapabilities) {
126
- const capabilitiesResult = await promptCapabilities(history.length > 0);
127
- if (capabilitiesResult === GO_BACK) {
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
- selectedCapabilities = capabilitiesResult;
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
- capabilities: normalizeCapabilities(selectedInstallMode, selectedCapabilities ?? []),
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":"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"}
1
+ {"version":3,"file":"init-options.js","sourceRoot":"","sources":["../../src/core/init-options.ts"],"names":[],"mappings":"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"}
@@ -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":"AAIA,OAAO,KAAK,EAEV,QAAQ,EACR,cAAc,EAGd,YAAY,EAEb,MAAM,aAAa,CAAA;AAwHpB,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,GAAG,QAAQ,CAqBxF"}
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"}
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAWxC,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,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,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;AAChD,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAmB,EACnB,UAA0B;IAE1B,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,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;KACjD,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CACpB,KAAoB,EACpB,KAAmB,EACnB,UAA0B;IAE1B,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IACpD,KAAK,CAAC,IAAI,CACR;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC1D,IAAI,EAAE,eAAe;KACtB,EACD;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAChE,IAAI,EAAE,eAAe;KACtB,EACD;QACE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,WAAW,CAAC;QACxD,OAAO,EAAE,cAAc,CACrB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,WAAW,CAAC,CAAC,EAChE,MAAM,CACP;QACD,IAAI,EAAE,eAAe;KACtB,CACF,CAAA;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAoB,EAAE,KAAe;IACzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;YAC3C,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAC5D,IAAI,EAAE,kBAAkB;SACzB,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAoB,EACpB,KAAe,EACf,YAA4B;IAE5B,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;QACtC,IAAI,UAAU,KAAK,aAAa,EAAE,CAAC;YACjC,SAAQ;QACV,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC;gBACvD,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;gBACzE,IAAI,EAAE,kBAAkB;aACzB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,KAAmB,EACnB,UAA0B,EAC1B,KAAoB;IAEpB,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;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,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,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,MAAM,UAAU,cAAc,CAAC,KAAmB,EAAE,UAA0B;IAC5E,MAAM,KAAK,GAAkB,EAAE,CAAA;IAE/B,IAAI,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACpD,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;IACzC,CAAC;IAED,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IACrC,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,YAAY,CAAC,CAAA;IAEpE,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAA;IACxD,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,QAAQ;KACT,CAAA;AACH,CAAC"}
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"}