@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.
- package/README.md +80 -21
- package/dist/catalog/index.d.ts +4 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +4 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/mcp.d.ts +12 -0
- package/dist/catalog/mcp.d.ts.map +1 -0
- package/dist/catalog/mcp.js +37 -0
- package/dist/catalog/mcp.js.map +1 -0
- package/dist/catalog/shared.d.ts +5 -0
- package/dist/catalog/shared.d.ts.map +1 -0
- package/dist/catalog/shared.js +8 -0
- package/dist/catalog/shared.js.map +1 -0
- package/dist/catalog/skills.d.ts +14 -0
- package/dist/catalog/skills.d.ts.map +1 -0
- package/dist/catalog/skills.js +55 -0
- package/dist/catalog/skills.js.map +1 -0
- package/dist/catalog/workflows.d.ts +8 -0
- package/dist/catalog/workflows.d.ts.map +1 -0
- package/dist/catalog/workflows.js +24 -0
- package/dist/catalog/workflows.js.map +1 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +158 -125
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +56 -7
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +1 -1
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/core/bootstrap-entry.d.ts +5 -0
- package/dist/core/bootstrap-entry.d.ts.map +1 -0
- package/dist/core/bootstrap-entry.js +9 -0
- package/dist/core/bootstrap-entry.js.map +1 -0
- package/dist/core/capability-discovery.js +1 -1
- package/dist/core/capability-discovery.js.map +1 -1
- package/dist/core/hook-config.d.ts +19 -0
- package/dist/core/hook-config.d.ts.map +1 -0
- package/dist/core/hook-config.js +162 -0
- package/dist/core/hook-config.js.map +1 -0
- package/dist/core/init-options.d.ts.map +1 -1
- package/dist/core/init-options.js +7 -5
- package/dist/core/init-options.js.map +1 -1
- package/dist/core/init-plan.d.ts +1 -1
- package/dist/core/init-plan.d.ts.map +1 -1
- package/dist/core/init-plan.js +98 -32
- package/dist/core/init-plan.js.map +1 -1
- package/dist/core/init-writer.d.ts.map +1 -1
- package/dist/core/init-writer.js +109 -4
- package/dist/core/init-writer.js.map +1 -1
- package/dist/core/manifest.d.ts.map +1 -1
- package/dist/core/manifest.js +4 -2
- package/dist/core/manifest.js.map +1 -1
- package/dist/core/mcp-config.d.ts +3 -2
- package/dist/core/mcp-config.d.ts.map +1 -1
- package/dist/core/mcp-config.js +69 -27
- package/dist/core/mcp-config.js.map +1 -1
- package/dist/core/project-inspector.d.ts.map +1 -1
- package/dist/core/project-inspector.js +2 -1
- package/dist/core/project-inspector.js.map +1 -1
- package/dist/core/tool-profile.d.ts +41 -0
- package/dist/core/tool-profile.d.ts.map +1 -0
- package/dist/core/tool-profile.js +122 -0
- package/dist/core/tool-profile.js.map +1 -0
- package/dist/core/workflow-installer.d.ts.map +1 -1
- package/dist/core/workflow-installer.js +2 -1
- package/dist/core/workflow-installer.js.map +1 -1
- package/dist/types.d.ts +19 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/init-welcome.d.ts +1 -0
- package/dist/utils/init-welcome.d.ts.map +1 -1
- package/dist/utils/init-welcome.js +33 -9
- package/dist/utils/init-welcome.js.map +1 -1
- package/dist/utils/json.d.ts +3 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +11 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/progress-spinner.d.ts +22 -0
- package/dist/utils/progress-spinner.d.ts.map +1 -0
- package/dist/utils/progress-spinner.js +74 -0
- package/dist/utils/progress-spinner.js.map +1 -0
- package/package.json +3 -6
- package/templates/bootstrap/project-entry.md +16 -5
- package/templates/hooks/claude-code/bootstrap-project-docs-context.mjs +38 -0
- package/templates/hooks/claude-code/settings.json +36 -0
- package/templates/hooks/codex/bootstrap-project-docs-context.mjs +38 -0
- package/templates/hooks/codex/config.toml +16 -0
- package/templates/rules/claude-code/CLAUDE.md +17 -0
- package/templates/rules/codex/AGENTS.md +17 -0
- package/templates/skills/builtin/bootstrap-project-docs/SKILL.md +25 -11
- package/templates/skills/builtin/bootstrap-project-docs/agents/openai.yaml +4 -0
- package/templates/skills/builtin/bootstrap-project-docs/references/architecture-first.md +16 -4
- package/templates/skills/builtin/bootstrap-project-docs/references/doc-state-routing.md +28 -0
- package/templates/skills/builtin/bootstrap-project-docs/references/tool-rules-follow-up.md +19 -4
- package/dist/catalog.d.ts +0 -16
- package/dist/catalog.d.ts.map +0 -1
- package/dist/catalog.js +0 -98
- package/dist/catalog.js.map +0 -1
package/dist/core/init-writer.js
CHANGED
|
@@ -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 =
|
|
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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;
|
|
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":"
|
|
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"}
|
package/dist/core/manifest.js
CHANGED
|
@@ -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
|
|
10
|
-
|
|
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;
|
|
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":"
|
|
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"}
|
package/dist/core/mcp-config.js
CHANGED
|
@@ -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
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;
|
|
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":"
|
|
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 =
|
|
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;
|
|
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":"
|
|
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
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"workflow-installer.js","sourceRoot":"","sources":["../../src/core/workflow-installer.ts"],"names":[],"mappings":"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"}
|