@shendu-sdt/sdt-dev-agent 0.1.3-beta.10 → 0.1.3-beta.20260519145111

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +80 -21
  2. package/dist/catalog/index.d.ts +4 -0
  3. package/dist/catalog/index.d.ts.map +1 -0
  4. package/dist/catalog/index.js +4 -0
  5. package/dist/catalog/index.js.map +1 -0
  6. package/dist/catalog/mcp.d.ts +12 -0
  7. package/dist/catalog/mcp.d.ts.map +1 -0
  8. package/dist/catalog/mcp.js +37 -0
  9. package/dist/catalog/mcp.js.map +1 -0
  10. package/dist/catalog/shared.d.ts +5 -0
  11. package/dist/catalog/shared.d.ts.map +1 -0
  12. package/dist/catalog/shared.js +8 -0
  13. package/dist/catalog/shared.js.map +1 -0
  14. package/dist/catalog/skills.d.ts +14 -0
  15. package/dist/catalog/skills.d.ts.map +1 -0
  16. package/dist/catalog/skills.js +55 -0
  17. package/dist/catalog/skills.js.map +1 -0
  18. package/dist/catalog/workflows.d.ts +8 -0
  19. package/dist/catalog/workflows.d.ts.map +1 -0
  20. package/dist/catalog/workflows.js +24 -0
  21. package/dist/catalog/workflows.js.map +1 -0
  22. package/dist/commands/add.d.ts.map +1 -1
  23. package/dist/commands/add.js +158 -125
  24. package/dist/commands/add.js.map +1 -1
  25. package/dist/commands/init.d.ts.map +1 -1
  26. package/dist/commands/init.js +56 -7
  27. package/dist/commands/init.js.map +1 -1
  28. package/dist/commands/list.js +1 -1
  29. package/dist/commands/list.js.map +1 -1
  30. package/dist/commands/status.d.ts.map +1 -1
  31. package/dist/commands/status.js +1 -1
  32. package/dist/commands/status.js.map +1 -1
  33. package/dist/core/bootstrap-entry.d.ts +5 -0
  34. package/dist/core/bootstrap-entry.d.ts.map +1 -0
  35. package/dist/core/bootstrap-entry.js +9 -0
  36. package/dist/core/bootstrap-entry.js.map +1 -0
  37. package/dist/core/capability-discovery.js +1 -1
  38. package/dist/core/capability-discovery.js.map +1 -1
  39. package/dist/core/hook-config.d.ts +19 -0
  40. package/dist/core/hook-config.d.ts.map +1 -0
  41. package/dist/core/hook-config.js +162 -0
  42. package/dist/core/hook-config.js.map +1 -0
  43. package/dist/core/init-options.d.ts.map +1 -1
  44. package/dist/core/init-options.js +7 -5
  45. package/dist/core/init-options.js.map +1 -1
  46. package/dist/core/init-plan.d.ts +1 -1
  47. package/dist/core/init-plan.d.ts.map +1 -1
  48. package/dist/core/init-plan.js +98 -32
  49. package/dist/core/init-plan.js.map +1 -1
  50. package/dist/core/init-writer.d.ts.map +1 -1
  51. package/dist/core/init-writer.js +109 -4
  52. package/dist/core/init-writer.js.map +1 -1
  53. package/dist/core/manifest.d.ts.map +1 -1
  54. package/dist/core/manifest.js +4 -2
  55. package/dist/core/manifest.js.map +1 -1
  56. package/dist/core/mcp-config.d.ts +3 -2
  57. package/dist/core/mcp-config.d.ts.map +1 -1
  58. package/dist/core/mcp-config.js +69 -27
  59. package/dist/core/mcp-config.js.map +1 -1
  60. package/dist/core/project-inspector.d.ts.map +1 -1
  61. package/dist/core/project-inspector.js +2 -1
  62. package/dist/core/project-inspector.js.map +1 -1
  63. package/dist/core/tool-profile.d.ts +41 -0
  64. package/dist/core/tool-profile.d.ts.map +1 -0
  65. package/dist/core/tool-profile.js +122 -0
  66. package/dist/core/tool-profile.js.map +1 -0
  67. package/dist/core/workflow-installer.d.ts.map +1 -1
  68. package/dist/core/workflow-installer.js +2 -1
  69. package/dist/core/workflow-installer.js.map +1 -1
  70. package/dist/types.d.ts +19 -1
  71. package/dist/types.d.ts.map +1 -1
  72. package/dist/types.js +2 -0
  73. package/dist/types.js.map +1 -1
  74. package/dist/utils/init-welcome.d.ts +1 -0
  75. package/dist/utils/init-welcome.d.ts.map +1 -1
  76. package/dist/utils/init-welcome.js +33 -9
  77. package/dist/utils/init-welcome.js.map +1 -1
  78. package/dist/utils/json.d.ts +3 -0
  79. package/dist/utils/json.d.ts.map +1 -0
  80. package/dist/utils/json.js +11 -0
  81. package/dist/utils/json.js.map +1 -0
  82. package/dist/utils/progress-spinner.d.ts +22 -0
  83. package/dist/utils/progress-spinner.d.ts.map +1 -0
  84. package/dist/utils/progress-spinner.js +74 -0
  85. package/dist/utils/progress-spinner.js.map +1 -0
  86. package/package.json +3 -6
  87. package/templates/bootstrap/project-entry.md +16 -5
  88. package/templates/hooks/claude-code/bootstrap-project-docs-context.mjs +38 -0
  89. package/templates/hooks/claude-code/settings.json +36 -0
  90. package/templates/hooks/codex/bootstrap-project-docs-context.mjs +38 -0
  91. package/templates/hooks/codex/config.toml +16 -0
  92. package/templates/rules/claude-code/CLAUDE.md +17 -0
  93. package/templates/rules/codex/AGENTS.md +17 -0
  94. package/templates/skills/builtin/bootstrap-project-docs/SKILL.md +25 -11
  95. package/templates/skills/builtin/bootstrap-project-docs/agents/openai.yaml +4 -0
  96. package/templates/skills/builtin/bootstrap-project-docs/references/architecture-first.md +16 -4
  97. package/templates/skills/builtin/bootstrap-project-docs/references/doc-state-routing.md +28 -0
  98. package/templates/skills/builtin/bootstrap-project-docs/references/tool-rules-follow-up.md +19 -4
  99. package/dist/catalog.d.ts +0 -16
  100. package/dist/catalog.d.ts.map +0 -1
  101. package/dist/catalog.js +0 -98
  102. package/dist/catalog.js.map +0 -1
package/README.md CHANGED
@@ -17,14 +17,6 @@ sdt-dev-agent add workflow <name>
17
17
 
18
18
  它会围绕 bootstrap skill、项目级 skills、项目级 MCP、workflow 和安装清单来初始化或增量管理目标项目。
19
19
 
20
- 当前命令面只处理:
21
-
22
- - `skills`
23
- - `mcp`
24
- - `workflows`
25
-
26
- 像 `OpenSpec` 这类工作流能力会进入 `list workflows` / `add workflow`,而不会混入普通 `skill`。
27
-
28
20
  ## Quick Start
29
21
 
30
22
  **Requires Node.js 20.19.0 or higher.**
@@ -48,29 +40,71 @@ sdt-dev-agent init .
48
40
  sdt-dev-agent init . --yes
49
41
  ```
50
42
 
43
+ ## Supported Tools
44
+
51
45
  当前支持:
52
46
 
53
47
  - tools: `codex`, `claude-code`
54
48
  - 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`
49
+
50
+ ## Built-in Capabilities
51
+
52
+ 当前命令面只处理三类 capability:
53
+
54
+ - `skills`
55
+ - `mcp`
56
+ - `workflows`
57
+
58
+ 当前内置能力可以概括为:
59
+
60
+ - `skills`
61
+ - 必装 bootstrap skill:`bootstrap-project-docs`
62
+ - 内置推荐远端 skills,可按 `recommended` 或 `custom` 安装
63
+ - `mcp`
64
+ - 默认 MCP:`Context7`
65
+ - 选装 MCP:`MasterGo`
66
+ - `workflows`
67
+ - 独立 workflow:`OpenSpec`
68
+ - 不会混入普通 `skill`;使用 `list workflows` / `add workflow` 管理
61
69
 
62
70
  初始化输出包括:
63
71
 
72
+ - 根级前置入口文档:`AGENTS.md` / `CLAUDE.md`
64
73
  - `.sdt-devagent/bootstrap-project-docs.md`
65
74
  - 必装 bootstrap skill:`bootstrap-project-docs`
75
+ - `Codex` / `Claude Code` 的项目级 hooks 增强配置
66
76
  - 远端推荐 skills 的项目级安装结果
67
77
  - `Context7` / `MasterGo` 的项目级 MCP 配置
68
78
  - `.sdt-devagent/manifest.json`
69
79
 
80
+ ## Discover And Install
81
+
82
+ 查看当前内置项:
83
+
84
+ ```bash
85
+ sdt-dev-agent list skills
86
+ sdt-dev-agent list mcp
87
+ sdt-dev-agent list workflows
88
+ ```
89
+
90
+ 增量安装:
91
+
92
+ ```bash
93
+ sdt-dev-agent add skill <name>
94
+ sdt-dev-agent add mcp <name>
95
+ sdt-dev-agent add workflow <name>
96
+ ```
97
+
70
98
  > [!NOTE]
71
99
  > 当前只支持 `Codex` / `Claude Code` 的项目级接入,不包含业务任务编排、PR/发布流或服务端能力。
72
100
  >
73
- > 重复执行 `init` 时,bootstrap 入口文件和 manifest 会按最新模板直接覆盖;项目级 MCP 会按 server 维度去重合并,远端 skills 只按当前项目去重,项目里没有就安装到项目级。
101
+ > 重复执行 `init` 时,CLI 托管的 bootstrap 入口文件和 manifest 会按最新模板直接覆盖;用户已有 `AGENTS.md` / `CLAUDE.md` 会保留并提示人工合并。
102
+ >
103
+ > 如果项目层已经存在 `.codex/hooks.json`,CLI 不会再把托管 hooks 混写进同层 `.codex/config.toml`;会把 Codex hooks 标记成 degraded,并继续保留入口文档、bootstrap skill 和 MCP。
104
+ >
105
+ > `Codex` 的项目级 hooks 首次还需要在 `/hooks` 里完成 trust review,文件已写入不等于该 hooks 已经开始执行。
106
+ >
107
+ > 如果远端 skill 安装失败,CLI 会保留已成功写入的本地文件与 manifest 状态,并输出 retry 命令;但本次 `init` 会以非零退出,避免把“部分成功”误判成“初始化完成”。
74
108
 
75
109
  ## Development
76
110
 
@@ -114,6 +148,8 @@ pnpm run verify
114
148
  pnpm run verify
115
149
  ```
116
150
 
151
+ `verify` 当前会依次执行:`typecheck -> lint -> test -> build`。
152
+
117
153
  正式版发布:
118
154
 
119
155
  ```bash
@@ -121,6 +157,8 @@ pnpm run release # 等价于 pnpm run release:patch
121
157
  pnpm run release:patch
122
158
  pnpm run release:minor
123
159
  pnpm run release:major
160
+ # 已确认要发布时可跳过二次确认
161
+ pnpm run release:patch -- --yes
124
162
  ```
125
163
 
126
164
  说明:
@@ -132,9 +170,13 @@ pnpm run release:major
132
170
  开发主线 beta 发布:
133
171
 
134
172
  ```bash
135
- BUILD_NUMBER=123 pnpm run release:beta
136
- #
137
- pnpm run release:beta -- 123
173
+ pnpm run release:beta
174
+ # 或手动指定 buildId
175
+ pnpm run release:beta -- 20260519143000
176
+ # 或兼容旧方式
177
+ BUILD_NUMBER=20260519143000 pnpm run release:beta
178
+ # 已确认要发布时可跳过二次确认
179
+ pnpm run release:beta -- 20260519143000 --yes
138
180
  ```
139
181
 
140
182
  beta 流水线前置条件:
@@ -147,16 +189,33 @@ beta 流水线前置条件:
147
189
  推荐发布分支约定:
148
190
 
149
191
  - `master`:正式版发布分支,默认手动发布,由发布人显式选择 `patch` / `minor` / `major`
150
- - `dev`:beta 发布分支,默认由流水线自动执行 `pnpm run release:beta -- ${BUILD_NUMBER}`
192
+ - `dev`:beta 发布分支,默认由发布人本地执行 `pnpm run release:beta`
193
+
194
+ 脚本强校验:
195
+
196
+ - 执行 `pnpm run release:beta` 时,当前分支必须是 `dev`
197
+ - 执行正式版发布命令时,当前分支必须是 `master`
198
+ - 发布前工作区必须干净,不能存在本地未提交修改
199
+ - 发布前本地分支必须与对应远端分支完全同步
200
+ - beta 对应 `origin/dev`
201
+ - 正式版对应 `origin/master`
202
+ - 在本地交互终端执行发布命令时,脚本会先给出一次二次确认;传 `--yes` 才会跳过
203
+ - 任一条件不满足时,发布脚本会直接报错并停止,不会继续写版本号或执行 `npm publish`
151
204
 
152
205
  版本规则:
153
206
 
154
207
  - 正式版由发布人明确选择 `patch` / `minor` / `major`
155
208
  - beta 会基于当前稳定版本生成“下一 patch 版本”的 `-beta.<buildId>` 版本号
156
- - 例如当前版本是 `0.1.2`,则 beta 会发布为 `0.1.3-beta.123`
209
+ - 不传参时,`buildId` 默认使用本地时间的 `YYYYMMDDHHmmss`
210
+ - 例如当前版本是 `0.1.2`,本地执行后可能发布为 `0.1.3-beta.20260519143000`
157
211
 
158
212
  发布行为:
159
213
 
160
214
  - 正式版发布到 npm `latest`
161
215
  - beta 发布到 npm `beta`
162
- - 发布脚本会先执行 `build`,再写入目标版本,然后对目标版本执行 `npm publish --dry-run`,最后发布到 npm 官方 registry
216
+ - 发布脚本会先执行 `verify`(包含 `typecheck`、`lint`、`test`、`build`),再对目标发布物执行 `npm publish --dry-run`,最后发布到 npm 官方 registry
217
+ - beta 发布会在临时目录里生成带 beta 版本号的 tarball 并发布,不会改动当前工作区里的 `package.json`
218
+ - 正式版发布会在 `master` 上执行正式的 `npm version`,生成版本变更、release commit 和 git tag;npm 发布成功后,脚本会自动执行 `git push origin master --follow-tags`
219
+ - 如果正式版的自动 push 失败,说明 npm 已发布成功,但远端分支和 tag 还没同步;处理完 git 问题后,手动执行一次 `git push origin master --follow-tags`
220
+ - 正式版发布完成后,仍需要按团队分支流把 `master` 的版本提交回合到 `dev`
221
+ - 执行 beta 发布前,发布机仍然需要具备 npm 官方 registry 的发布权限
@@ -0,0 +1,4 @@
1
+ export { DEFAULT_SKILL_IDS, getSkillCatalogEntry, OPTIONAL_SKILL_IDS, REQUIRED_SKILL_ID, SKILL_CATALOG, SKILL_IDS, } from './skills.js';
2
+ export { DEFAULT_MCP_IDS, getMcpCatalogEntry, MCP_CATALOG, MCP_IDS, OPTIONAL_MCP_IDS, } from './mcp.js';
3
+ export { getWorkflowCatalogEntry, WORKFLOW_CATALOG, WORKFLOW_IDS } from './workflows.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,SAAS,GACV,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,OAAO,EACP,gBAAgB,GACjB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { DEFAULT_SKILL_IDS, getSkillCatalogEntry, OPTIONAL_SKILL_IDS, REQUIRED_SKILL_ID, SKILL_CATALOG, SKILL_IDS, } from './skills.js';
2
+ export { DEFAULT_MCP_IDS, getMcpCatalogEntry, MCP_CATALOG, MCP_IDS, OPTIONAL_MCP_IDS, } from './mcp.js';
3
+ export { getWorkflowCatalogEntry, WORKFLOW_CATALOG, WORKFLOW_IDS } from './workflows.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,SAAS,GACV,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,OAAO,EACP,gBAAgB,GACjB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { CatalogMcp, McpId } from '../types.js';
2
+ /** MCP 能力清单,模板目录是运行时生成项目级配置的事实源。 */
3
+ export declare const MCP_CATALOG: CatalogMcp[];
4
+ /** 推荐模式下默认安装的 MCP ID 集合。 */
5
+ export declare const DEFAULT_MCP_IDS: McpId[];
6
+ /** 可选但非默认安装的 MCP ID 集合。 */
7
+ export declare const OPTIONAL_MCP_IDS: McpId[];
8
+ /** 对外暴露给 `list/add` 的 MCP ID 集合。 */
9
+ export declare const MCP_IDS: McpId[];
10
+ /** 按稳定 ID 读取单个 MCP catalog 项。 */
11
+ export declare function getMcpCatalogEntry(mcpId: McpId): CatalogMcp;
12
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/catalog/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAGpD,oCAAoC;AACpC,eAAO,MAAM,WAAW,EAAE,UAAU,EAmBH,CAAA;AAEjC,4BAA4B;AAC5B,eAAO,MAAM,eAAe,EAAE,KAAK,EAEb,CAAA;AAEtB,2BAA2B;AAC3B,eAAO,MAAM,gBAAgB,EAAE,KAAK,EAEd,CAAA;AAEtB,oCAAoC;AACpC,eAAO,MAAM,OAAO,EAAE,KAAK,EAAqC,CAAA;AAEhE,iCAAiC;AACjC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAM3D"}
@@ -0,0 +1,37 @@
1
+ import { ALL_TOOLS } from './shared.js';
2
+ /** MCP 能力清单,模板目录是运行时生成项目级配置的事实源。 */
3
+ export const MCP_CATALOG = [
4
+ {
5
+ id: 'context7',
6
+ displayName: 'Context7',
7
+ description: '默认安装的项目级文档检索 MCP。',
8
+ sourceType: 'project-template',
9
+ selection: 'default',
10
+ supportedTools: ALL_TOOLS,
11
+ templateBaseDir: 'mcp/context7',
12
+ },
13
+ {
14
+ id: 'mastergo',
15
+ displayName: 'MasterGo',
16
+ description: '选装设计稿 MCP。',
17
+ sourceType: 'project-template',
18
+ selection: 'optional',
19
+ supportedTools: ALL_TOOLS,
20
+ templateBaseDir: 'mcp/mastergo',
21
+ },
22
+ ];
23
+ /** 推荐模式下默认安装的 MCP ID 集合。 */
24
+ export const DEFAULT_MCP_IDS = MCP_CATALOG.filter((mcp) => mcp.selection === 'default').map((mcp) => mcp.id);
25
+ /** 可选但非默认安装的 MCP ID 集合。 */
26
+ export const OPTIONAL_MCP_IDS = MCP_CATALOG.filter((mcp) => mcp.selection === 'optional').map((mcp) => mcp.id);
27
+ /** 对外暴露给 `list/add` 的 MCP ID 集合。 */
28
+ export const MCP_IDS = MCP_CATALOG.map((mcp) => mcp.id);
29
+ /** 按稳定 ID 读取单个 MCP catalog 项。 */
30
+ export function getMcpCatalogEntry(mcpId) {
31
+ const mcp = MCP_CATALOG.find((item) => item.id === mcpId);
32
+ if (!mcp) {
33
+ throw new Error(`Unknown MCP catalog id: ${mcpId}`);
34
+ }
35
+ return mcp;
36
+ }
37
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/catalog/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,oCAAoC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC;QACE,EAAE,EAAE,UAAU;QACd,WAAW,EAAE,UAAU;QACvB,WAAW,EAAE,mBAAmB;QAChC,UAAU,EAAE,kBAAkB;QAC9B,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,SAAS;QACzB,eAAe,EAAE,cAAc;KAChC;IACD;QACE,EAAE,EAAE,UAAU;QACd,WAAW,EAAE,UAAU;QACvB,WAAW,EAAE,YAAY;QACzB,UAAU,EAAE,kBAAkB;QAC9B,SAAS,EAAE,UAAU;QACrB,cAAc,EAAE,SAAS;QACzB,eAAe,EAAE,cAAc;KAChC;CAC8B,CAAA;AAEjC,4BAA4B;AAC5B,MAAM,CAAC,MAAM,eAAe,GAAY,WAAW,CAAC,MAAM,CACxD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,CACrC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAEtB,2BAA2B;AAC3B,MAAM,CAAC,MAAM,gBAAgB,GAAY,WAAW,CAAC,MAAM,CACzD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,KAAK,UAAU,CACtC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAEtB,oCAAoC;AACpC,MAAM,CAAC,MAAM,OAAO,GAAY,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAEhE,iCAAiC;AACjC,MAAM,UAAU,kBAAkB,CAAC,KAAY;IAC7C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,CAAA;IACzD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAA;IACrD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ToolId } from '../types.js';
2
+ /** 当前仓库支持写入配置的工具清单。 */
3
+ export declare const ALL_TOOLS: ToolId[];
4
+ export declare const projectRoot: string;
5
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/catalog/shared.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,uBAAuB;AACvB,eAAO,MAAM,SAAS,EAAE,MAAM,EAA6B,CAAA;AAI3D,eAAO,MAAM,WAAW,QAAuC,CAAA"}
@@ -0,0 +1,8 @@
1
+ import path from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ /** 当前仓库支持写入配置的工具清单。 */
4
+ export const ALL_TOOLS = ['codex', 'claude-code'];
5
+ /** 用于从 `src/catalog/*` 稳定回到仓库根目录。 */
6
+ const currentDir = path.dirname(fileURLToPath(import.meta.url));
7
+ export const projectRoot = path.resolve(currentDir, '..', '..');
8
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/catalog/shared.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAIxC,uBAAuB;AACvB,MAAM,CAAC,MAAM,SAAS,GAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;AAE3D,qCAAqC;AACrC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA"}
@@ -0,0 +1,14 @@
1
+ import type { CatalogSkill, SkillId } from '../types.js';
2
+ /** 技能能力清单,包含一个必装本地 skill 和若干远端推荐 skill。 */
3
+ export declare const SKILL_CATALOG: CatalogSkill[];
4
+ /** 初始化阶段始终会安装的 bootstrap skill。 */
5
+ export declare const REQUIRED_SKILL_ID: SkillId;
6
+ /** 推荐模式下默认安装的远端 skill ID 集合。 */
7
+ export declare const DEFAULT_SKILL_IDS: SkillId[];
8
+ /** 可选但非默认安装的远端 skill ID 集合。 */
9
+ export declare const OPTIONAL_SKILL_IDS: SkillId[];
10
+ /** 对外暴露给 `list/add` 的 skill ID 集合,不包含必装 bootstrap skill。 */
11
+ export declare const SKILL_IDS: SkillId[];
12
+ /** 按稳定 ID 读取单个 skill catalog 项。 */
13
+ export declare function getSkillCatalogEntry(skillId: SkillId): CatalogSkill;
14
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/catalog/skills.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAU,MAAM,aAAa,CAAA;AA0ChE,2CAA2C;AAC3C,eAAO,MAAM,aAAa,EAAE,YAAY,EAYL,CAAA;AAEnC,mCAAmC;AACnC,eAAO,MAAM,iBAAiB,EAAE,OAAkC,CAAA;AAElE,gCAAgC;AAChC,eAAO,MAAM,iBAAiB,EAAE,OAAO,EAEb,CAAA;AAE1B,+BAA+B;AAC/B,eAAO,MAAM,kBAAkB,EAAE,OAAO,EAEd,CAAA;AAE1B,4DAA4D;AAC5D,eAAO,MAAM,SAAS,EAAE,OAAO,EAEL,CAAA;AAE1B,mCAAmC;AACnC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CAMnE"}
@@ -0,0 +1,55 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { parseJsonText } from '../utils/json.js';
4
+ import { ALL_TOOLS, projectRoot } from './shared.js';
5
+ /** 从 `templates/skills/remote/catalog.json` 加载远端推荐 skill 清单。 */
6
+ function loadRemoteSkillCatalog() {
7
+ const catalogPath = path.join(projectRoot, 'templates', 'skills', 'remote', 'catalog.json');
8
+ const raw = readFileSync(catalogPath, 'utf8');
9
+ const entries = parseJsonText(raw, catalogPath);
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
+ /** 技能能力清单,包含一个必装本地 skill 和若干远端推荐 skill。 */
26
+ export const SKILL_CATALOG = [
27
+ {
28
+ id: 'bootstrap-project-docs',
29
+ displayName: 'bootstrap-project-docs',
30
+ description: '初始化项目事实文档与工具规则文档的必装 bootstrap skill。',
31
+ sourceType: 'builtin-local',
32
+ selection: 'required',
33
+ detectionMode: 'single',
34
+ supportedTools: ALL_TOOLS,
35
+ templateDir: 'skills/builtin/bootstrap-project-docs',
36
+ },
37
+ ...loadRemoteSkillCatalog(),
38
+ ];
39
+ /** 初始化阶段始终会安装的 bootstrap skill。 */
40
+ export const REQUIRED_SKILL_ID = 'bootstrap-project-docs';
41
+ /** 推荐模式下默认安装的远端 skill ID 集合。 */
42
+ export const DEFAULT_SKILL_IDS = SKILL_CATALOG.filter((skill) => skill.selection === 'default').map((skill) => skill.id);
43
+ /** 可选但非默认安装的远端 skill ID 集合。 */
44
+ export const OPTIONAL_SKILL_IDS = SKILL_CATALOG.filter((skill) => skill.selection === 'optional').map((skill) => skill.id);
45
+ /** 对外暴露给 `list/add` 的 skill ID 集合,不包含必装 bootstrap skill。 */
46
+ export const SKILL_IDS = SKILL_CATALOG.filter((skill) => skill.id !== REQUIRED_SKILL_ID).map((skill) => skill.id);
47
+ /** 按稳定 ID 读取单个 skill catalog 项。 */
48
+ export function getSkillCatalogEntry(skillId) {
49
+ const skill = SKILL_CATALOG.find((item) => item.id === skillId);
50
+ if (!skill) {
51
+ throw new Error(`Unknown skill catalog id: ${skillId}`);
52
+ }
53
+ return skill;
54
+ }
55
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/catalog/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAkBpD,gEAAgE;AAChE,SAAS,sBAAsB;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAA;IAC3F,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,aAAa,CAA6B,GAAG,EAAE,WAAW,CAAC,CAAA;IAE3E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7B,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,oBAAoB;QAChC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,MAAM,EAAE;YACN,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,cAAc,EAAE,KAAK,CAAC,cAAc;SACrC;KACF,CAAC,CAAC,CAAA;AACL,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C;QACE,EAAE,EAAE,wBAAwB;QAC5B,WAAW,EAAE,wBAAwB;QACrC,WAAW,EAAE,sCAAsC;QACnD,UAAU,EAAE,eAAe;QAC3B,SAAS,EAAE,UAAU;QACrB,aAAa,EAAE,QAAQ;QACvB,cAAc,EAAE,SAAS;QACzB,WAAW,EAAE,uCAAuC;KACrD;IACD,GAAG,sBAAsB,EAAE;CACM,CAAA;AAEnC,mCAAmC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAY,wBAAwB,CAAA;AAElE,gCAAgC;AAChC,MAAM,CAAC,MAAM,iBAAiB,GAAc,aAAa,CAAC,MAAM,CAC9D,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CACzC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;AAE1B,+BAA+B;AAC/B,MAAM,CAAC,MAAM,kBAAkB,GAAc,aAAa,CAAC,MAAM,CAC/D,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,UAAU,CAC1C,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;AAE1B,4DAA4D;AAC5D,MAAM,CAAC,MAAM,SAAS,GAAc,aAAa,CAAC,MAAM,CACtD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,iBAAiB,CAC1C,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;AAE1B,mCAAmC;AACnC,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,CAAA;IAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAA;IACzD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { CatalogWorkflow, WorkflowId } from '../types.js';
2
+ /** workflow 能力清单,当前只维护独立于 skill 的 OpenSpec 集成。 */
3
+ export declare const WORKFLOW_CATALOG: CatalogWorkflow[];
4
+ /** 对外暴露给 `list/add` 的 workflow ID 集合。 */
5
+ export declare const WORKFLOW_IDS: WorkflowId[];
6
+ /** 按稳定 ID 读取单个 workflow catalog 项。 */
7
+ export declare function getWorkflowCatalogEntry(workflowId: WorkflowId): CatalogWorkflow;
8
+ //# sourceMappingURL=workflows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/catalog/workflows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG9D,kDAAkD;AAClD,eAAO,MAAM,gBAAgB,EAAE,eAAe,EAUR,CAAA;AAEtC,yCAAyC;AACzC,eAAO,MAAM,YAAY,EAAE,UAAU,EAAoD,CAAA;AAEzF,sCAAsC;AACtC,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,eAAe,CAM/E"}
@@ -0,0 +1,24 @@
1
+ import { ALL_TOOLS } from './shared.js';
2
+ /** workflow 能力清单,当前只维护独立于 skill 的 OpenSpec 集成。 */
3
+ export const WORKFLOW_CATALOG = [
4
+ {
5
+ id: 'openspec',
6
+ displayName: 'OpenSpec',
7
+ description: '独立的 spec-driven workflow 工作流能力,不属于普通 skills 或 MCP。',
8
+ sourceType: 'workflow-integration',
9
+ supportedTools: ALL_TOOLS,
10
+ templateBaseDir: 'workflows/openspec',
11
+ installCommand: 'npx -y @fission-ai/openspec@latest init --tools <tool> --profile core .',
12
+ },
13
+ ];
14
+ /** 对外暴露给 `list/add` 的 workflow ID 集合。 */
15
+ export const WORKFLOW_IDS = WORKFLOW_CATALOG.map((workflow) => workflow.id);
16
+ /** 按稳定 ID 读取单个 workflow catalog 项。 */
17
+ export function getWorkflowCatalogEntry(workflowId) {
18
+ const workflow = WORKFLOW_CATALOG.find((item) => item.id === workflowId);
19
+ if (!workflow) {
20
+ throw new Error(`Unknown workflow catalog id: ${workflowId}`);
21
+ }
22
+ return workflow;
23
+ }
24
+ //# sourceMappingURL=workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/catalog/workflows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,kDAAkD;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD;QACE,EAAE,EAAE,UAAU;QACd,WAAW,EAAE,UAAU;QACvB,WAAW,EAAE,oDAAoD;QACjE,UAAU,EAAE,sBAAsB;QAClC,cAAc,EAAE,SAAS;QACzB,eAAe,EAAE,oBAAoB;QACrC,cAAc,EAAE,yEAAyE;KAC1F;CACmC,CAAA;AAEtC,yCAAyC;AACzC,MAAM,CAAC,MAAM,YAAY,GAAiB,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;AAEzF,sCAAsC;AACtC,MAAM,UAAU,uBAAuB,CAAC,UAAsB;IAC5D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,CAAA;IACxE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAA;IAC/D,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -1 +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"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AA0CA,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,CA2Ff;AAED,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAkFf;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA4Ef"}