@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
package/README.md
CHANGED
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
# SDT DevAgent
|
|
2
2
|
|
|
3
|
-
面向研发项目的全局 CLI
|
|
3
|
+
面向研发项目的全局 CLI,用于给现有仓库安装项目级 AI 协作接入能力。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
当前版本提供以下命令:
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
sdt-dev-agent init [targetPath]
|
|
9
|
+
sdt-dev-agent status [targetPath]
|
|
10
|
+
sdt-dev-agent list skills
|
|
11
|
+
sdt-dev-agent list mcp
|
|
12
|
+
sdt-dev-agent list workflows
|
|
13
|
+
sdt-dev-agent add skill <name>
|
|
14
|
+
sdt-dev-agent add mcp <name>
|
|
15
|
+
sdt-dev-agent add workflow <name>
|
|
9
16
|
```
|
|
10
17
|
|
|
11
|
-
|
|
18
|
+
它会围绕 bootstrap skill、项目级 skills、项目级 MCP、workflow 和安装清单来初始化或增量管理目标项目。
|
|
19
|
+
|
|
20
|
+
当前命令面只处理:
|
|
21
|
+
|
|
22
|
+
- `skills`
|
|
23
|
+
- `mcp`
|
|
24
|
+
- `workflows`
|
|
25
|
+
|
|
26
|
+
像 `OpenSpec` 这类工作流能力会进入 `list workflows` / `add workflow`,而不会混入普通 `skill`。
|
|
12
27
|
|
|
13
28
|
## Quick Start
|
|
14
29
|
|
|
@@ -36,21 +51,26 @@ sdt-dev-agent init . --yes
|
|
|
36
51
|
当前支持:
|
|
37
52
|
|
|
38
53
|
- tools: `codex`, `claude-code`
|
|
39
|
-
- install mode: `recommended`, `
|
|
40
|
-
-
|
|
54
|
+
- install mode: `recommended`, `custom`
|
|
55
|
+
- project-level skills path:
|
|
56
|
+
- `codex` -> `.agents/skills/`
|
|
57
|
+
- `claude-code` -> `.claude/skills/`
|
|
58
|
+
- project-level MCP path:
|
|
59
|
+
- `codex` -> `.codex/config.toml`
|
|
60
|
+
- `claude-code` -> `.mcp.json`
|
|
41
61
|
|
|
42
62
|
初始化输出包括:
|
|
43
63
|
|
|
44
|
-
-
|
|
45
|
-
- `
|
|
46
|
-
-
|
|
47
|
-
-
|
|
64
|
+
- `.sdt-devagent/bootstrap-project-docs.md`
|
|
65
|
+
- 必装 bootstrap skill:`bootstrap-project-docs`
|
|
66
|
+
- 远端推荐 skills 的项目级安装结果
|
|
67
|
+
- `Context7` / `MasterGo` 的项目级 MCP 配置
|
|
48
68
|
- `.sdt-devagent/manifest.json`
|
|
49
69
|
|
|
50
70
|
> [!NOTE]
|
|
51
|
-
>
|
|
71
|
+
> 当前只支持 `Codex` / `Claude Code` 的项目级接入,不包含业务任务编排、PR/发布流或服务端能力。
|
|
52
72
|
>
|
|
53
|
-
>
|
|
73
|
+
> 重复执行 `init` 时,bootstrap 入口文件和 manifest 会按最新模板直接覆盖;项目级 MCP 会按 server 维度去重合并,远端 skills 只按当前项目去重,项目里没有就安装到项目级。
|
|
54
74
|
|
|
55
75
|
## Development
|
|
56
76
|
|
|
@@ -94,13 +114,49 @@ pnpm run verify
|
|
|
94
114
|
pnpm run verify
|
|
95
115
|
```
|
|
96
116
|
|
|
97
|
-
|
|
117
|
+
正式版发布:
|
|
98
118
|
|
|
99
119
|
```bash
|
|
100
|
-
pnpm run release
|
|
120
|
+
pnpm run release # 等价于 pnpm run release:patch
|
|
101
121
|
pnpm run release:patch
|
|
102
122
|
pnpm run release:minor
|
|
103
123
|
pnpm run release:major
|
|
104
124
|
```
|
|
105
125
|
|
|
106
|
-
|
|
126
|
+
说明:
|
|
127
|
+
|
|
128
|
+
- `release` / `release:patch`:发布下一个 patch 版本到 npm `latest`
|
|
129
|
+
- `release:minor`:发布下一个 minor 版本到 npm `latest`
|
|
130
|
+
- `release:major`:发布下一个 major 版本到 npm `latest`
|
|
131
|
+
|
|
132
|
+
开发主线 beta 发布:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
BUILD_NUMBER=123 pnpm run release:beta
|
|
136
|
+
# 或
|
|
137
|
+
pnpm run release:beta -- 123
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
beta 流水线前置条件:
|
|
141
|
+
|
|
142
|
+
- 流水线需配置私密变量 `NPM_TOKEN`
|
|
143
|
+
- `NPM_TOKEN` 必须是对 `@shendu-sdt/sdt-dev-agent` 具备 publish 权限的 npm 官方 token
|
|
144
|
+
- beta 发布步骤需在运行时写入 npm 官方 registry 的 `/root/.npmrc`
|
|
145
|
+
- token 建议使用有限有效期并定期轮换,例如 `90 days`
|
|
146
|
+
|
|
147
|
+
推荐发布分支约定:
|
|
148
|
+
|
|
149
|
+
- `master`:正式版发布分支,默认手动发布,由发布人显式选择 `patch` / `minor` / `major`
|
|
150
|
+
- `dev`:beta 发布分支,默认由流水线自动执行 `pnpm run release:beta -- ${BUILD_NUMBER}`
|
|
151
|
+
|
|
152
|
+
版本规则:
|
|
153
|
+
|
|
154
|
+
- 正式版由发布人明确选择 `patch` / `minor` / `major`
|
|
155
|
+
- beta 会基于当前稳定版本生成“下一 patch 版本”的 `-beta.<buildId>` 版本号
|
|
156
|
+
- 例如当前版本是 `0.1.2`,则 beta 会发布为 `0.1.3-beta.123`
|
|
157
|
+
|
|
158
|
+
发布行为:
|
|
159
|
+
|
|
160
|
+
- 正式版发布到 npm `latest`
|
|
161
|
+
- beta 发布到 npm `beta`
|
|
162
|
+
- 发布脚本会先执行 `build`,再写入目标版本,然后对目标版本执行 `npm publish --dry-run`,最后发布到 npm 官方 registry
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CatalogMcp, CatalogSkill, CatalogWorkflow, McpId, SkillId, WorkflowId } from './types.js';
|
|
2
|
+
export declare const SKILL_CATALOG: CatalogSkill[];
|
|
3
|
+
export declare const MCP_CATALOG: CatalogMcp[];
|
|
4
|
+
export declare const WORKFLOW_CATALOG: CatalogWorkflow[];
|
|
5
|
+
export declare const REQUIRED_SKILL_ID: SkillId;
|
|
6
|
+
export declare const DEFAULT_SKILL_IDS: SkillId[];
|
|
7
|
+
export declare const OPTIONAL_SKILL_IDS: SkillId[];
|
|
8
|
+
export declare const DEFAULT_MCP_IDS: McpId[];
|
|
9
|
+
export declare const OPTIONAL_MCP_IDS: McpId[];
|
|
10
|
+
export declare const SKILL_IDS: SkillId[];
|
|
11
|
+
export declare const MCP_IDS: McpId[];
|
|
12
|
+
export declare const WORKFLOW_IDS: WorkflowId[];
|
|
13
|
+
export declare function getSkillCatalogEntry(skillId: SkillId): CatalogSkill;
|
|
14
|
+
export declare function getMcpCatalogEntry(mcpId: McpId): CatalogMcp;
|
|
15
|
+
export declare function getWorkflowCatalogEntry(workflowId: WorkflowId): CatalogWorkflow;
|
|
16
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,eAAe,EACf,KAAK,EACL,OAAO,EACP,UAAU,EAEX,MAAM,YAAY,CAAA;AA4CnB,eAAO,MAAM,aAAa,EAAE,YAAY,EAYL,CAAA;AAEnC,eAAO,MAAM,WAAW,EAAE,UAAU,EAmBH,CAAA;AAEjC,eAAO,MAAM,gBAAgB,EAAE,eAAe,EAUR,CAAA;AAEtC,eAAO,MAAM,iBAAiB,EAAE,OAAkC,CAAA;AAClE,eAAO,MAAM,iBAAiB,EAAE,OAAO,EAEb,CAAA;AAC1B,eAAO,MAAM,kBAAkB,EAAE,OAAO,EAEd,CAAA;AAC1B,eAAO,MAAM,eAAe,EAAE,KAAK,EAEb,CAAA;AACtB,eAAO,MAAM,gBAAgB,EAAE,KAAK,EAEd,CAAA;AAEtB,eAAO,MAAM,SAAS,EAAE,OAAO,EAEL,CAAA;AAC1B,eAAO,MAAM,OAAO,EAAE,KAAK,EAAqC,CAAA;AAChE,eAAO,MAAM,YAAY,EAAE,UAAU,EAAoD,CAAA;AAEzF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CAMnE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAM3D;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,eAAe,CAM/E"}
|
package/dist/catalog.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
const ALL_TOOLS = ['codex', 'claude-code'];
|
|
5
|
+
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const projectRoot = path.resolve(currentDir, '..');
|
|
7
|
+
function loadRemoteSkillCatalog() {
|
|
8
|
+
const raw = readFileSync(path.join(projectRoot, 'templates', 'skills', 'remote', 'catalog.json'), 'utf8');
|
|
9
|
+
const entries = JSON.parse(raw);
|
|
10
|
+
return entries.map((entry) => ({
|
|
11
|
+
id: entry.id,
|
|
12
|
+
displayName: entry.displayName,
|
|
13
|
+
description: entry.description,
|
|
14
|
+
sourceType: 'remote-recommended',
|
|
15
|
+
selection: entry.selection,
|
|
16
|
+
detectionMode: entry.detectionMode,
|
|
17
|
+
supportedTools: entry.supportedTools,
|
|
18
|
+
remote: {
|
|
19
|
+
source: entry.source,
|
|
20
|
+
installCommand: entry.installCommand,
|
|
21
|
+
installTargets: entry.installTargets,
|
|
22
|
+
},
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
export const SKILL_CATALOG = [
|
|
26
|
+
{
|
|
27
|
+
id: 'bootstrap-project-docs',
|
|
28
|
+
displayName: 'bootstrap-project-docs',
|
|
29
|
+
description: '初始化项目事实文档与工具规则文档的必装 bootstrap skill。',
|
|
30
|
+
sourceType: 'builtin-local',
|
|
31
|
+
selection: 'required',
|
|
32
|
+
detectionMode: 'single',
|
|
33
|
+
supportedTools: ALL_TOOLS,
|
|
34
|
+
templateDir: 'skills/builtin/bootstrap-project-docs',
|
|
35
|
+
},
|
|
36
|
+
...loadRemoteSkillCatalog(),
|
|
37
|
+
];
|
|
38
|
+
export const MCP_CATALOG = [
|
|
39
|
+
{
|
|
40
|
+
id: 'context7',
|
|
41
|
+
displayName: 'Context7',
|
|
42
|
+
description: '默认安装的项目级文档检索 MCP。',
|
|
43
|
+
sourceType: 'project-template',
|
|
44
|
+
selection: 'default',
|
|
45
|
+
supportedTools: ALL_TOOLS,
|
|
46
|
+
templateBaseDir: 'mcp/context7',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: 'mastergo',
|
|
50
|
+
displayName: 'MasterGo',
|
|
51
|
+
description: '选装设计稿 MCP。',
|
|
52
|
+
sourceType: 'project-template',
|
|
53
|
+
selection: 'optional',
|
|
54
|
+
supportedTools: ALL_TOOLS,
|
|
55
|
+
templateBaseDir: 'mcp/mastergo',
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
export const WORKFLOW_CATALOG = [
|
|
59
|
+
{
|
|
60
|
+
id: 'openspec',
|
|
61
|
+
displayName: 'OpenSpec',
|
|
62
|
+
description: '独立的 spec-driven workflow 工作流能力,不属于普通 skills 或 MCP。',
|
|
63
|
+
sourceType: 'workflow-integration',
|
|
64
|
+
supportedTools: ALL_TOOLS,
|
|
65
|
+
templateBaseDir: 'workflows/openspec',
|
|
66
|
+
installCommand: 'npx -y @fission-ai/openspec@latest init --tools <tool> --profile core .',
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
export const REQUIRED_SKILL_ID = 'bootstrap-project-docs';
|
|
70
|
+
export const DEFAULT_SKILL_IDS = SKILL_CATALOG.filter((skill) => skill.selection === 'default').map((skill) => skill.id);
|
|
71
|
+
export const OPTIONAL_SKILL_IDS = SKILL_CATALOG.filter((skill) => skill.selection === 'optional').map((skill) => skill.id);
|
|
72
|
+
export const DEFAULT_MCP_IDS = MCP_CATALOG.filter((mcp) => mcp.selection === 'default').map((mcp) => mcp.id);
|
|
73
|
+
export const OPTIONAL_MCP_IDS = MCP_CATALOG.filter((mcp) => mcp.selection === 'optional').map((mcp) => mcp.id);
|
|
74
|
+
export const SKILL_IDS = SKILL_CATALOG.filter((skill) => skill.id !== REQUIRED_SKILL_ID).map((skill) => skill.id);
|
|
75
|
+
export const MCP_IDS = MCP_CATALOG.map((mcp) => mcp.id);
|
|
76
|
+
export const WORKFLOW_IDS = WORKFLOW_CATALOG.map((workflow) => workflow.id);
|
|
77
|
+
export function getSkillCatalogEntry(skillId) {
|
|
78
|
+
const skill = SKILL_CATALOG.find((item) => item.id === skillId);
|
|
79
|
+
if (!skill) {
|
|
80
|
+
throw new Error(`Unknown skill catalog id: ${skillId}`);
|
|
81
|
+
}
|
|
82
|
+
return skill;
|
|
83
|
+
}
|
|
84
|
+
export function getMcpCatalogEntry(mcpId) {
|
|
85
|
+
const mcp = MCP_CATALOG.find((item) => item.id === mcpId);
|
|
86
|
+
if (!mcp) {
|
|
87
|
+
throw new Error(`Unknown MCP catalog id: ${mcpId}`);
|
|
88
|
+
}
|
|
89
|
+
return mcp;
|
|
90
|
+
}
|
|
91
|
+
export function getWorkflowCatalogEntry(workflowId) {
|
|
92
|
+
const workflow = WORKFLOW_CATALOG.find((item) => item.id === workflowId);
|
|
93
|
+
if (!workflow) {
|
|
94
|
+
throw new Error(`Unknown workflow catalog id: ${workflowId}`);
|
|
95
|
+
}
|
|
96
|
+
return workflow;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import { runAddMcpCommand, runAddSkillCommand, runAddWorkflowCommand } from '../commands/add.js';
|
|
2
3
|
import { runInitCommand } from '../commands/init.js';
|
|
4
|
+
import { runListMcpCommand, runListSkillsCommand, runListWorkflowsCommand, } from '../commands/list.js';
|
|
5
|
+
import { runStatusCommand } from '../commands/status.js';
|
|
3
6
|
const program = new Command();
|
|
4
7
|
program
|
|
5
8
|
.name('sdt-dev-agent')
|
|
@@ -7,10 +10,11 @@ program
|
|
|
7
10
|
.version('0.1.0');
|
|
8
11
|
program
|
|
9
12
|
.command('init [targetPath]')
|
|
10
|
-
.description('Initialize
|
|
13
|
+
.description('Initialize bootstrap skills, tool integrations, and MCP config in a project')
|
|
11
14
|
.option('--tools <tools>', 'Comma-separated tools: codex,claude-code')
|
|
12
|
-
.option('--install-mode <mode>', 'Install mode: recommended|
|
|
13
|
-
.option('--
|
|
15
|
+
.option('--install-mode <mode>', 'Install mode: recommended|custom')
|
|
16
|
+
.option('--skills <skills>', 'Comma-separated remote skill ids for custom install')
|
|
17
|
+
.option('--mcp <mcp>', 'Comma-separated MCP ids for custom install')
|
|
14
18
|
.option('--yes', 'Use default selections without prompting')
|
|
15
19
|
.action(async (targetPath = '.', options) => {
|
|
16
20
|
try {
|
|
@@ -22,5 +26,70 @@ program
|
|
|
22
26
|
process.exitCode = 1;
|
|
23
27
|
}
|
|
24
28
|
});
|
|
29
|
+
program
|
|
30
|
+
.command('status [targetPath]')
|
|
31
|
+
.description('Show current project capability status')
|
|
32
|
+
.action(async (targetPath = '.') => {
|
|
33
|
+
try {
|
|
34
|
+
await runStatusCommand(targetPath);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
38
|
+
console.error(message);
|
|
39
|
+
process.exitCode = 1;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
const listCommand = program.command('list').description('Show installable capability catalogs');
|
|
43
|
+
listCommand.command('skills').description('List installable skills').action(runListSkillsCommand);
|
|
44
|
+
listCommand.command('mcp').description('List installable MCP servers').action(runListMcpCommand);
|
|
45
|
+
listCommand
|
|
46
|
+
.command('workflows')
|
|
47
|
+
.description('List installable workflows')
|
|
48
|
+
.action(runListWorkflowsCommand);
|
|
49
|
+
const addCommand = program
|
|
50
|
+
.command('add')
|
|
51
|
+
.description('Add a skill, MCP, or workflow to an initialized project');
|
|
52
|
+
addCommand
|
|
53
|
+
.command('skill <name>')
|
|
54
|
+
.description('Add a skill to the initialized project')
|
|
55
|
+
.option('--tool <tool>', 'Limit installation to one initialized tool')
|
|
56
|
+
.action(async (name, options) => {
|
|
57
|
+
try {
|
|
58
|
+
await runAddSkillCommand(name, options);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
62
|
+
console.error(message);
|
|
63
|
+
process.exitCode = 1;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
addCommand
|
|
67
|
+
.command('mcp <name>')
|
|
68
|
+
.description('Add an MCP server to the initialized project')
|
|
69
|
+
.option('--tool <tool>', 'Limit installation to one initialized tool')
|
|
70
|
+
.action(async (name, options) => {
|
|
71
|
+
try {
|
|
72
|
+
await runAddMcpCommand(name, options);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
76
|
+
console.error(message);
|
|
77
|
+
process.exitCode = 1;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
addCommand
|
|
81
|
+
.command('workflow <name>')
|
|
82
|
+
.description('Add a workflow to the initialized project')
|
|
83
|
+
.option('--tool <tool>', 'Limit installation to one initialized tool')
|
|
84
|
+
.action(async (name, options) => {
|
|
85
|
+
try {
|
|
86
|
+
await runAddWorkflowCommand(name, options);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
90
|
+
console.error(message);
|
|
91
|
+
process.exitCode = 1;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
25
94
|
await program.parseAsync(process.argv);
|
|
26
95
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface AddCommandOptions {
|
|
2
|
+
tool?: string;
|
|
3
|
+
}
|
|
4
|
+
export declare function runAddSkillCommand(skillId: string, options?: AddCommandOptions): Promise<void>;
|
|
5
|
+
export declare function runAddWorkflowCommand(workflowId: string, options?: AddCommandOptions): Promise<void>;
|
|
6
|
+
export declare function runAddMcpCommand(mcpId: string, options?: AddCommandOptions): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=add.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AA8CA,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AA6FD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAsFf;AAED,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA2Ef;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAwEf"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { MCP_CATALOG, SKILL_CATALOG, WORKFLOW_CATALOG, getMcpCatalogEntry, getSkillCatalogEntry, getWorkflowCatalogEntry, } from '../catalog.js';
|
|
3
|
+
import { detectSkillAvailability, detectWorkflowAvailability, } from '../core/capability-discovery.js';
|
|
4
|
+
import { readInstallManifest, writeInstallManifest } from '../core/manifest.js';
|
|
5
|
+
import { buildClaudeMcpConfig, buildCodexMcpConfig, mergeMcpConfig, parseConfiguredMcpIds, } from '../core/mcp-config.js';
|
|
6
|
+
import { buildWorkflowInstallCommand, buildRemoteSkillInstallCommand, getProjectMcpConfigPath, getRemoteSkillInstallTargets, getRemoteSkillTargetPath, getWorkflowTargetPaths, } from '../core/init-plan.js';
|
|
7
|
+
import { installRemoteSkill } from '../core/remote-skill-installer.js';
|
|
8
|
+
import { installWorkflow } from '../core/workflow-installer.js';
|
|
9
|
+
import { exists, readText, writeText } from '../utils/fs.js';
|
|
10
|
+
import { printMastergoTokenNotice } from '../utils/mastergo-notice.js';
|
|
11
|
+
import { withTerminalTone } from '../utils/terminal-theme.js';
|
|
12
|
+
function resolveTargetTools(manifest, requestedTool) {
|
|
13
|
+
if (!requestedTool) {
|
|
14
|
+
return manifest.tools;
|
|
15
|
+
}
|
|
16
|
+
if (!manifest.tools.includes(requestedTool)) {
|
|
17
|
+
throw new Error(`Tool is not initialized in this project: ${requestedTool}`);
|
|
18
|
+
}
|
|
19
|
+
return [requestedTool];
|
|
20
|
+
}
|
|
21
|
+
function ensureSkillRecord(manifest, skillId) {
|
|
22
|
+
const existing = manifest.skills.find((skill) => skill.id === skillId);
|
|
23
|
+
if (existing) {
|
|
24
|
+
return existing;
|
|
25
|
+
}
|
|
26
|
+
const skill = getSkillCatalogEntry(skillId);
|
|
27
|
+
const record = {
|
|
28
|
+
id: skillId,
|
|
29
|
+
selection: skill.selection,
|
|
30
|
+
sourceType: skill.sourceType,
|
|
31
|
+
installs: [],
|
|
32
|
+
};
|
|
33
|
+
manifest.skills.push(record);
|
|
34
|
+
return record;
|
|
35
|
+
}
|
|
36
|
+
function ensureMcpRecord(manifest, mcpId) {
|
|
37
|
+
const existing = manifest.mcps.find((mcp) => mcp.id === mcpId);
|
|
38
|
+
if (existing) {
|
|
39
|
+
return existing;
|
|
40
|
+
}
|
|
41
|
+
const mcp = getMcpCatalogEntry(mcpId);
|
|
42
|
+
const record = {
|
|
43
|
+
id: mcpId,
|
|
44
|
+
selection: mcp.selection,
|
|
45
|
+
sourceType: mcp.sourceType,
|
|
46
|
+
installs: [],
|
|
47
|
+
};
|
|
48
|
+
manifest.mcps.push(record);
|
|
49
|
+
return record;
|
|
50
|
+
}
|
|
51
|
+
function ensureWorkflowRecord(manifest, workflowId) {
|
|
52
|
+
const existing = manifest.workflows.find((workflow) => workflow.id === workflowId);
|
|
53
|
+
if (existing) {
|
|
54
|
+
return existing;
|
|
55
|
+
}
|
|
56
|
+
const workflow = getWorkflowCatalogEntry(workflowId);
|
|
57
|
+
const record = {
|
|
58
|
+
id: workflowId,
|
|
59
|
+
sourceType: workflow.sourceType,
|
|
60
|
+
installs: [],
|
|
61
|
+
};
|
|
62
|
+
manifest.workflows.push(record);
|
|
63
|
+
return record;
|
|
64
|
+
}
|
|
65
|
+
function printAddProgressStart(kind, id, tool, index, total) {
|
|
66
|
+
const label = kind === 'skill' ? 'Installing' : kind === 'mcp' ? 'Applying' : 'Installing';
|
|
67
|
+
console.log(`${label} ${kind} ${index}/${total}: ${id} (${tool})...`);
|
|
68
|
+
}
|
|
69
|
+
function formatInstallStatusLine(line, status) {
|
|
70
|
+
if (status === 'installed') {
|
|
71
|
+
return withTerminalTone(line, 'success');
|
|
72
|
+
}
|
|
73
|
+
if (status === 'failed') {
|
|
74
|
+
return withTerminalTone(line, 'failure');
|
|
75
|
+
}
|
|
76
|
+
return line;
|
|
77
|
+
}
|
|
78
|
+
export async function runAddSkillCommand(skillId, options = {}) {
|
|
79
|
+
if (!SKILL_CATALOG.some((skill) => skill.id === skillId)) {
|
|
80
|
+
throw new Error(`Unknown skill: ${skillId}`);
|
|
81
|
+
}
|
|
82
|
+
const projectRoot = process.cwd();
|
|
83
|
+
const manifest = await readInstallManifest(projectRoot);
|
|
84
|
+
const tools = resolveTargetTools(manifest, options.tool);
|
|
85
|
+
const skill = getSkillCatalogEntry(skillId);
|
|
86
|
+
const skillRecord = ensureSkillRecord(manifest, skill.id);
|
|
87
|
+
console.log(`Adding skill: ${skill.id}`);
|
|
88
|
+
for (const [index, tool] of tools.entries()) {
|
|
89
|
+
printAddProgressStart('skill', skill.id, tool, index + 1, tools.length);
|
|
90
|
+
const availability = await detectSkillAvailability(projectRoot, tool, skill.id);
|
|
91
|
+
const targetPath = getRemoteSkillTargetPath(tool, skill.id);
|
|
92
|
+
const installTargets = getRemoteSkillInstallTargets(tool, skill.id);
|
|
93
|
+
const installCommand = skill.remote
|
|
94
|
+
? buildRemoteSkillInstallCommand(skill.id, tool, skill.remote.installCommand)
|
|
95
|
+
: undefined;
|
|
96
|
+
const existingInstall = skillRecord.installs.find((install) => install.tool === tool);
|
|
97
|
+
if (availability.status === 'already-present') {
|
|
98
|
+
if (existingInstall) {
|
|
99
|
+
existingInstall.status = availability.status;
|
|
100
|
+
existingInstall.reason = availability.reason;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
skillRecord.installs.push({
|
|
104
|
+
tool,
|
|
105
|
+
status: availability.status,
|
|
106
|
+
reason: availability.reason,
|
|
107
|
+
path: targetPath,
|
|
108
|
+
source: skill.remote?.source,
|
|
109
|
+
installCommand,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
console.log(formatInstallStatusLine(`- ${skill.id} (${tool}) ${availability.status}`, availability.status));
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (!skill.remote) {
|
|
116
|
+
throw new Error(`Builtin skill is not supported by add yet: ${skill.id}`);
|
|
117
|
+
}
|
|
118
|
+
const result = await installRemoteSkill(projectRoot, {
|
|
119
|
+
tool,
|
|
120
|
+
skillId: skill.id,
|
|
121
|
+
targetPath,
|
|
122
|
+
installTargets,
|
|
123
|
+
source: skill.remote.source,
|
|
124
|
+
installCommand: installCommand ?? skill.remote.installCommand,
|
|
125
|
+
});
|
|
126
|
+
if (!existingInstall) {
|
|
127
|
+
skillRecord.installs.push({
|
|
128
|
+
tool,
|
|
129
|
+
status: result.success ? 'installed' : 'failed',
|
|
130
|
+
reason: result.success ? undefined : 'install-failed',
|
|
131
|
+
path: targetPath,
|
|
132
|
+
source: skill.remote.source,
|
|
133
|
+
installCommand,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
existingInstall.status = result.success ? 'installed' : 'failed';
|
|
138
|
+
existingInstall.reason = result.success ? undefined : 'install-failed';
|
|
139
|
+
}
|
|
140
|
+
console.log(formatInstallStatusLine(`- ${skill.id} (${tool}) ${result.success ? 'installed' : 'failed'}`, result.success ? 'installed' : 'failed'));
|
|
141
|
+
if (!result.success) {
|
|
142
|
+
console.log(withTerminalTone(` retry: ${installCommand}`, 'failure'));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
await writeInstallManifest(projectRoot, manifest);
|
|
146
|
+
}
|
|
147
|
+
export async function runAddWorkflowCommand(workflowId, options = {}) {
|
|
148
|
+
if (!WORKFLOW_CATALOG.some((workflow) => workflow.id === workflowId)) {
|
|
149
|
+
throw new Error(`Unknown workflow: ${workflowId}`);
|
|
150
|
+
}
|
|
151
|
+
const projectRoot = process.cwd();
|
|
152
|
+
const manifest = await readInstallManifest(projectRoot);
|
|
153
|
+
const tools = resolveTargetTools(manifest, options.tool);
|
|
154
|
+
const workflow = getWorkflowCatalogEntry(workflowId);
|
|
155
|
+
const workflowRecord = ensureWorkflowRecord(manifest, workflow.id);
|
|
156
|
+
console.log(`Adding workflow: ${workflow.id}`);
|
|
157
|
+
for (const [index, tool] of tools.entries()) {
|
|
158
|
+
printAddProgressStart('workflow', workflow.id, tool, index + 1, tools.length);
|
|
159
|
+
const availability = await detectWorkflowAvailability(projectRoot, tool, workflow.id);
|
|
160
|
+
const targetPaths = getWorkflowTargetPaths(tool, workflow.id);
|
|
161
|
+
const installCommand = buildWorkflowInstallCommand(workflow.id, tool);
|
|
162
|
+
const primaryPath = targetPaths[0] ?? '.';
|
|
163
|
+
const existingInstall = workflowRecord.installs.find((install) => install.tool === tool);
|
|
164
|
+
if (availability.status === 'already-present') {
|
|
165
|
+
if (existingInstall) {
|
|
166
|
+
existingInstall.status = availability.status;
|
|
167
|
+
existingInstall.reason = availability.reason;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
workflowRecord.installs.push({
|
|
171
|
+
tool,
|
|
172
|
+
status: availability.status,
|
|
173
|
+
reason: availability.reason,
|
|
174
|
+
path: primaryPath,
|
|
175
|
+
installCommand,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
console.log(formatInstallStatusLine(`- ${workflow.id} (${tool}) ${availability.status}`, availability.status));
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const result = await installWorkflow(projectRoot, {
|
|
182
|
+
tool,
|
|
183
|
+
workflowId: workflow.id,
|
|
184
|
+
installCommand,
|
|
185
|
+
});
|
|
186
|
+
if (!existingInstall) {
|
|
187
|
+
workflowRecord.installs.push({
|
|
188
|
+
tool,
|
|
189
|
+
status: result.success ? 'installed' : 'failed',
|
|
190
|
+
reason: result.success ? undefined : 'install-failed',
|
|
191
|
+
path: primaryPath,
|
|
192
|
+
installCommand,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
existingInstall.status = result.success ? 'installed' : 'failed';
|
|
197
|
+
existingInstall.reason = result.success ? undefined : 'install-failed';
|
|
198
|
+
}
|
|
199
|
+
console.log(formatInstallStatusLine(`- ${workflow.id} (${tool}) ${result.success ? 'installed' : 'failed'}`, result.success ? 'installed' : 'failed'));
|
|
200
|
+
if (!result.success) {
|
|
201
|
+
console.log(withTerminalTone(` retry: ${installCommand}`, 'failure'));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
await writeInstallManifest(projectRoot, manifest);
|
|
205
|
+
}
|
|
206
|
+
export async function runAddMcpCommand(mcpId, options = {}) {
|
|
207
|
+
if (!MCP_CATALOG.some((mcp) => mcp.id === mcpId)) {
|
|
208
|
+
throw new Error(`Unknown MCP: ${mcpId}`);
|
|
209
|
+
}
|
|
210
|
+
const projectRoot = process.cwd();
|
|
211
|
+
const manifest = await readInstallManifest(projectRoot);
|
|
212
|
+
const tools = resolveTargetTools(manifest, options.tool);
|
|
213
|
+
const mcp = getMcpCatalogEntry(mcpId);
|
|
214
|
+
const mcpRecord = ensureMcpRecord(manifest, mcp.id);
|
|
215
|
+
console.log(`Adding MCP: ${mcp.id}`);
|
|
216
|
+
const mastergoNoticeInstalls = [];
|
|
217
|
+
for (const [index, tool] of tools.entries()) {
|
|
218
|
+
printAddProgressStart('mcp', mcp.id, tool, index + 1, tools.length);
|
|
219
|
+
const configPath = getProjectMcpConfigPath(tool);
|
|
220
|
+
const absolutePath = path.join(projectRoot, configPath);
|
|
221
|
+
const existingInstall = mcpRecord.installs.find((install) => install.tool === tool);
|
|
222
|
+
if (await exists(absolutePath)) {
|
|
223
|
+
const current = await readText(absolutePath);
|
|
224
|
+
const configured = parseConfiguredMcpIds(tool, current);
|
|
225
|
+
if (configured.has(mcp.id)) {
|
|
226
|
+
if (existingInstall) {
|
|
227
|
+
existingInstall.status = 'already-present';
|
|
228
|
+
existingInstall.reason = 'already-present';
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
mcpRecord.installs.push({
|
|
232
|
+
tool,
|
|
233
|
+
status: 'already-present',
|
|
234
|
+
reason: 'already-present',
|
|
235
|
+
path: configPath,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
console.log(formatInstallStatusLine(`- ${mcp.id} (${tool}) already-present`, 'already-present'));
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
await writeText(absolutePath, mergeMcpConfig(tool, current, [mcp.id]));
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
await writeText(absolutePath, tool === 'codex' ? buildCodexMcpConfig([mcp.id]) : buildClaudeMcpConfig([mcp.id]));
|
|
245
|
+
}
|
|
246
|
+
if (existingInstall) {
|
|
247
|
+
existingInstall.status = 'installed';
|
|
248
|
+
existingInstall.reason = undefined;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
mcpRecord.installs.push({
|
|
252
|
+
tool,
|
|
253
|
+
status: 'installed',
|
|
254
|
+
path: configPath,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
console.log(formatInstallStatusLine(`- ${mcp.id} (${tool}) installed`, 'installed'));
|
|
258
|
+
if (mcp.id === 'mastergo') {
|
|
259
|
+
mastergoNoticeInstalls.push({ tool, path: configPath });
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
await writeInstallManifest(projectRoot, manifest);
|
|
263
|
+
if (mcp.id === 'mastergo') {
|
|
264
|
+
printMastergoTokenNotice(mastergoNoticeInstalls);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|