@shendu-sdt/sdt-dev-agent 0.1.3-beta.9 → 0.1.3

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 (102) hide show
  1. package/README.md +80 -21
  2. package/dist/catalog/index.d.ts +4 -0
  3. package/dist/catalog/index.d.ts.map +1 -0
  4. package/dist/catalog/index.js +4 -0
  5. package/dist/catalog/index.js.map +1 -0
  6. package/dist/catalog/mcp.d.ts +12 -0
  7. package/dist/catalog/mcp.d.ts.map +1 -0
  8. package/dist/catalog/mcp.js +37 -0
  9. package/dist/catalog/mcp.js.map +1 -0
  10. package/dist/catalog/shared.d.ts +5 -0
  11. package/dist/catalog/shared.d.ts.map +1 -0
  12. package/dist/catalog/shared.js +8 -0
  13. package/dist/catalog/shared.js.map +1 -0
  14. package/dist/catalog/skills.d.ts +14 -0
  15. package/dist/catalog/skills.d.ts.map +1 -0
  16. package/dist/catalog/skills.js +55 -0
  17. package/dist/catalog/skills.js.map +1 -0
  18. package/dist/catalog/workflows.d.ts +8 -0
  19. package/dist/catalog/workflows.d.ts.map +1 -0
  20. package/dist/catalog/workflows.js +24 -0
  21. package/dist/catalog/workflows.js.map +1 -0
  22. package/dist/commands/add.d.ts.map +1 -1
  23. package/dist/commands/add.js +158 -125
  24. package/dist/commands/add.js.map +1 -1
  25. package/dist/commands/init.d.ts.map +1 -1
  26. package/dist/commands/init.js +56 -7
  27. package/dist/commands/init.js.map +1 -1
  28. package/dist/commands/list.js +1 -1
  29. package/dist/commands/list.js.map +1 -1
  30. package/dist/commands/status.d.ts.map +1 -1
  31. package/dist/commands/status.js +1 -1
  32. package/dist/commands/status.js.map +1 -1
  33. package/dist/core/bootstrap-entry.d.ts +5 -0
  34. package/dist/core/bootstrap-entry.d.ts.map +1 -0
  35. package/dist/core/bootstrap-entry.js +9 -0
  36. package/dist/core/bootstrap-entry.js.map +1 -0
  37. package/dist/core/capability-discovery.js +1 -1
  38. package/dist/core/capability-discovery.js.map +1 -1
  39. package/dist/core/hook-config.d.ts +19 -0
  40. package/dist/core/hook-config.d.ts.map +1 -0
  41. package/dist/core/hook-config.js +162 -0
  42. package/dist/core/hook-config.js.map +1 -0
  43. package/dist/core/init-options.d.ts.map +1 -1
  44. package/dist/core/init-options.js +7 -5
  45. package/dist/core/init-options.js.map +1 -1
  46. package/dist/core/init-plan.d.ts +1 -1
  47. package/dist/core/init-plan.d.ts.map +1 -1
  48. package/dist/core/init-plan.js +98 -32
  49. package/dist/core/init-plan.js.map +1 -1
  50. package/dist/core/init-writer.d.ts.map +1 -1
  51. package/dist/core/init-writer.js +109 -4
  52. package/dist/core/init-writer.js.map +1 -1
  53. package/dist/core/manifest.d.ts.map +1 -1
  54. package/dist/core/manifest.js +4 -2
  55. package/dist/core/manifest.js.map +1 -1
  56. package/dist/core/mcp-config.d.ts +3 -2
  57. package/dist/core/mcp-config.d.ts.map +1 -1
  58. package/dist/core/mcp-config.js +69 -27
  59. package/dist/core/mcp-config.js.map +1 -1
  60. package/dist/core/project-inspector.d.ts.map +1 -1
  61. package/dist/core/project-inspector.js +2 -1
  62. package/dist/core/project-inspector.js.map +1 -1
  63. package/dist/core/tool-profile.d.ts +41 -0
  64. package/dist/core/tool-profile.d.ts.map +1 -0
  65. package/dist/core/tool-profile.js +122 -0
  66. package/dist/core/tool-profile.js.map +1 -0
  67. package/dist/core/workflow-installer.d.ts.map +1 -1
  68. package/dist/core/workflow-installer.js +2 -1
  69. package/dist/core/workflow-installer.js.map +1 -1
  70. package/dist/types.d.ts +19 -1
  71. package/dist/types.d.ts.map +1 -1
  72. package/dist/types.js +2 -0
  73. package/dist/types.js.map +1 -1
  74. package/dist/utils/init-welcome.d.ts +1 -0
  75. package/dist/utils/init-welcome.d.ts.map +1 -1
  76. package/dist/utils/init-welcome.js +33 -9
  77. package/dist/utils/init-welcome.js.map +1 -1
  78. package/dist/utils/json.d.ts +3 -0
  79. package/dist/utils/json.d.ts.map +1 -0
  80. package/dist/utils/json.js +11 -0
  81. package/dist/utils/json.js.map +1 -0
  82. package/dist/utils/progress-spinner.d.ts +22 -0
  83. package/dist/utils/progress-spinner.d.ts.map +1 -0
  84. package/dist/utils/progress-spinner.js +74 -0
  85. package/dist/utils/progress-spinner.js.map +1 -0
  86. package/package.json +3 -6
  87. package/templates/bootstrap/project-entry.md +16 -5
  88. package/templates/hooks/claude-code/bootstrap-project-docs-context.mjs +38 -0
  89. package/templates/hooks/claude-code/settings.json +36 -0
  90. package/templates/hooks/codex/bootstrap-project-docs-context.mjs +38 -0
  91. package/templates/hooks/codex/config.toml +16 -0
  92. package/templates/rules/claude-code/CLAUDE.md +17 -0
  93. package/templates/rules/codex/AGENTS.md +17 -0
  94. package/templates/skills/builtin/bootstrap-project-docs/SKILL.md +25 -11
  95. package/templates/skills/builtin/bootstrap-project-docs/agents/openai.yaml +4 -0
  96. package/templates/skills/builtin/bootstrap-project-docs/references/architecture-first.md +16 -4
  97. package/templates/skills/builtin/bootstrap-project-docs/references/doc-state-routing.md +28 -0
  98. package/templates/skills/builtin/bootstrap-project-docs/references/tool-rules-follow-up.md +19 -4
  99. package/dist/catalog.d.ts +0 -16
  100. package/dist/catalog.d.ts.map +0 -1
  101. package/dist/catalog.js +0 -98
  102. package/dist/catalog.js.map +0 -1
@@ -1,6 +1,9 @@
1
1
  import path from 'node:path';
2
+ import { SDT_DEV_AGENT_BOOTSTRAP_ENTRY_MARKER } from './bootstrap-entry.js';
3
+ import { mergeHookConfig } from './hook-config.js';
2
4
  import { detectSkillAvailability } from './capability-discovery.js';
3
- import { mergeMcpConfig, parseConfiguredMcpIds } from './mcp-config.js';
5
+ import { buildMcpConfig, mergeMcpConfig, parseConfiguredMcpIds } from './mcp-config.js';
6
+ import { getHookDegradeMarkerPathForTool, getProjectMcpConfigPathForTool, getProjectHookConfigPathForTool, } from './tool-profile.js';
4
7
  import { installRemoteSkill } from './remote-skill-installer.js';
5
8
  import { exists, readText, toPosixPath, writeText } from '../utils/fs.js';
6
9
  /**
@@ -16,13 +19,115 @@ export async function applyInitPlan(targetPath, plan, hooks = {}) {
16
19
  continue;
17
20
  }
18
21
  const absolutePath = path.join(targetPath, file.path);
22
+ if (file.kind === 'rule' && (await exists(absolutePath))) {
23
+ const existingContent = await readText(absolutePath);
24
+ if (!existingContent.includes(SDT_DEV_AGENT_BOOTSTRAP_ENTRY_MARKER)) {
25
+ const entryRecord = plan.manifest.bootstrapEntries.find((entry) => entry.path === file.path);
26
+ if (entryRecord) {
27
+ entryRecord.status = 'manual-merge-required';
28
+ }
29
+ continue;
30
+ }
31
+ }
32
+ // 某些工具会把 MCP 与 hooks 放在同一个配置文件里,写入阶段需要一起判断。
33
+ const sharedConfigTool = plan.manifest.tools.find((tool) => getProjectMcpConfigPathForTool(tool) === file.path &&
34
+ getProjectHookConfigPathForTool(tool) === file.path);
35
+ if (sharedConfigTool) {
36
+ const hookRecord = plan.manifest.hooks.find((hook) => hook.tool === sharedConfigTool && hook.path === file.path);
37
+ const degradeMarkerRelativePath = getHookDegradeMarkerPathForTool(sharedConfigTool);
38
+ const degradeMarkerPath = degradeMarkerRelativePath
39
+ ? path.join(targetPath, degradeMarkerRelativePath)
40
+ : null;
41
+ const selectedMcps = plan.manifest.mcps
42
+ .filter((mcp) => mcp.installs.some((install) => install.tool === sharedConfigTool && install.path === file.path))
43
+ .map((mcp) => mcp.id);
44
+ // 如果项目已经声明了更高优先级的 hooks 表示法,就只保留 MCP 合并,避免双来源并存。
45
+ if (degradeMarkerPath && (await exists(degradeMarkerPath))) {
46
+ if (hookRecord) {
47
+ hookRecord.status = 'degraded';
48
+ hookRecord.reason =
49
+ 'Project already defines Codex hooks in .codex/hooks.json; skipped managed inline hooks in .codex/config.toml to avoid mixed hook sources.';
50
+ }
51
+ if (await exists(absolutePath)) {
52
+ const existingContent = await readText(absolutePath);
53
+ const mergedContent = mergeMcpConfig(sharedConfigTool, existingContent, selectedMcps, absolutePath);
54
+ const existingServers = parseConfiguredMcpIds(sharedConfigTool, existingContent, absolutePath);
55
+ for (const mcp of plan.manifest.mcps) {
56
+ const installRecord = mcp.installs.find((install) => install.tool === sharedConfigTool && install.path === file.path);
57
+ if (installRecord && existingServers.has(mcp.id)) {
58
+ installRecord.status = 'already-present';
59
+ installRecord.reason = 'already-present';
60
+ }
61
+ }
62
+ if (mergedContent !== existingContent) {
63
+ await writeText(absolutePath, mergedContent);
64
+ writtenFiles.push(toPosixPath(file.path));
65
+ }
66
+ }
67
+ else if (selectedMcps.length > 0) {
68
+ await writeText(absolutePath, buildMcpConfig(sharedConfigTool, selectedMcps));
69
+ writtenFiles.push(toPosixPath(file.path));
70
+ }
71
+ continue;
72
+ }
73
+ if (await exists(absolutePath)) {
74
+ const existingContent = await readText(absolutePath);
75
+ const existingServers = parseConfiguredMcpIds(sharedConfigTool, existingContent, absolutePath);
76
+ for (const mcp of plan.manifest.mcps) {
77
+ const installRecord = mcp.installs.find((install) => install.tool === sharedConfigTool && install.path === file.path);
78
+ if (installRecord && existingServers.has(mcp.id)) {
79
+ installRecord.status = 'already-present';
80
+ installRecord.reason = 'already-present';
81
+ }
82
+ }
83
+ const mergedContent = mergeHookConfig(sharedConfigTool, mergeMcpConfig(sharedConfigTool, existingContent, selectedMcps, absolutePath));
84
+ if (mergedContent !== existingContent) {
85
+ await writeText(absolutePath, mergedContent);
86
+ writtenFiles.push(toPosixPath(file.path));
87
+ }
88
+ continue;
89
+ }
90
+ await writeText(absolutePath, file.content);
91
+ writtenFiles.push(toPosixPath(file.path));
92
+ continue;
93
+ }
94
+ // 另一些工具会把 hooks 配置独立成单文件,单独走 hook 合并流程。
95
+ const standaloneHookTool = plan.manifest.tools.find((tool) => getProjectHookConfigPathForTool(tool) === file.path &&
96
+ getProjectMcpConfigPathForTool(tool) !== file.path);
97
+ if (standaloneHookTool) {
98
+ const hookRecord = plan.manifest.hooks.find((hook) => hook.tool === standaloneHookTool && hook.path === file.path);
99
+ if (await exists(absolutePath)) {
100
+ const existingContent = await readText(absolutePath);
101
+ try {
102
+ const mergedContent = mergeHookConfig(standaloneHookTool, existingContent, absolutePath);
103
+ if (mergedContent !== existingContent) {
104
+ await writeText(absolutePath, mergedContent);
105
+ writtenFiles.push(toPosixPath(file.path));
106
+ }
107
+ }
108
+ catch (error) {
109
+ if (hookRecord) {
110
+ hookRecord.status = 'degraded';
111
+ hookRecord.reason = error instanceof Error ? error.message : String(error);
112
+ }
113
+ continue;
114
+ }
115
+ continue;
116
+ }
117
+ await writeText(absolutePath, file.content);
118
+ writtenFiles.push(toPosixPath(file.path));
119
+ continue;
120
+ }
19
121
  if (file.kind === 'mcp' && (await exists(absolutePath))) {
20
- const tool = file.path === '.mcp.json' ? 'claude-code' : 'codex';
122
+ const tool = plan.manifest.tools.find((candidate) => getProjectMcpConfigPathForTool(candidate) === file.path);
123
+ if (!tool) {
124
+ throw new Error(`Unable to resolve MCP tool for path: ${file.path}`);
125
+ }
21
126
  const existingContent = await readText(absolutePath);
22
127
  const selectedMcps = plan.manifest.mcps
23
128
  .filter((mcp) => mcp.installs.some((install) => install.tool === tool && install.path === file.path))
24
129
  .map((mcp) => mcp.id);
25
- const existingServers = parseConfiguredMcpIds(tool, existingContent);
130
+ const existingServers = parseConfiguredMcpIds(tool, existingContent, absolutePath);
26
131
  for (const mcp of plan.manifest.mcps) {
27
132
  const installRecord = mcp.installs.find((install) => install.tool === tool && install.path === file.path);
28
133
  if (installRecord && existingServers.has(mcp.id)) {
@@ -30,7 +135,7 @@ export async function applyInitPlan(targetPath, plan, hooks = {}) {
30
135
  installRecord.reason = 'already-present';
31
136
  }
32
137
  }
33
- const mergedContent = mergeMcpConfig(tool, existingContent, selectedMcps);
138
+ const mergedContent = mergeMcpConfig(tool, existingContent, selectedMcps, absolutePath);
34
139
  if (mergedContent !== existingContent) {
35
140
  await writeText(absolutePath, mergedContent);
36
141
  writtenFiles.push(toPosixPath(file.path));
@@ -1 +1 @@
1
- {"version":3,"file":"init-writer.js","sourceRoot":"","sources":["../../src/core/init-writer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init-writer.js","sourceRoot":"","sources":["../../src/core/init-writer.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAIA,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,CAIvF;AAED,6BAA6B;AAC7B,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -1,13 +1,15 @@
1
1
  import path from 'node:path';
2
2
  import { readText, writeText } from '../utils/fs.js';
3
+ import { parseJsonText } from '../utils/json.js';
3
4
  /** `.sdt-devagent/manifest.json` 的固定位置。 */
4
5
  export function getManifestPath(projectRoot) {
5
6
  return path.join(projectRoot, '.sdt-devagent', 'manifest.json');
6
7
  }
7
8
  /** 读取并解析项目内 manifest。 */
8
9
  export async function readInstallManifest(projectRoot) {
9
- const raw = await readText(getManifestPath(projectRoot));
10
- return JSON.parse(raw);
10
+ const manifestPath = getManifestPath(projectRoot);
11
+ const raw = await readText(manifestPath);
12
+ return parseJsonText(raw, manifestPath);
11
13
  }
12
14
  /** 用格式化 JSON 回写 manifest。 */
13
15
  export async function writeInstallManifest(projectRoot, manifest) {
@@ -1 +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"}
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;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGhD,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,YAAY,GAAG,eAAe,CAAC,WAAW,CAAC,CAAA;IACjD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAA;IACxC,OAAO,aAAa,CAAkB,GAAG,EAAE,YAAY,CAAC,CAAA;AAC1D,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"}
@@ -5,8 +5,9 @@ export declare function getMcpSnippet(tool: ToolId, mcpId: McpId): string;
5
5
  export declare function buildCodexMcpConfig(selectedMcps: McpId[]): string;
6
6
  /** 组装 Claude Code 项目的 `.mcp.json` 内容。 */
7
7
  export declare function buildClaudeMcpConfig(selectedMcps: McpId[]): string;
8
+ export declare function buildMcpConfig(tool: ToolId, selectedMcps: McpId[]): string;
8
9
  /** 从已有配置中解析出已经声明过的 MCP server ID。 */
9
- export declare function parseConfiguredMcpIds(tool: ToolId, content: string): Set<string>;
10
+ export declare function parseConfiguredMcpIds(tool: ToolId, content: string, sourcePath?: string): Set<string>;
10
11
  /** 仅把缺失的 MCP 片段追加进去,已存在的 server 不覆盖。 */
11
- export declare function mergeMcpConfig(tool: ToolId, existingContent: string, selectedMcps: McpId[]): string;
12
+ export declare function mergeMcpConfig(tool: ToolId, existingContent: string, selectedMcps: McpId[], sourcePath?: string): string;
12
13
  //# sourceMappingURL=mcp-config.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../src/core/mcp-config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAmBhD,4BAA4B;AAC5B,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAEhE;AAQD,qCAAqC;AACrC,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,MAAM,CAQjE;AAED,yCAAyC;AACzC,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,MAAM,CAYlE;AA2ED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,MAAM,CAE1E;AAED,qCAAqC;AACrC,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,UAAU,SAAe,GACxB,GAAG,CAAC,MAAM,CAAC,CAEb;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,KAAK,EAAE,EACrB,UAAU,SAAe,GACxB,MAAM,CAER"}
@@ -1,17 +1,24 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
+ import { getMcpCatalogEntry } from '../catalog/mcp.js';
5
+ import { parseJsonText } from '../utils/json.js';
6
+ import { getToolProfile } from './tool-profile.js';
4
7
  const currentDir = path.dirname(fileURLToPath(import.meta.url));
5
8
  const projectRoot = path.resolve(currentDir, '..', '..');
6
9
  /** 从模板目录读取单个 MCP 片段。 */
7
10
  function loadTemplate(relativePath) {
8
11
  return readFileSync(path.join(projectRoot, 'templates', relativePath), 'utf8');
9
12
  }
13
+ /** 获取某个 MCP 在指定工具下的模板相对路径。 */
14
+ function getMcpSnippetPath(tool, mcpId) {
15
+ const { templateBaseDir } = getMcpCatalogEntry(mcpId);
16
+ const profile = getToolProfile(tool);
17
+ return path.join(templateBaseDir, tool, profile.mcp.snippetTemplateFile);
18
+ }
10
19
  /** 获取某个 MCP 在指定工具下的模板片段。 */
11
20
  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'));
21
+ return loadTemplate(getMcpSnippetPath(tool, mcpId));
15
22
  }
16
23
  /** 组装 Codex 项目的 `config.toml` 片段。 */
17
24
  export function buildCodexMcpConfig(selectedMcps) {
@@ -25,36 +32,71 @@ export function buildCodexMcpConfig(selectedMcps) {
25
32
  export function buildClaudeMcpConfig(selectedMcps) {
26
33
  const mcpServers = {};
27
34
  for (const mcpId of selectedMcps) {
28
- const parsed = JSON.parse(getMcpSnippet('claude-code', mcpId));
35
+ const parsed = parseJsonText(getMcpSnippet('claude-code', mcpId), `templates/${getMcpSnippetPath('claude-code', mcpId)}`);
29
36
  Object.assign(mcpServers, parsed);
30
37
  }
31
38
  return `${JSON.stringify({ mcpServers }, null, 2)}\n`;
32
39
  }
40
+ /** 不同工具的 MCP 配置格式不同,命令层只通过这个分发表进入。 */
41
+ const MCP_CONFIG_ADAPTERS = {
42
+ codex: {
43
+ build: buildCodexMcpConfig,
44
+ parseConfiguredIds(content, sourcePath) {
45
+ const ids = new Set();
46
+ for (const rawLine of content.split(/\r?\n/)) {
47
+ const line = rawLine.trim();
48
+ if (!line.startsWith('[mcp_servers')) {
49
+ continue;
50
+ }
51
+ const match = line.match(/^\[mcp_servers\.([A-Za-z0-9_-]+)\](?:\s+#.*)?$/);
52
+ if (!match) {
53
+ throw new Error(`Invalid Codex MCP config in ${sourcePath}: malformed MCP header "${line}"`);
54
+ }
55
+ ids.add(match[1]);
56
+ }
57
+ return ids;
58
+ },
59
+ merge(existingContent, selectedMcps, sourcePath) {
60
+ const existingServers = parseConfiguredMcpIds('codex', existingContent, sourcePath);
61
+ const missingMcps = selectedMcps.filter((mcpId) => !existingServers.has(mcpId));
62
+ if (missingMcps.length === 0) {
63
+ return existingContent.endsWith('\n') ? existingContent : `${existingContent}\n`;
64
+ }
65
+ const additions = missingMcps.map((mcpId) => getMcpSnippet('codex', mcpId).trim());
66
+ const base = existingContent.trimEnd();
67
+ return `${base}\n\n${additions.join('\n\n')}\n`;
68
+ },
69
+ },
70
+ 'claude-code': {
71
+ build: buildClaudeMcpConfig,
72
+ parseConfiguredIds(content, sourcePath) {
73
+ const parsed = parseJsonText(content, sourcePath);
74
+ return new Set(Object.keys(parsed.mcpServers ?? {}));
75
+ },
76
+ merge(existingContent, selectedMcps, sourcePath) {
77
+ const existingServers = parseConfiguredMcpIds('claude-code', existingContent, sourcePath);
78
+ const missingMcps = selectedMcps.filter((mcpId) => !existingServers.has(mcpId));
79
+ if (missingMcps.length === 0) {
80
+ return existingContent.endsWith('\n') ? existingContent : `${existingContent}\n`;
81
+ }
82
+ const parsed = parseJsonText(existingContent, sourcePath);
83
+ const mergedServers = { ...(parsed.mcpServers ?? {}) };
84
+ for (const mcpId of missingMcps) {
85
+ Object.assign(mergedServers, parseJsonText(getMcpSnippet('claude-code', mcpId), `templates/${getMcpSnippetPath('claude-code', mcpId)}`));
86
+ }
87
+ return `${JSON.stringify({ ...parsed, mcpServers: mergedServers }, null, 2)}\n`;
88
+ },
89
+ },
90
+ };
91
+ export function buildMcpConfig(tool, selectedMcps) {
92
+ return MCP_CONFIG_ADAPTERS[tool].build(selectedMcps);
93
+ }
33
94
  /** 从已有配置中解析出已经声明过的 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 ?? {}));
95
+ export function parseConfiguredMcpIds(tool, content, sourcePath = 'MCP config') {
96
+ return MCP_CONFIG_ADAPTERS[tool].parseConfiguredIds(content, sourcePath);
40
97
  }
41
98
  /** 仅把缺失的 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`;
99
+ export function mergeMcpConfig(tool, existingContent, selectedMcps, sourcePath = 'MCP config') {
100
+ return MCP_CONFIG_ADAPTERS[tool].merge(existingContent, selectedMcps, sourcePath);
59
101
  }
60
102
  //# sourceMappingURL=mcp-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/core/mcp-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/core/mcp-config.ts"],"names":[],"mappings":"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"}
@@ -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;AAqD/C,uCAAuC;AACvC,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":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAqD/C,uCAAuC;AACvC,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAa9E"}
@@ -1,5 +1,6 @@
1
1
  import path from 'node:path';
2
2
  import { exists, readText } from '../utils/fs.js';
3
+ import { parseJsonText } from '../utils/json.js';
3
4
  /** 通过常见 lockfile 推断项目包管理器。 */
4
5
  async function detectPackageManager(targetPath) {
5
6
  const checks = [
@@ -25,7 +26,7 @@ async function detectProjectName(targetPath) {
25
26
  };
26
27
  }
27
28
  const raw = await readText(packageJsonPath);
28
- const packageJson = JSON.parse(raw);
29
+ const packageJson = parseJsonText(raw, packageJsonPath);
29
30
  return {
30
31
  projectName: packageJson.name ?? path.basename(targetPath),
31
32
  hasPackageJson: true,
@@ -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,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"}
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;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGhD,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,aAAa,CAAoB,GAAG,EAAE,eAAe,CAAC,CAAA;IAE1E,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,41 @@
1
+ import type { ToolId } from '../types.js';
2
+ export interface ToolProfile {
3
+ id: ToolId;
4
+ displayName: string;
5
+ entryDoc: {
6
+ path: string;
7
+ templatePath: string;
8
+ };
9
+ projectSkillRoot: string;
10
+ mcp: {
11
+ configPath: string;
12
+ snippetTemplateFile: string;
13
+ };
14
+ hooks: {
15
+ configPath: string;
16
+ scriptPath: string;
17
+ templatePaths: [string, string];
18
+ degradeMarkerPath: string | null;
19
+ trustReviewNotice: string | null;
20
+ };
21
+ workflow: {
22
+ openSpecToolArg: string;
23
+ skillRoot: string;
24
+ commandRoot: string | null;
25
+ };
26
+ }
27
+ export declare function getToolProfiles(): ToolProfile[];
28
+ export declare function getToolProfile(tool: ToolId): ToolProfile;
29
+ export declare function getToolRulesDocPathForTool(tool: ToolId): string;
30
+ export declare function getToolRulesTemplatePathForTool(tool: ToolId): string;
31
+ export declare function getProjectSkillRootForTool(tool: ToolId): string;
32
+ export declare function getProjectMcpConfigPathForTool(tool: ToolId): string;
33
+ export declare function getProjectHookConfigPathForTool(tool: ToolId): string;
34
+ export declare function getProjectHookScriptPathForTool(tool: ToolId): string;
35
+ export declare function getHookTemplatePathsForTool(tool: ToolId): [string, string];
36
+ export declare function getHookDegradeMarkerPathForTool(tool: ToolId): string | null;
37
+ export declare function getHookTrustReviewNoticeForTool(tool: ToolId): string | null;
38
+ export declare function getOpenSpecToolArg(tool: ToolId): string;
39
+ export declare function getWorkflowSkillRootForTool(tool: ToolId): string;
40
+ export declare function getWorkflowCommandRootForTool(tool: ToolId): string | null;
41
+ //# sourceMappingURL=tool-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-profile.d.ts","sourceRoot":"","sources":["../../src/core/tool-profile.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAA;QACZ,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,gBAAgB,EAAE,MAAM,CAAA;IACxB,GAAG,EAAE;QACH,UAAU,EAAE,MAAM,CAAA;QAClB,mBAAmB,EAAE,MAAM,CAAA;KAC5B,CAAA;IACD,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAA;QAClB,UAAU,EAAE,MAAM,CAAA;QAClB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC/B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;QAChC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;KACjC,CAAA;IACD,QAAQ,EAAE;QACR,eAAe,EAAE,MAAM,CAAA;QACvB,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAC3B,CAAA;CACF;AAiED,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAE/C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAOxD;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAE1E;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE3E;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE3E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEzE"}
@@ -0,0 +1,122 @@
1
+ import path from 'node:path';
2
+ /**
3
+ * 这里维护“当前支持工具”的稳定事实,不让外部直接拿到底层可变引用。
4
+ * 新增工具时优先补 profile,再判断是否真的需要新增 adapter。
5
+ */
6
+ const TOOL_PROFILES = [
7
+ {
8
+ id: 'codex',
9
+ displayName: 'Codex',
10
+ entryDoc: {
11
+ path: 'AGENTS.md',
12
+ templatePath: path.join('rules', 'codex', 'AGENTS.md'),
13
+ },
14
+ projectSkillRoot: path.join('.agents', 'skills'),
15
+ mcp: {
16
+ configPath: path.join('.codex', 'config.toml'),
17
+ snippetTemplateFile: 'config.toml',
18
+ },
19
+ hooks: {
20
+ configPath: path.join('.codex', 'config.toml'),
21
+ scriptPath: path.join('.codex', 'hooks', 'bootstrap-project-docs-context.mjs'),
22
+ templatePaths: [
23
+ path.join('hooks', 'codex', 'config.toml'),
24
+ path.join('hooks', 'codex', 'bootstrap-project-docs-context.mjs'),
25
+ ],
26
+ degradeMarkerPath: path.join('.codex', 'hooks.json'),
27
+ trustReviewNotice: 'Codex project hooks still need trust review in /hooks before first run.',
28
+ },
29
+ workflow: {
30
+ openSpecToolArg: 'codex',
31
+ skillRoot: path.join('.codex', 'skills'),
32
+ commandRoot: null,
33
+ },
34
+ },
35
+ {
36
+ id: 'claude-code',
37
+ displayName: 'Claude Code',
38
+ entryDoc: {
39
+ path: 'CLAUDE.md',
40
+ templatePath: path.join('rules', 'claude-code', 'CLAUDE.md'),
41
+ },
42
+ projectSkillRoot: path.join('.claude', 'skills'),
43
+ mcp: {
44
+ configPath: '.mcp.json',
45
+ snippetTemplateFile: 'server.json',
46
+ },
47
+ hooks: {
48
+ configPath: path.join('.claude', 'settings.json'),
49
+ scriptPath: path.join('.claude', 'hooks', 'bootstrap-project-docs-context.mjs'),
50
+ templatePaths: [
51
+ path.join('hooks', 'claude-code', 'settings.json'),
52
+ path.join('hooks', 'claude-code', 'bootstrap-project-docs-context.mjs'),
53
+ ],
54
+ degradeMarkerPath: null,
55
+ trustReviewNotice: null,
56
+ },
57
+ workflow: {
58
+ openSpecToolArg: 'claude',
59
+ skillRoot: path.join('.claude', 'skills'),
60
+ commandRoot: path.join('.claude', 'commands'),
61
+ },
62
+ },
63
+ ];
64
+ export function getToolProfiles() {
65
+ return TOOL_PROFILES.map(cloneToolProfile);
66
+ }
67
+ export function getToolProfile(tool) {
68
+ const profile = TOOL_PROFILES.find((item) => item.id === tool);
69
+ if (!profile) {
70
+ throw new Error(`Unknown tool profile: ${tool}`);
71
+ }
72
+ return cloneToolProfile(profile);
73
+ }
74
+ export function getToolRulesDocPathForTool(tool) {
75
+ return getToolProfile(tool).entryDoc.path;
76
+ }
77
+ export function getToolRulesTemplatePathForTool(tool) {
78
+ return getToolProfile(tool).entryDoc.templatePath;
79
+ }
80
+ export function getProjectSkillRootForTool(tool) {
81
+ return getToolProfile(tool).projectSkillRoot;
82
+ }
83
+ export function getProjectMcpConfigPathForTool(tool) {
84
+ return getToolProfile(tool).mcp.configPath;
85
+ }
86
+ export function getProjectHookConfigPathForTool(tool) {
87
+ return getToolProfile(tool).hooks.configPath;
88
+ }
89
+ export function getProjectHookScriptPathForTool(tool) {
90
+ return getToolProfile(tool).hooks.scriptPath;
91
+ }
92
+ export function getHookTemplatePathsForTool(tool) {
93
+ return getToolProfile(tool).hooks.templatePaths;
94
+ }
95
+ export function getHookDegradeMarkerPathForTool(tool) {
96
+ return getToolProfile(tool).hooks.degradeMarkerPath;
97
+ }
98
+ export function getHookTrustReviewNoticeForTool(tool) {
99
+ return getToolProfile(tool).hooks.trustReviewNotice;
100
+ }
101
+ export function getOpenSpecToolArg(tool) {
102
+ return getToolProfile(tool).workflow.openSpecToolArg;
103
+ }
104
+ export function getWorkflowSkillRootForTool(tool) {
105
+ return getToolProfile(tool).workflow.skillRoot;
106
+ }
107
+ export function getWorkflowCommandRootForTool(tool) {
108
+ return getToolProfile(tool).workflow.commandRoot;
109
+ }
110
+ function cloneToolProfile(profile) {
111
+ return {
112
+ ...profile,
113
+ entryDoc: { ...profile.entryDoc },
114
+ mcp: { ...profile.mcp },
115
+ hooks: {
116
+ ...profile.hooks,
117
+ templatePaths: [...profile.hooks.templatePaths],
118
+ },
119
+ workflow: { ...profile.workflow },
120
+ };
121
+ }
122
+ //# sourceMappingURL=tool-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-profile.js","sourceRoot":"","sources":["../../src/core/tool-profile.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
1
+ {"version":3,"file":"workflow-installer.d.ts","sourceRoot":"","sources":["../../src/core/workflow-installer.ts"],"names":[],"mappings":"AAMA,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"}
@@ -2,6 +2,7 @@ import { spawn } from 'node:child_process';
2
2
  import path from 'node:path';
3
3
  import { hasProjectWorkflowInstall } from './capability-discovery.js';
4
4
  import { getWorkflowTargetPaths } from './init-plan.js';
5
+ import { getOpenSpecToolArg } from './tool-profile.js';
5
6
  /** 最小的子进程执行包装;统一收集 stdout/stderr 作为错误上下文。 */
6
7
  function runCommand(command, args, env, cwd) {
7
8
  return new Promise((resolve) => {
@@ -42,7 +43,7 @@ function runCommand(command, args, env, cwd) {
42
43
  }
43
44
  /** `OpenSpec` CLI 使用的工具名与本仓库内部枚举不同。 */
44
45
  function mapOpenSpecToolId(tool) {
45
- return tool === 'claude-code' ? 'claude' : 'codex';
46
+ return getOpenSpecToolArg(tool);
46
47
  }
47
48
  /**
48
49
  * 执行 workflow 安装。
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-installer.js","sourceRoot":"","sources":["../../src/core/workflow-installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-installer.js","sourceRoot":"","sources":["../../src/core/workflow-installer.ts"],"names":[],"mappings":"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"}