@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.
- package/README.md +70 -14
- package/dist/catalog.d.ts +16 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +98 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli/index.js +72 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/add.d.ts +7 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +267 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +31 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts +4 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +20 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +66 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/capability-discovery.d.ts +23 -0
- package/dist/core/capability-discovery.d.ts.map +1 -0
- package/dist/core/capability-discovery.js +49 -0
- package/dist/core/capability-discovery.js.map +1 -0
- package/dist/core/init-options.d.ts +7 -1
- package/dist/core/init-options.d.ts.map +1 -1
- package/dist/core/init-options.js +64 -35
- package/dist/core/init-options.js.map +1 -1
- package/dist/core/init-plan.d.ts +25 -1
- package/dist/core/init-plan.d.ts.map +1 -1
- package/dist/core/init-plan.js +211 -37
- package/dist/core/init-plan.js.map +1 -1
- package/dist/core/init-writer.d.ts +17 -1
- package/dist/core/init-writer.d.ts.map +1 -1
- package/dist/core/init-writer.js +72 -19
- package/dist/core/init-writer.js.map +1 -1
- package/dist/core/manifest.d.ts +8 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +16 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/mcp-config.d.ts +12 -0
- package/dist/core/mcp-config.d.ts.map +1 -0
- package/dist/core/mcp-config.js +60 -0
- package/dist/core/mcp-config.js.map +1 -0
- package/dist/core/project-inspector.d.ts +1 -0
- package/dist/core/project-inspector.d.ts.map +1 -1
- package/dist/core/project-inspector.js +4 -0
- package/dist/core/project-inspector.js.map +1 -1
- package/dist/core/remote-skill-installer.d.ts +16 -0
- package/dist/core/remote-skill-installer.d.ts.map +1 -0
- package/dist/core/remote-skill-installer.js +104 -0
- package/dist/core/remote-skill-installer.js.map +1 -0
- package/dist/core/workflow-installer.d.ts +22 -0
- package/dist/core/workflow-installer.d.ts.map +1 -0
- package/dist/core/workflow-installer.js +103 -0
- package/dist/core/workflow-installer.js.map +1 -0
- package/dist/types.d.ts +103 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -2
- package/dist/types.js.map +1 -1
- package/dist/utils/follow-up-notice.d.ts +7 -0
- package/dist/utils/follow-up-notice.d.ts.map +1 -0
- package/dist/utils/follow-up-notice.js +29 -0
- package/dist/utils/follow-up-notice.js.map +1 -0
- package/dist/utils/init-welcome.d.ts.map +1 -1
- package/dist/utils/init-welcome.js +20 -33
- package/dist/utils/init-welcome.js.map +1 -1
- package/dist/utils/mastergo-notice.d.ts +7 -0
- package/dist/utils/mastergo-notice.d.ts.map +1 -0
- package/dist/utils/mastergo-notice.js +14 -0
- package/dist/utils/mastergo-notice.js.map +1 -0
- package/dist/utils/terminal-theme.d.ts +4 -0
- package/dist/utils/terminal-theme.d.ts.map +1 -0
- package/dist/utils/terminal-theme.js +25 -0
- package/dist/utils/terminal-theme.js.map +1 -0
- package/package.json +6 -3
- package/templates/bootstrap/project-entry.md +17 -0
- package/templates/mcp/context7/claude-code/server.json +6 -0
- package/templates/mcp/context7/codex/config.toml +3 -0
- package/templates/mcp/mastergo/claude-code/server.json +6 -0
- package/templates/mcp/mastergo/codex/config.toml +4 -0
- package/templates/skills/builtin/bootstrap-project-docs/SKILL.md +16 -0
- package/templates/skills/builtin/bootstrap-project-docs/references/architecture-first.md +7 -0
- package/templates/skills/builtin/bootstrap-project-docs/references/tool-rules-follow-up.md +8 -0
- package/templates/skills/remote/catalog.json +68 -0
- package/templates/workflows/openspec/README.md +7 -0
- package/templates/workflows/openspec/claude-code/README.md +7 -0
- package/templates/workflows/openspec/codex/README.md +7 -0
- package/templates/AGENTS.md +0 -24
- package/templates/ARCHITECTURE.md +0 -26
- package/templates/capabilities/mcp/README.md +0 -8
- package/templates/capabilities/skills/README.md +0 -8
- package/templates/docs/ai-collaboration/README.md +0 -16
- package/templates/tools/claude-code/README.md +0 -8
- package/templates/tools/codex/README.md +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAoC7D,wBAAsB,cAAc,CAClC,UAAU,SAAM,EAChB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAyCf"}
|
package/dist/commands/init.js
CHANGED
|
@@ -3,15 +3,27 @@ import { promises as fs } from 'node:fs';
|
|
|
3
3
|
import { inspectProject } from '../core/project-inspector.js';
|
|
4
4
|
import { resolveInitSelections } from '../core/init-options.js';
|
|
5
5
|
import { createInitPlan } from '../core/init-plan.js';
|
|
6
|
+
import { getProjectMcpConfigPath } from '../core/init-plan.js';
|
|
6
7
|
import { applyInitPlan } from '../core/init-writer.js';
|
|
7
8
|
import { showInitWelcome } from '../utils/init-welcome.js';
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
import { printMastergoTokenNotice } from '../utils/mastergo-notice.js';
|
|
10
|
+
import { withTerminalTone } from '../utils/terminal-theme.js';
|
|
11
|
+
function printSummary(targetPath, writtenFiles, failedRemoteSkills) {
|
|
12
|
+
console.log(withTerminalTone(`Initialized SDT DevAgent in ${targetPath}`, 'success'));
|
|
10
13
|
console.log('');
|
|
11
|
-
console.log('
|
|
14
|
+
console.log('Installed bootstrap and tool integration assets:');
|
|
12
15
|
for (const file of writtenFiles) {
|
|
13
16
|
console.log(`- ${file}`);
|
|
14
17
|
}
|
|
18
|
+
if (failedRemoteSkills.length > 0) {
|
|
19
|
+
console.log('');
|
|
20
|
+
console.log(withTerminalTone('Remote skill installs that need manual retry:', 'failure'));
|
|
21
|
+
for (const item of failedRemoteSkills) {
|
|
22
|
+
console.log(withTerminalTone(`- ${item.skillId} (${item.tool})`, 'failure'));
|
|
23
|
+
console.log(` reason: ${item.error}`);
|
|
24
|
+
console.log(` retry: ${item.installCommand}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
15
27
|
}
|
|
16
28
|
export async function runInitCommand(targetPath = '.', options = {}) {
|
|
17
29
|
const resolvedTarget = path.resolve(targetPath);
|
|
@@ -28,7 +40,21 @@ export async function runInitCommand(targetPath = '.', options = {}) {
|
|
|
28
40
|
const selections = await resolveInitSelections(options);
|
|
29
41
|
const facts = await inspectProject(resolvedTarget);
|
|
30
42
|
const plan = createInitPlan(facts, selections);
|
|
31
|
-
const result = await applyInitPlan(resolvedTarget, plan
|
|
32
|
-
|
|
43
|
+
const result = await applyInitPlan(resolvedTarget, plan, {
|
|
44
|
+
onRemoteSkillInstallStart(install, index, total) {
|
|
45
|
+
console.log(`Installing remote skill ${index}/${total}: ${install.skillId} (${install.tool})...`);
|
|
46
|
+
},
|
|
47
|
+
onRemoteSkillInstallFinish(install, result) {
|
|
48
|
+
const line = `- ${install.skillId} (${install.tool}) ${result}`;
|
|
49
|
+
console.log(withTerminalTone(line, result === 'installed' ? 'success' : 'failure'));
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
printSummary(resolvedTarget, result.writtenFiles, result.failedRemoteSkills);
|
|
53
|
+
if (selections.mcps.includes('mastergo')) {
|
|
54
|
+
printMastergoTokenNotice(selections.tools.map((tool) => ({
|
|
55
|
+
tool,
|
|
56
|
+
path: getProjectMcpConfigPath(tool),
|
|
57
|
+
})));
|
|
58
|
+
}
|
|
33
59
|
}
|
|
34
60
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAA;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAE/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAEA,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAO9C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { MCP_CATALOG, SKILL_CATALOG, WORKFLOW_CATALOG } from '../catalog.js';
|
|
2
|
+
export function runListSkillsCommand() {
|
|
3
|
+
console.log('Installable skills');
|
|
4
|
+
for (const skill of SKILL_CATALOG) {
|
|
5
|
+
console.log(`- ${skill.id} | ${skill.selection} | ${skill.sourceType} | ${skill.description}`);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export function runListMcpCommand() {
|
|
9
|
+
console.log('Installable MCP servers');
|
|
10
|
+
for (const mcp of MCP_CATALOG) {
|
|
11
|
+
console.log(`- ${mcp.id} | ${mcp.selection} | ${mcp.sourceType} | ${mcp.description}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function runListWorkflowsCommand() {
|
|
15
|
+
console.log('Installable workflows');
|
|
16
|
+
for (const workflow of WORKFLOW_CATALOG) {
|
|
17
|
+
console.log(`- ${workflow.id} | ${workflow.sourceType} | ${workflow.supportedTools.join(', ')} | ${workflow.description}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAE5E,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IACjC,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;IAChG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;IACtC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,SAAS,MAAM,GAAG,CAAC,UAAU,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;IACxF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;IACpC,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CACT,KAAK,QAAQ,CAAC,EAAE,MAAM,QAAQ,CAAC,UAAU,MAAM,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAC9G,CAAA;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAsDA,wBAAsB,gBAAgB,CAAC,UAAU,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCtE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { detectSkillAvailability, detectWorkflowAvailability, } from '../core/capability-discovery.js';
|
|
3
|
+
import { readInstallManifest } from '../core/manifest.js';
|
|
4
|
+
import { parseConfiguredMcpIds } from '../core/mcp-config.js';
|
|
5
|
+
import { exists, readText } from '../utils/fs.js';
|
|
6
|
+
async function resolveSkillStatus(projectRoot, skillId, install) {
|
|
7
|
+
const detected = await detectSkillAvailability(projectRoot, install.tool, skillId);
|
|
8
|
+
if (detected.status === 'missing') {
|
|
9
|
+
return install.status === 'failed' ? 'failed' : 'missing';
|
|
10
|
+
}
|
|
11
|
+
return install.status === 'already-present' ? 'already-present' : 'installed';
|
|
12
|
+
}
|
|
13
|
+
async function resolveMcpStatus(projectRoot, mcpId, install) {
|
|
14
|
+
if (!(await exists(path.join(projectRoot, install.path)))) {
|
|
15
|
+
return install.status === 'failed' ? 'failed' : 'missing';
|
|
16
|
+
}
|
|
17
|
+
const config = await readText(path.join(projectRoot, install.path));
|
|
18
|
+
const configured = parseConfiguredMcpIds(install.tool, config);
|
|
19
|
+
if (configured.has(mcpId)) {
|
|
20
|
+
return install.status === 'already-present' ? 'already-present' : 'installed';
|
|
21
|
+
}
|
|
22
|
+
return 'missing';
|
|
23
|
+
}
|
|
24
|
+
async function resolveWorkflowStatus(projectRoot, workflowId, install) {
|
|
25
|
+
const detected = await detectWorkflowAvailability(projectRoot, install.tool, workflowId);
|
|
26
|
+
if (detected.status === 'missing') {
|
|
27
|
+
return install.status === 'failed' ? 'failed' : 'missing';
|
|
28
|
+
}
|
|
29
|
+
return install.status === 'already-present' ? 'already-present' : 'installed';
|
|
30
|
+
}
|
|
31
|
+
export async function runStatusCommand(targetPath = '.') {
|
|
32
|
+
const projectRoot = path.resolve(targetPath);
|
|
33
|
+
const manifest = await readInstallManifest(projectRoot);
|
|
34
|
+
console.log('Current project capability status');
|
|
35
|
+
console.log(`Project: ${manifest.project.name}`);
|
|
36
|
+
console.log('');
|
|
37
|
+
console.log('AI Coding Tools:');
|
|
38
|
+
for (const tool of manifest.tools) {
|
|
39
|
+
console.log(`- ${tool}`);
|
|
40
|
+
}
|
|
41
|
+
console.log('');
|
|
42
|
+
console.log('Skills:');
|
|
43
|
+
for (const skill of manifest.skills) {
|
|
44
|
+
for (const install of skill.installs) {
|
|
45
|
+
const status = await resolveSkillStatus(projectRoot, skill.id, install);
|
|
46
|
+
console.log(`- ${skill.id} (${install.tool}) ${status}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
console.log('');
|
|
50
|
+
console.log('MCP:');
|
|
51
|
+
for (const mcp of manifest.mcps) {
|
|
52
|
+
for (const install of mcp.installs) {
|
|
53
|
+
const status = await resolveMcpStatus(projectRoot, mcp.id, install);
|
|
54
|
+
console.log(`- ${mcp.id} (${install.tool}) ${status}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
console.log('');
|
|
58
|
+
console.log('Workflows:');
|
|
59
|
+
for (const workflow of manifest.workflows) {
|
|
60
|
+
for (const install of workflow.installs) {
|
|
61
|
+
const status = await resolveWorkflowStatus(projectRoot, workflow.id, install);
|
|
62
|
+
console.log(`- ${workflow.id} (${install.tool}) ${status}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { SkillId, ToolId, WorkflowId } from '../types.js';
|
|
2
|
+
/** skill 在项目里的探测结果。 */
|
|
3
|
+
export interface SkillDiscoveryResult {
|
|
4
|
+
status: 'missing' | 'already-present';
|
|
5
|
+
reason?: 'already-present';
|
|
6
|
+
}
|
|
7
|
+
/** workflow 在项目里的探测结果。 */
|
|
8
|
+
export interface WorkflowDiscoveryResult {
|
|
9
|
+
status: 'missing' | 'already-present';
|
|
10
|
+
reason?: 'already-present';
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* skill 是否已经安装到项目级目录。
|
|
14
|
+
* `bundle` 模式要求所有目标目录齐全,`single` 只看首个主目录。
|
|
15
|
+
*/
|
|
16
|
+
export declare function hasProjectSkillInstall(projectRoot: string, tool: ToolId, skillId: SkillId): boolean;
|
|
17
|
+
/** 对外暴露的 skill 可用性探测入口。 */
|
|
18
|
+
export declare function detectSkillAvailability(projectRoot: string, tool: ToolId, skillId: SkillId): Promise<SkillDiscoveryResult>;
|
|
19
|
+
/** workflow 采用“关键路径全量存在”作为已安装判定标准。 */
|
|
20
|
+
export declare function hasProjectWorkflowInstall(projectRoot: string, tool: ToolId, workflowId: WorkflowId): boolean;
|
|
21
|
+
/** 对外暴露的 workflow 可用性探测入口。 */
|
|
22
|
+
export declare function detectWorkflowAvailability(projectRoot: string, tool: ToolId, workflowId: WorkflowId): Promise<WorkflowDiscoveryResult>;
|
|
23
|
+
//# sourceMappingURL=capability-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-discovery.d.ts","sourceRoot":"","sources":["../../src/core/capability-discovery.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG9D,uBAAuB;AACvB,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,SAAS,GAAG,iBAAiB,CAAA;IACrC,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;AAED,0BAA0B;AAC1B,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,SAAS,GAAG,iBAAiB,CAAA;IACrC,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GACf,OAAO,CAgBT;AAED,2BAA2B;AAC3B,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAED,sCAAsC;AACtC,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,UAAU,GACrB,OAAO,CAIT;AAED,8BAA8B;AAC9B,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,uBAAuB,CAAC,CAWlC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { getSkillCatalogEntry } from '../catalog.js';
|
|
4
|
+
import { getRemoteSkillInstallTargets, getWorkflowTargetPaths } from './init-plan.js';
|
|
5
|
+
/**
|
|
6
|
+
* skill 是否已经安装到项目级目录。
|
|
7
|
+
* `bundle` 模式要求所有目标目录齐全,`single` 只看首个主目录。
|
|
8
|
+
*/
|
|
9
|
+
export function hasProjectSkillInstall(projectRoot, tool, skillId) {
|
|
10
|
+
const skill = getSkillCatalogEntry(skillId);
|
|
11
|
+
const installTargets = getRemoteSkillInstallTargets(tool, skillId);
|
|
12
|
+
if (skill.detectionMode === 'bundle') {
|
|
13
|
+
return installTargets.every((target) => existsSync(path.join(projectRoot, target.targetPath, 'SKILL.md')));
|
|
14
|
+
}
|
|
15
|
+
const firstTarget = installTargets[0];
|
|
16
|
+
if (!firstTarget) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return existsSync(path.join(projectRoot, firstTarget.targetPath, 'SKILL.md'));
|
|
20
|
+
}
|
|
21
|
+
/** 对外暴露的 skill 可用性探测入口。 */
|
|
22
|
+
export async function detectSkillAvailability(projectRoot, tool, skillId) {
|
|
23
|
+
if (hasProjectSkillInstall(projectRoot, tool, skillId)) {
|
|
24
|
+
return {
|
|
25
|
+
status: 'already-present',
|
|
26
|
+
reason: 'already-present',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
status: 'missing',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** workflow 采用“关键路径全量存在”作为已安装判定标准。 */
|
|
34
|
+
export function hasProjectWorkflowInstall(projectRoot, tool, workflowId) {
|
|
35
|
+
return getWorkflowTargetPaths(tool, workflowId).every((targetPath) => existsSync(path.join(projectRoot, targetPath)));
|
|
36
|
+
}
|
|
37
|
+
/** 对外暴露的 workflow 可用性探测入口。 */
|
|
38
|
+
export async function detectWorkflowAvailability(projectRoot, tool, workflowId) {
|
|
39
|
+
if (hasProjectWorkflowInstall(projectRoot, tool, workflowId)) {
|
|
40
|
+
return {
|
|
41
|
+
status: 'already-present',
|
|
42
|
+
reason: 'already-present',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
status: 'missing',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=capability-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-discovery.js","sourceRoot":"","sources":["../../src/core/capability-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAEpD,OAAO,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAcrF;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,WAAmB,EACnB,IAAY,EACZ,OAAgB;IAEhB,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,cAAc,GAAG,4BAA4B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAElE,IAAI,KAAK,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CACrC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAClE,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;IACrC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAA;AAC/E,CAAC;AAED,2BAA2B;AAC3B,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,WAAmB,EACnB,IAAY,EACZ,OAAgB;IAEhB,IAAI,sBAAsB,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QACvD,OAAO;YACL,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,iBAAiB;SAC1B,CAAA;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,SAAS;KAClB,CAAA;AACH,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,yBAAyB,CACvC,WAAmB,EACnB,IAAY,EACZ,UAAsB;IAEtB,OAAO,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE,CACnE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAC/C,CAAA;AACH,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAAmB,EACnB,IAAY,EACZ,UAAsB;IAEtB,IAAI,yBAAyB,CAAC,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;QAC7D,OAAO;YACL,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,iBAAiB;SAC1B,CAAA;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,SAAS;KAClB,CAAA;AACH,CAAC"}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import type { InitSelections } from '../types.js';
|
|
2
|
+
/** CLI 原始入参;这里还未经过合法性校验和默认值归一化。 */
|
|
2
3
|
export interface RawInitOptions {
|
|
3
4
|
tools?: string;
|
|
4
5
|
installMode?: string;
|
|
5
|
-
|
|
6
|
+
skills?: string;
|
|
7
|
+
mcp?: string;
|
|
6
8
|
yes?: boolean;
|
|
7
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* `init` 选择解析入口。
|
|
12
|
+
* 优先消费显式命令参数;只有必要时才退回交互式选择。
|
|
13
|
+
*/
|
|
8
14
|
export declare function resolveInitSelections(options: RawInitOptions): Promise<InitSelections>;
|
|
9
15
|
//# sourceMappingURL=init-options.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-options.d.ts","sourceRoot":"","sources":["../../src/core/init-options.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init-options.d.ts","sourceRoot":"","sources":["../../src/core/init-options.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAuC,MAAM,aAAa,CAAA;AAOtF,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AA+FD;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CA0G5F"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DEFAULT_MCP_IDS, DEFAULT_SKILL_IDS, MCP_CATALOG, MCP_IDS, SKILL_CATALOG, SKILL_IDS, } from '../catalog.js';
|
|
2
|
+
import { INSTALL_MODES, SUPPORTED_TOOLS } from '../types.js';
|
|
2
3
|
import { canPrompt } from '../utils/interactive.js';
|
|
3
4
|
import { GO_BACK } from '../utils/prompt-flow.js';
|
|
4
5
|
import { searchableMultiSelect } from '../utils/searchable-multi-select.js';
|
|
5
6
|
import { styledSelect } from '../utils/styled-select.js';
|
|
7
|
+
/** 把逗号分隔字符串解析成受限枚举列表,并对非法值快速失败。 */
|
|
6
8
|
function parseList(input, allowed) {
|
|
7
9
|
if (!input) {
|
|
8
10
|
return [];
|
|
@@ -17,15 +19,21 @@ function parseList(input, allowed) {
|
|
|
17
19
|
}
|
|
18
20
|
return values;
|
|
19
21
|
}
|
|
20
|
-
|
|
22
|
+
/** 推荐安装时忽略用户传入 skill 列表,直接回到默认集合。 */
|
|
23
|
+
function normalizeSkills(installMode, skills) {
|
|
21
24
|
if (installMode === 'recommended') {
|
|
22
|
-
return [...
|
|
25
|
+
return [...DEFAULT_SKILL_IDS];
|
|
23
26
|
}
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
return skills;
|
|
28
|
+
}
|
|
29
|
+
/** 推荐安装时忽略用户传入 MCP 列表,直接回到默认集合。 */
|
|
30
|
+
function normalizeMcps(installMode, mcps) {
|
|
31
|
+
if (installMode === 'recommended') {
|
|
32
|
+
return [...DEFAULT_MCP_IDS];
|
|
26
33
|
}
|
|
27
|
-
return
|
|
34
|
+
return mcps;
|
|
28
35
|
}
|
|
36
|
+
/** 交互式选择目标工具。 */
|
|
29
37
|
async function promptTools() {
|
|
30
38
|
return searchableMultiSelect({
|
|
31
39
|
message: 'Select tools to set up (2 available)',
|
|
@@ -36,6 +44,7 @@ async function promptTools() {
|
|
|
36
44
|
validate: (selected) => (selected.length > 0 ? true : 'Select at least one tool'),
|
|
37
45
|
});
|
|
38
46
|
}
|
|
47
|
+
/** 交互式选择安装模式;支持从后续步骤返回。 */
|
|
39
48
|
async function promptInstallMode(allowBack = false) {
|
|
40
49
|
return styledSelect({
|
|
41
50
|
message: '选择安装方式',
|
|
@@ -44,33 +53,42 @@ async function promptInstallMode(allowBack = false) {
|
|
|
44
53
|
{
|
|
45
54
|
name: '推荐安装(默认)',
|
|
46
55
|
value: 'recommended',
|
|
47
|
-
description: '
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
name: '最小安装',
|
|
51
|
-
value: 'minimal',
|
|
52
|
-
description: '只安装基础协作资产和目标工具接入文件',
|
|
56
|
+
description: '安装 bootstrap skill、默认 skills 集合与默认 MCP',
|
|
53
57
|
},
|
|
54
58
|
{
|
|
55
59
|
name: '自定义安装',
|
|
56
60
|
value: 'custom',
|
|
57
|
-
description: '
|
|
61
|
+
description: 'bootstrap skill 固定安装,其余 skills / MCP 按需选择',
|
|
58
62
|
},
|
|
59
63
|
],
|
|
60
64
|
});
|
|
61
65
|
}
|
|
62
|
-
|
|
66
|
+
/** 自定义安装时选择远端 skills;bootstrap skill 不在这里暴露。 */
|
|
67
|
+
async function promptSkills(allowBack = false) {
|
|
63
68
|
return searchableMultiSelect({
|
|
64
|
-
message: '
|
|
69
|
+
message: '选择要安装的 skills(bootstrap skill 会强制安装)',
|
|
65
70
|
allowBack,
|
|
66
|
-
choices:
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
],
|
|
71
|
-
validate: (selected) => (selected.length > 0 ? true : 'Select at least one capability pack'),
|
|
71
|
+
choices: SKILL_CATALOG.filter((skill) => skill.selection !== 'required').map((skill) => ({
|
|
72
|
+
name: `${skill.displayName}${skill.selection === 'default' ? '(默认集)' : '(选装)'}`,
|
|
73
|
+
value: skill.id,
|
|
74
|
+
})),
|
|
72
75
|
});
|
|
73
76
|
}
|
|
77
|
+
/** 自定义安装时选择 MCP,允许留空。 */
|
|
78
|
+
async function promptMcps(allowBack = false) {
|
|
79
|
+
return searchableMultiSelect({
|
|
80
|
+
message: '选择要安装的 MCP(可留空)',
|
|
81
|
+
allowBack,
|
|
82
|
+
choices: MCP_CATALOG.map((mcp) => ({
|
|
83
|
+
name: `${mcp.displayName}${mcp.selection === 'default' ? '(默认集)' : '(选装)'}`,
|
|
84
|
+
value: mcp.id,
|
|
85
|
+
})),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* `init` 选择解析入口。
|
|
90
|
+
* 优先消费显式命令参数;只有必要时才退回交互式选择。
|
|
91
|
+
*/
|
|
74
92
|
export async function resolveInitSelections(options) {
|
|
75
93
|
const tools = parseList(options.tools, SUPPORTED_TOOLS);
|
|
76
94
|
const installMode = options.installMode
|
|
@@ -81,27 +99,32 @@ export async function resolveInitSelections(options) {
|
|
|
81
99
|
return options.installMode;
|
|
82
100
|
})()
|
|
83
101
|
: undefined;
|
|
84
|
-
const
|
|
102
|
+
const skills = parseList(options.skills, SKILL_IDS);
|
|
103
|
+
const mcps = parseList(options.mcp, MCP_IDS);
|
|
85
104
|
if (options.yes) {
|
|
86
105
|
return {
|
|
87
106
|
tools: tools.length > 0 ? tools : [...SUPPORTED_TOOLS],
|
|
88
107
|
installMode: installMode ?? 'recommended',
|
|
89
|
-
|
|
108
|
+
skills: normalizeSkills(installMode ?? 'recommended', skills),
|
|
109
|
+
mcps: normalizeMcps(installMode ?? 'recommended', mcps),
|
|
90
110
|
};
|
|
91
111
|
}
|
|
92
112
|
if (tools.length > 0 && installMode) {
|
|
93
113
|
return {
|
|
94
114
|
tools,
|
|
95
115
|
installMode,
|
|
96
|
-
|
|
116
|
+
skills: normalizeSkills(installMode, skills),
|
|
117
|
+
mcps: normalizeMcps(installMode, mcps),
|
|
97
118
|
};
|
|
98
119
|
}
|
|
99
120
|
if (!canPrompt()) {
|
|
100
|
-
throw new Error('Interactive prompts are unavailable. Pass --tools, --install-mode, and optionally --
|
|
121
|
+
throw new Error('Interactive prompts are unavailable. Pass --tools, --install-mode, and optionally --skills / --mcp or use --yes.');
|
|
101
122
|
}
|
|
102
123
|
let selectedTools = tools.length > 0 ? tools : undefined;
|
|
103
124
|
let selectedInstallMode = installMode;
|
|
104
|
-
let
|
|
125
|
+
let selectedSkills = skills.length > 0 ? skills : undefined;
|
|
126
|
+
let selectedMcps = mcps.length > 0 ? mcps : undefined;
|
|
127
|
+
/** 这里只记录支持返回的关键步骤,skills/MCP 通过显式清空完成回退。 */
|
|
105
128
|
const history = [];
|
|
106
129
|
while (true) {
|
|
107
130
|
if (!selectedTools) {
|
|
@@ -122,9 +145,9 @@ export async function resolveInitSelections(options) {
|
|
|
122
145
|
history.push('install-mode');
|
|
123
146
|
continue;
|
|
124
147
|
}
|
|
125
|
-
if (selectedInstallMode === 'custom' && !
|
|
126
|
-
const
|
|
127
|
-
if (
|
|
148
|
+
if (selectedInstallMode === 'custom' && !selectedSkills) {
|
|
149
|
+
const skillsResult = await promptSkills(history.length > 0);
|
|
150
|
+
if (skillsResult === GO_BACK) {
|
|
128
151
|
const previousStep = history.pop();
|
|
129
152
|
if (previousStep === 'install-mode') {
|
|
130
153
|
selectedInstallMode = undefined;
|
|
@@ -134,19 +157,25 @@ export async function resolveInitSelections(options) {
|
|
|
134
157
|
}
|
|
135
158
|
continue;
|
|
136
159
|
}
|
|
137
|
-
|
|
160
|
+
selectedSkills = skillsResult;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (selectedInstallMode === 'custom' && !selectedMcps) {
|
|
164
|
+
const mcpsResult = await promptMcps(true);
|
|
165
|
+
if (mcpsResult === GO_BACK) {
|
|
166
|
+
selectedSkills = undefined;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
selectedMcps = mcpsResult;
|
|
138
170
|
continue;
|
|
139
171
|
}
|
|
140
172
|
break;
|
|
141
173
|
}
|
|
142
|
-
if (selectedInstallMode === 'custom' &&
|
|
143
|
-
(!selectedCapabilities || selectedCapabilities.length === 0)) {
|
|
144
|
-
throw new Error('Custom install mode requires at least one capability.');
|
|
145
|
-
}
|
|
146
174
|
return {
|
|
147
175
|
tools: selectedTools,
|
|
148
176
|
installMode: selectedInstallMode,
|
|
149
|
-
|
|
177
|
+
skills: normalizeSkills(selectedInstallMode, selectedSkills ?? []),
|
|
178
|
+
mcps: normalizeMcps(selectedInstallMode, selectedMcps ?? []),
|
|
150
179
|
};
|
|
151
180
|
}
|
|
152
181
|
//# sourceMappingURL=init-options.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-options.js","sourceRoot":"","sources":["../../src/core/init-options.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"init-options.js","sourceRoot":"","sources":["../../src/core/init-options.ts"],"names":[],"mappings":"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"}
|
package/dist/core/init-plan.d.ts
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
|
-
import type { InitPlan, InitSelections, ProjectFacts } from '../types.js';
|
|
1
|
+
import type { InitPlan, InitSelections, ProjectFacts, SkillId, ToolId, WorkflowId } from '../types.js';
|
|
2
|
+
/** 各工具项目级 skill 根目录的事实源。 */
|
|
3
|
+
export declare function getProjectSkillRoot(tool: ToolId): string;
|
|
4
|
+
/** 返回某个远端 skill 在指定工具下的主目标路径。 */
|
|
5
|
+
export declare function getRemoteSkillTargetPath(tool: ToolId, skillId: SkillId): string;
|
|
6
|
+
/**
|
|
7
|
+
* 远端 skill 可能会安装成多个目录。
|
|
8
|
+
* 这里统一展开为“传给安装器的 skillName + 项目内目标路径”集合。
|
|
9
|
+
*/
|
|
10
|
+
export declare function getRemoteSkillInstallTargets(tool: ToolId, skillId: SkillId): Array<{
|
|
11
|
+
skillName: string;
|
|
12
|
+
targetPath: string;
|
|
13
|
+
}>;
|
|
14
|
+
/** 仅负责把命令模板里的 `<tool>` 替换成真实 tool 标识。 */
|
|
15
|
+
export declare function buildRemoteSkillInstallCommand(_skillId: SkillId, tool: ToolId, installCommandTemplate: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* workflow 的“已安装”判定依赖一组关键路径同时存在。
|
|
18
|
+
* 这里集中维护各工具下的目标路径矩阵。
|
|
19
|
+
*/
|
|
20
|
+
export declare function getWorkflowTargetPaths(tool: ToolId, workflowId: WorkflowId): string[];
|
|
21
|
+
/** 生成对外展示和失败提示用的 workflow 安装命令。 */
|
|
22
|
+
export declare function buildWorkflowInstallCommand(workflowId: WorkflowId, tool: ToolId): string;
|
|
23
|
+
/** 当前工具对应的项目级 MCP 配置文件路径。 */
|
|
24
|
+
export declare function getProjectMcpConfigPath(tool: ToolId): string;
|
|
25
|
+
/** `init` 主链路的纯计划构建入口,不在这里做真实文件写入。 */
|
|
2
26
|
export declare function createInitPlan(facts: ProjectFacts, selections: InitSelections): InitPlan;
|
|
3
27
|
//# sourceMappingURL=init-plan.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-plan.d.ts","sourceRoot":"","sources":["../../src/core/init-plan.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init-plan.d.ts","sourceRoot":"","sources":["../../src/core/init-plan.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EASd,YAAY,EACZ,OAAO,EACP,MAAM,EACN,UAAU,EACX,MAAM,aAAa,CAAA;AAgCpB,4BAA4B;AAC5B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,iCAAiC;AACjC,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAK/E;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GACf,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBlD;AAED,yCAAyC;AACzC,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,OAAO,EACjB,IAAI,EAAE,MAAM,EACZ,sBAAsB,EAAE,MAAM,GAC7B,MAAM,CAER;AAOD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,MAAM,EAAE,CAwBrF;AAED,mCAAmC;AACnC,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGxF;AAED,6BAA6B;AAC7B,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAgOD,sCAAsC;AACtC,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,GAAG,QAAQ,CAuBxF"}
|