@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,5 +1,6 @@
1
1
  import path from 'node:path';
2
2
  import { exists, readText } from '../utils/fs.js';
3
+ /** 通过常见 lockfile 推断项目包管理器。 */
3
4
  async function detectPackageManager(targetPath) {
4
5
  const checks = [
5
6
  ['pnpm-lock.yaml', 'pnpm'],
@@ -14,6 +15,7 @@ async function detectPackageManager(targetPath) {
14
15
  }
15
16
  return 'unknown';
16
17
  }
18
+ /** 读取项目名;没有 `package.json` 时回退到目录名。 */
17
19
  async function detectProjectName(targetPath) {
18
20
  const packageJsonPath = path.join(targetPath, 'package.json');
19
21
  if (!(await exists(packageJsonPath))) {
@@ -29,6 +31,7 @@ async function detectProjectName(targetPath) {
29
31
  hasPackageJson: true,
30
32
  };
31
33
  }
34
+ /** 在一组候选目录里找第一个存在的目录作为事实值。 */
32
35
  async function detectDirectory(targetPath, candidates) {
33
36
  for (const candidate of candidates) {
34
37
  if (await exists(path.join(targetPath, candidate))) {
@@ -37,6 +40,7 @@ async function detectDirectory(targetPath, candidates) {
37
40
  }
38
41
  return 'N/A';
39
42
  }
43
+ /** `init` 当前只关注最小项目事实,不做框架和业务层深入探测。 */
40
44
  export async function inspectProject(targetPath) {
41
45
  const project = await detectProjectName(targetPath);
42
46
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"project-inspector.js","sourceRoot":"","sources":["../../src/core/project-inspector.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAGjD,KAAK,UAAU,oBAAoB,CAAC,UAAkB;IACpD,MAAM,MAAM,GAA4B;QACtC,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAC1B,CAAC,mBAAmB,EAAE,KAAK,CAAC;QAC5B,CAAC,WAAW,EAAE,MAAM,CAAC;QACrB,CAAC,WAAW,EAAE,KAAK,CAAC;KACrB,CAAA;IAED,KAAK,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,MAAM,EAAE,CAAC;QAChD,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;YAClD,OAAO,cAAc,CAAA;QACvB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,UAAkB;IAIjD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;IAC7D,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YACtC,cAAc,EAAE,KAAK;SACtB,CAAA;IACH,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,CAAA;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAA;IAExD,OAAO;QACL,WAAW,EAAE,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC1D,cAAc,EAAE,IAAI;KACrB,CAAA;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,UAAoB;IACrE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YACnD,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAA;IAEnD,OAAO;QACL,UAAU;QACV,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,cAAc,EAAE,MAAM,oBAAoB,CAAC,UAAU,CAAC;QACtD,UAAU,EAAE,MAAM,eAAe,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QACzE,QAAQ,EAAE,MAAM,eAAe,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC3E,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,SAAS,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC3D,UAAU,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;KACxD,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"project-inspector.js","sourceRoot":"","sources":["../../src/core/project-inspector.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAGjD,8BAA8B;AAC9B,KAAK,UAAU,oBAAoB,CAAC,UAAkB;IACpD,MAAM,MAAM,GAA4B;QACtC,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAC1B,CAAC,mBAAmB,EAAE,KAAK,CAAC;QAC5B,CAAC,WAAW,EAAE,MAAM,CAAC;QACrB,CAAC,WAAW,EAAE,KAAK,CAAC;KACrB,CAAA;IAED,KAAK,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,MAAM,EAAE,CAAC;QAChD,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;YAClD,OAAO,cAAc,CAAA;QACvB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,uCAAuC;AACvC,KAAK,UAAU,iBAAiB,CAAC,UAAkB;IAIjD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;IAC7D,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YACtC,cAAc,EAAE,KAAK;SACtB,CAAA;IACH,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,CAAA;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAA;IAExD,OAAO;QACL,WAAW,EAAE,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC1D,cAAc,EAAE,IAAI;KACrB,CAAA;AACH,CAAC;AAED,8BAA8B;AAC9B,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,UAAoB;IACrE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YACnD,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,uCAAuC;AACvC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAA;IAEnD,OAAO;QACL,UAAU;QACV,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,cAAc,EAAE,MAAM,oBAAoB,CAAC,UAAU,CAAC;QACtD,UAAU,EAAE,MAAM,eAAe,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QACzE,QAAQ,EAAE,MAAM,eAAe,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC3E,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,SAAS,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC3D,UAAU,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;KACxD,CAAA;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { PlannedRemoteSkillInstall } from '../types.js';
2
+ /** 单次远端 skill 安装后的结果摘要。 */
3
+ export interface RemoteSkillInstallResult {
4
+ tool: PlannedRemoteSkillInstall['tool'];
5
+ skillId: PlannedRemoteSkillInstall['skillId'];
6
+ targetPaths: string[];
7
+ installCommand: string;
8
+ success: boolean;
9
+ error?: string;
10
+ }
11
+ /**
12
+ * 执行远端 skill 安装。
13
+ * 成功标准不是退出码,而是安装后项目级目标路径已经真实出现。
14
+ */
15
+ export declare function installRemoteSkill(projectRoot: string, install: PlannedRemoteSkillInstall): Promise<RemoteSkillInstallResult>;
16
+ //# sourceMappingURL=remote-skill-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-skill-installer.d.ts","sourceRoot":"","sources":["../../src/core/remote-skill-installer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAE5D,2BAA2B;AAC3B,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAA;IACvC,OAAO,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAA;IAC7C,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAoDD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CAwEnC"}
@@ -0,0 +1,104 @@
1
+ import { spawn } from 'node:child_process';
2
+ import path from 'node:path';
3
+ import { hasProjectSkillInstall } from './capability-discovery.js';
4
+ /** 最小的子进程执行包装;统一收集 stdout/stderr 作为错误上下文。 */
5
+ function runCommand(command, args, env, cwd) {
6
+ return new Promise((resolve) => {
7
+ const child = spawn(command, args, {
8
+ cwd,
9
+ env,
10
+ stdio: ['ignore', 'pipe', 'pipe'],
11
+ shell: process.platform === 'win32',
12
+ });
13
+ let stdout = '';
14
+ let stderr = '';
15
+ child.stdout?.setEncoding('utf8');
16
+ child.stderr?.setEncoding('utf8');
17
+ child.stdout?.on('data', (chunk) => {
18
+ stdout += chunk;
19
+ });
20
+ child.stderr?.on('data', (chunk) => {
21
+ stderr += chunk;
22
+ });
23
+ child.on('error', (error) => {
24
+ resolve({
25
+ success: false,
26
+ error: error.message,
27
+ });
28
+ });
29
+ child.on('close', (code, signal) => {
30
+ const output = [stdout.trim(), stderr.trim()].filter(Boolean).join('\n');
31
+ if (code === 0) {
32
+ resolve({ success: true, output });
33
+ return;
34
+ }
35
+ resolve({
36
+ success: false,
37
+ error: output || `Command failed with ${signal ? `signal ${signal}` : `exit code ${code}`}`,
38
+ });
39
+ });
40
+ });
41
+ }
42
+ /**
43
+ * 执行远端 skill 安装。
44
+ * 成功标准不是退出码,而是安装后项目级目标路径已经真实出现。
45
+ */
46
+ export async function installRemoteSkill(projectRoot, install) {
47
+ const stubPath = process.env.SDT_DEV_AGENT_SKILLS_STUB_PATH;
48
+ const targetPaths = install.installTargets.map((target) => target.targetPath);
49
+ let execution;
50
+ if (stubPath) {
51
+ // 测试环境通过 stub 精确控制安装结果,避免真实依赖网络和外部 CLI。
52
+ for (const target of install.installTargets) {
53
+ execution = await runCommand(process.execPath, [stubPath, target.skillName, install.tool, path.join(projectRoot, target.targetPath)], process.env, projectRoot);
54
+ if (!execution.success) {
55
+ return {
56
+ tool: install.tool,
57
+ skillId: install.skillId,
58
+ targetPaths,
59
+ installCommand: install.installCommand,
60
+ success: false,
61
+ error: execution.error,
62
+ };
63
+ }
64
+ }
65
+ execution = { success: true, output: '' };
66
+ }
67
+ else {
68
+ // 正常链路复用 skills CLI,把能力直接 copy 到项目级目录。
69
+ const skillNames = install.installTargets.map((target) => target.skillName);
70
+ execution = await runCommand('npx', [
71
+ '-y',
72
+ 'skills',
73
+ 'add',
74
+ install.source,
75
+ '--yes',
76
+ '--skill',
77
+ ...skillNames,
78
+ '--copy',
79
+ '-a',
80
+ install.tool,
81
+ ], process.env, projectRoot);
82
+ }
83
+ if (execution.success && !hasProjectSkillInstall(projectRoot, install.tool, install.skillId)) {
84
+ const expectedPaths = targetPaths.join(', ');
85
+ const detail = execution.output ? `\nCommand output:\n${execution.output}` : '';
86
+ return {
87
+ tool: install.tool,
88
+ skillId: install.skillId,
89
+ targetPaths,
90
+ installCommand: install.installCommand,
91
+ success: false,
92
+ error: `Command exited successfully but the expected project skill paths were not written: ${expectedPaths}.${detail}`,
93
+ };
94
+ }
95
+ return {
96
+ tool: install.tool,
97
+ skillId: install.skillId,
98
+ targetPaths,
99
+ installCommand: install.installCommand,
100
+ success: execution.success,
101
+ error: execution.success ? undefined : execution.error,
102
+ };
103
+ }
104
+ //# sourceMappingURL=remote-skill-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-skill-installer.js","sourceRoot":"","sources":["../../src/core/remote-skill-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ToolId, WorkflowId } from '../types.js';
2
+ /** `add workflow` 传给安装器的最小输入。 */
3
+ export interface PlannedWorkflowInstall {
4
+ tool: ToolId;
5
+ workflowId: WorkflowId;
6
+ installCommand: string;
7
+ }
8
+ /** 单次 workflow 安装后的结果摘要。 */
9
+ export interface WorkflowInstallResult {
10
+ tool: ToolId;
11
+ workflowId: WorkflowId;
12
+ targetPaths: string[];
13
+ installCommand: string;
14
+ success: boolean;
15
+ error?: string;
16
+ }
17
+ /**
18
+ * 执行 workflow 安装。
19
+ * 当前策略是优先走本机命令,失败时再回退到官方 `npx` 入口。
20
+ */
21
+ export declare function installWorkflow(projectRoot: string, install: PlannedWorkflowInstall): Promise<WorkflowInstallResult>;
22
+ //# sourceMappingURL=workflow-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-installer.d.ts","sourceRoot":"","sources":["../../src/core/workflow-installer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAErD,iCAAiC;AACjC,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,UAAU,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,4BAA4B;AAC5B,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,UAAU,CAAA;IACtB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAyDD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CAyEhC"}
@@ -0,0 +1,103 @@
1
+ import { spawn } from 'node:child_process';
2
+ import path from 'node:path';
3
+ import { hasProjectWorkflowInstall } from './capability-discovery.js';
4
+ import { getWorkflowTargetPaths } from './init-plan.js';
5
+ /** 最小的子进程执行包装;统一收集 stdout/stderr 作为错误上下文。 */
6
+ function runCommand(command, args, env, cwd) {
7
+ return new Promise((resolve) => {
8
+ const child = spawn(command, args, {
9
+ cwd,
10
+ env,
11
+ stdio: ['ignore', 'pipe', 'pipe'],
12
+ shell: process.platform === 'win32',
13
+ });
14
+ let stdout = '';
15
+ let stderr = '';
16
+ child.stdout?.setEncoding('utf8');
17
+ child.stderr?.setEncoding('utf8');
18
+ child.stdout?.on('data', (chunk) => {
19
+ stdout += chunk;
20
+ });
21
+ child.stderr?.on('data', (chunk) => {
22
+ stderr += chunk;
23
+ });
24
+ child.on('error', (error) => {
25
+ resolve({
26
+ success: false,
27
+ error: error.message,
28
+ });
29
+ });
30
+ child.on('close', (code, signal) => {
31
+ const output = [stdout.trim(), stderr.trim()].filter(Boolean).join('\n');
32
+ if (code === 0) {
33
+ resolve({ success: true, output });
34
+ return;
35
+ }
36
+ resolve({
37
+ success: false,
38
+ error: output || `Command failed with ${signal ? `signal ${signal}` : `exit code ${code}`}`,
39
+ });
40
+ });
41
+ });
42
+ }
43
+ /** `OpenSpec` CLI 使用的工具名与本仓库内部枚举不同。 */
44
+ function mapOpenSpecToolId(tool) {
45
+ return tool === 'claude-code' ? 'claude' : 'codex';
46
+ }
47
+ /**
48
+ * 执行 workflow 安装。
49
+ * 当前策略是优先走本机命令,失败时再回退到官方 `npx` 入口。
50
+ */
51
+ export async function installWorkflow(projectRoot, install) {
52
+ const stubPath = process.env.SDT_DEV_AGENT_WORKFLOWS_STUB_PATH;
53
+ const targetPaths = getWorkflowTargetPaths(install.tool, install.workflowId);
54
+ let execution;
55
+ if (stubPath) {
56
+ // 测试环境直接走 stub,避免依赖真实 OpenSpec CLI。
57
+ execution = await runCommand(process.execPath, [
58
+ stubPath,
59
+ install.workflowId,
60
+ install.tool,
61
+ ...targetPaths.map((targetPath) => path.join(projectRoot, targetPath)),
62
+ ], process.env, projectRoot);
63
+ }
64
+ else {
65
+ // 优先复用用户本机已安装的 openspec,失败时再回退到 npx。
66
+ const toolArg = mapOpenSpecToolId(install.tool);
67
+ execution = await runCommand('openspec', ['init', '--tools', toolArg, '--profile', 'core', projectRoot], process.env, projectRoot);
68
+ if (!execution.success) {
69
+ execution = await runCommand('npx', [
70
+ '-y',
71
+ '@fission-ai/openspec@latest',
72
+ 'init',
73
+ '--tools',
74
+ toolArg,
75
+ '--profile',
76
+ 'core',
77
+ projectRoot,
78
+ ], process.env, projectRoot);
79
+ }
80
+ }
81
+ if (execution.success &&
82
+ !hasProjectWorkflowInstall(projectRoot, install.tool, install.workflowId)) {
83
+ const expectedPaths = targetPaths.join(', ');
84
+ const detail = 'output' in execution && execution.output ? `\nCommand output:\n${execution.output}` : '';
85
+ return {
86
+ tool: install.tool,
87
+ workflowId: install.workflowId,
88
+ targetPaths,
89
+ installCommand: install.installCommand,
90
+ success: false,
91
+ error: `Command exited successfully but the expected project workflow paths were not written: ${expectedPaths}.${detail}`,
92
+ };
93
+ }
94
+ return {
95
+ tool: install.tool,
96
+ workflowId: install.workflowId,
97
+ targetPaths,
98
+ installCommand: install.installCommand,
99
+ success: execution.success,
100
+ error: execution.success ? undefined : execution.error,
101
+ };
102
+ }
103
+ //# sourceMappingURL=workflow-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-installer.js","sourceRoot":"","sources":["../../src/core/workflow-installer.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,13 +1,69 @@
1
+ /** CLI 和 manifest 共用的基础枚举。 */
1
2
  export declare const SUPPORTED_TOOLS: readonly ["codex", "claude-code"];
2
- export declare const INSTALL_MODES: readonly ["recommended", "minimal", "custom"];
3
- export declare const CAPABILITIES: readonly ["base-assets", "skills", "mcp"];
3
+ export declare const INSTALL_MODES: readonly ["recommended", "custom"];
4
+ /** capability 来源类型。 */
5
+ export declare const SKILL_SOURCE_TYPES: readonly ["builtin-local", "remote-recommended"];
6
+ export declare const MCP_SOURCE_TYPES: readonly ["project-template"];
7
+ export declare const WORKFLOW_SOURCE_TYPES: readonly ["workflow-integration"];
8
+ /** 选择态与安装状态。 */
9
+ export declare const CAPABILITY_SELECTIONS: readonly ["required", "default", "optional"];
10
+ export declare const CAPABILITY_STATUSES: readonly ["installed", "already-present", "failed"];
11
+ export declare const SKIP_REASONS: readonly ["already-present", "install-failed"];
4
12
  export type ToolId = (typeof SUPPORTED_TOOLS)[number];
5
13
  export type InstallMode = (typeof INSTALL_MODES)[number];
6
- export type CapabilityId = (typeof CAPABILITIES)[number];
14
+ export type SkillSourceType = (typeof SKILL_SOURCE_TYPES)[number];
15
+ export type McpSourceType = (typeof MCP_SOURCE_TYPES)[number];
16
+ export type WorkflowSourceType = (typeof WORKFLOW_SOURCE_TYPES)[number];
17
+ export type CapabilitySelection = (typeof CAPABILITY_SELECTIONS)[number];
18
+ export type CapabilityStatus = (typeof CAPABILITY_STATUSES)[number];
19
+ export type SkipReason = (typeof SKIP_REASONS)[number];
20
+ /** catalog 使用的稳定 capability ID。 */
21
+ export type SkillId = 'bootstrap-project-docs' | 'code-review-expert' | 'superpowers' | 'frontend-design' | 'agent-browser' | 'find-skills' | 'skill-creator';
22
+ export type McpId = 'context7' | 'mastergo';
23
+ export type WorkflowId = 'openspec';
24
+ /** catalog 记录 */
25
+ export interface CatalogSkill {
26
+ id: SkillId;
27
+ displayName: string;
28
+ description: string;
29
+ sourceType: SkillSourceType;
30
+ selection: CapabilitySelection;
31
+ detectionMode: 'single' | 'bundle';
32
+ supportedTools: ToolId[];
33
+ templateDir?: string;
34
+ remote?: {
35
+ source: string;
36
+ installCommand: string;
37
+ installTargets?: Array<{
38
+ skillName: string;
39
+ targetDirName: string;
40
+ }>;
41
+ };
42
+ }
43
+ export interface CatalogMcp {
44
+ id: McpId;
45
+ displayName: string;
46
+ description: string;
47
+ sourceType: McpSourceType;
48
+ selection: Extract<CapabilitySelection, 'default' | 'optional'>;
49
+ supportedTools: ToolId[];
50
+ templateBaseDir: string;
51
+ }
52
+ export interface CatalogWorkflow {
53
+ id: WorkflowId;
54
+ displayName: string;
55
+ description: string;
56
+ sourceType: WorkflowSourceType;
57
+ supportedTools: ToolId[];
58
+ templateBaseDir: string;
59
+ installCommand: string;
60
+ }
61
+ /** 初始化链路相关类型 */
7
62
  export interface InitSelections {
8
63
  tools: ToolId[];
9
64
  installMode: InstallMode;
10
- capabilities: CapabilityId[];
65
+ skills: SkillId[];
66
+ mcps: McpId[];
11
67
  }
12
68
  export interface ProjectFacts {
13
69
  targetPath: string;
@@ -22,18 +78,59 @@ export interface ProjectFacts {
22
78
  export interface PlannedFile {
23
79
  path: string;
24
80
  content: string;
25
- kind: 'project-asset' | 'tool-integration' | 'manifest';
81
+ kind: 'bootstrap' | 'workflow' | 'mcp' | 'manifest';
26
82
  }
27
83
  export interface InitPlan {
28
84
  files: PlannedFile[];
85
+ remoteSkillInstalls: PlannedRemoteSkillInstall[];
29
86
  manifest: InstallManifest;
30
87
  }
88
+ export interface PlannedRemoteSkillInstall {
89
+ tool: ToolId;
90
+ skillId: SkillId;
91
+ targetPath: string;
92
+ installTargets: Array<{
93
+ skillName: string;
94
+ targetPath: string;
95
+ }>;
96
+ source: string;
97
+ installCommand: string;
98
+ }
99
+ /** manifest 相关类型 */
100
+ export interface ManifestCapabilityInstall {
101
+ tool: ToolId;
102
+ status: CapabilityStatus;
103
+ path: string;
104
+ reason?: SkipReason;
105
+ source?: string;
106
+ installCommand?: string;
107
+ }
108
+ export interface ManifestSkillRecord {
109
+ id: SkillId;
110
+ selection: CapabilitySelection;
111
+ sourceType: SkillSourceType;
112
+ installs: ManifestCapabilityInstall[];
113
+ }
114
+ export interface ManifestMcpRecord {
115
+ id: McpId;
116
+ selection: Extract<CapabilitySelection, 'default' | 'optional'>;
117
+ sourceType: McpSourceType;
118
+ installs: ManifestCapabilityInstall[];
119
+ }
120
+ export interface ManifestWorkflowRecord {
121
+ id: WorkflowId;
122
+ sourceType: WorkflowSourceType;
123
+ installs: ManifestCapabilityInstall[];
124
+ }
31
125
  export interface InstallManifest {
32
126
  version: string;
33
127
  generatedAt: string;
34
128
  installMode: InstallMode;
35
129
  tools: ToolId[];
36
- capabilities: CapabilityId[];
130
+ bootstrapSkillId: SkillId;
131
+ skills: ManifestSkillRecord[];
132
+ mcps: ManifestMcpRecord[];
133
+ workflows: ManifestWorkflowRecord[];
37
134
  project: {
38
135
  path: string;
39
136
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,mCAAoC,CAAA;AAChE,eAAO,MAAM,aAAa,+CAAgD,CAAA;AAC1E,eAAO,MAAM,YAAY,2CAA4C,CAAA;AAErE,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AACrD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AACxD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,WAAW,EAAE,WAAW,CAAA;IACxB,YAAY,EAAE,YAAY,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,eAAe,GAAG,kBAAkB,GAAG,UAAU,CAAA;CACxD;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,QAAQ,EAAE,eAAe,CAAA;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,YAAY,EAAE,YAAY,EAAE,CAAA;IAC5B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,cAAc,EAAE,MAAM,CAAA;QACtB,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,cAAc,EAAE,KAAK,CAAC;QACpB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;KAC1B,CAAC,CAAA;CACH"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -1,4 +1,12 @@
1
+ /** CLI 和 manifest 共用的基础枚举。 */
1
2
  export const SUPPORTED_TOOLS = ['codex', 'claude-code'];
2
- export const INSTALL_MODES = ['recommended', 'minimal', 'custom'];
3
- export const CAPABILITIES = ['base-assets', 'skills', 'mcp'];
3
+ export const INSTALL_MODES = ['recommended', 'custom'];
4
+ /** capability 来源类型。 */
5
+ export const SKILL_SOURCE_TYPES = ['builtin-local', 'remote-recommended'];
6
+ export const MCP_SOURCE_TYPES = ['project-template'];
7
+ export const WORKFLOW_SOURCE_TYPES = ['workflow-integration'];
8
+ /** 选择态与安装状态。 */
9
+ export const CAPABILITY_SELECTIONS = ['required', 'default', 'optional'];
10
+ export const CAPABILITY_STATUSES = ['installed', 'already-present', 'failed'];
11
+ export const SKIP_REASONS = ['already-present', 'install-failed'];
4
12
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,aAAa,CAAU,CAAA;AAChE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAA;AAC1E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,CAAU,CAAA"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,aAAa,CAAU,CAAA;AAChE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAU,CAAA;AAE/D,uBAAuB;AACvB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,eAAe,EAAE,oBAAoB,CAAU,CAAA;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,kBAAkB,CAAU,CAAA;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,sBAAsB,CAAU,CAAA;AAEtE,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAU,CAAA;AACjF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,WAAW,EAAE,iBAAiB,EAAE,QAAQ,CAAU,CAAA;AACtF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,iBAAiB,EAAE,gBAAgB,CAAU,CAAA"}
@@ -0,0 +1,7 @@
1
+ /** 需要用户后续手动处理的提示。 */
2
+ export declare function printFollowUpNotice(title: string, lines: string[]): void;
3
+ /** 成功类提示。 */
4
+ export declare function printSuccessNotice(title: string, lines: string[]): void;
5
+ /** 失败类提示。 */
6
+ export declare function printFailureNotice(title: string, lines: string[]): void;
7
+ //# sourceMappingURL=follow-up-notice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-up-notice.d.ts","sourceRoot":"","sources":["../../src/utils/follow-up-notice.ts"],"names":[],"mappings":"AAuBA,qBAAqB;AACrB,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAExE;AAED,aAAa;AACb,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAEvE;AAED,aAAa;AACb,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAEvE"}
@@ -0,0 +1,29 @@
1
+ import { withTerminalTone } from './terminal-theme.js';
2
+ const DIVIDER = '========================================';
3
+ /** 统一的高亮提示框,用于初始化或增量安装后的补充说明。 */
4
+ function printNotice(tone, title, lines) {
5
+ const highlight = (value) => withTerminalTone(value, tone);
6
+ if (lines.length === 0) {
7
+ return;
8
+ }
9
+ console.log('');
10
+ console.log(highlight(DIVIDER));
11
+ console.log(highlight(title));
12
+ for (const line of lines) {
13
+ console.log(highlight(`- ${line}`));
14
+ }
15
+ console.log(highlight(DIVIDER));
16
+ }
17
+ /** 需要用户后续手动处理的提示。 */
18
+ export function printFollowUpNotice(title, lines) {
19
+ printNotice('follow-up', title, lines);
20
+ }
21
+ /** 成功类提示。 */
22
+ export function printSuccessNotice(title, lines) {
23
+ printNotice('success', title, lines);
24
+ }
25
+ /** 失败类提示。 */
26
+ export function printFailureNotice(title, lines) {
27
+ printNotice('failure', title, lines);
28
+ }
29
+ //# sourceMappingURL=follow-up-notice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-up-notice.js","sourceRoot":"","sources":["../../src/utils/follow-up-notice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAEtD,MAAM,OAAO,GAAG,0CAA0C,CAAA;AAI1D,iCAAiC;AACjC,SAAS,WAAW,CAAC,IAAgB,EAAE,KAAa,EAAE,KAAe;IACnE,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAE1E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACf,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IAC/B,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;AACjC,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,KAAe;IAChE,WAAW,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AACxC,CAAC;AAED,aAAa;AACb,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,KAAe;IAC/D,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AACtC,CAAC;AAED,aAAa;AACb,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,KAAe;IAC/D,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AACtC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"init-welcome.d.ts","sourceRoot":"","sources":["../../src/utils/init-welcome.ts"],"names":[],"mappings":"AAkJA,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAiBhD;AAED,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAEpD;AAmDD,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAwDD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA8DrD"}
1
+ {"version":3,"file":"init-welcome.d.ts","sourceRoot":"","sources":["../../src/utils/init-welcome.ts"],"names":[],"mappings":"AAiIA,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAkBhD;AAED,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAEpD;AAmDD,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAwDD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA8DrD"}