@deepstorm/cli 0.1.0

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 (148) hide show
  1. package/README.md +72 -0
  2. package/dist/agents/reef-inspect-figma.md +77 -0
  3. package/dist/agents/reef-review-backend.md.tmpl +112 -0
  4. package/dist/agents/reef-review-frontend.md.tmpl +78 -0
  5. package/dist/agents/reef-review-infra.md +47 -0
  6. package/dist/agents/reef-review-security.md.tmpl +80 -0
  7. package/dist/agents/reef-scope-analysis.md +64 -0
  8. package/dist/build-registry.js +375 -0
  9. package/dist/cli.js +8581 -0
  10. package/dist/config-schema.json +133 -0
  11. package/dist/env-examples/context7.env-example +19 -0
  12. package/dist/env-examples/feishu-wiki.env-example +16 -0
  13. package/dist/env-examples/figma.env-example +16 -0
  14. package/dist/env-examples/github.env-example +20 -0
  15. package/dist/env-examples/jira.env-example +20 -0
  16. package/dist/hooks/mcp-hook.sh +77 -0
  17. package/dist/hooks/reef-auto-format.sh.tmpl +72 -0
  18. package/dist/hooks/reef-block-dangerous.sh +70 -0
  19. package/dist/hooks/reef-hooks.json +72 -0
  20. package/dist/hooks/reef-intent-detect.sh +129 -0
  21. package/dist/hooks/reef-protect-files.sh +55 -0
  22. package/dist/hooks/reef-run-tests.sh +84 -0
  23. package/dist/hooks/reef-scope-check.sh +386 -0
  24. package/dist/hooks/reef-scope-ci.sh +28 -0
  25. package/dist/hooks/reef-scope-gate.sh +115 -0
  26. package/dist/hooks/reef-scope-pre-commit.sh.tmpl +28 -0
  27. package/dist/hooks/reef-scope-setup.sh +204 -0
  28. package/dist/hooks/reef-scope-split.sh +203 -0
  29. package/dist/hooks/sweep-hooks.json +14 -0
  30. package/dist/hooks/sweep-mcp-hook.sh +77 -0
  31. package/dist/hooks/tide-hooks.json +14 -0
  32. package/dist/hooks/tide-session-preload.sh +17 -0
  33. package/dist/mcp/code-hosting/github.json +20 -0
  34. package/dist/mcp/design-tools/figma.json +19 -0
  35. package/dist/mcp/docs-reference/context7.json +28 -0
  36. package/dist/mcp/e2e-testing/playwright.json +13 -0
  37. package/dist/mcp/knowledge-base/feishu-wiki.json +19 -0
  38. package/dist/mcp/project-management/jira.json +27 -0
  39. package/dist/mcp-skills/deepflow-mcp-feishu-wiki-read/SKILL.md +65 -0
  40. package/dist/mcp-skills/deepflow-mcp-feishu-wiki-write/SKILL.md +63 -0
  41. package/dist/mcp-skills/deepflow-mcp-figma-read/SKILL.md +98 -0
  42. package/dist/mcp-skills/deepflow-mcp-github-read/SKILL.md +62 -0
  43. package/dist/mcp-skills/deepflow-mcp-github-write/SKILL.md +63 -0
  44. package/dist/mcp-skills/deepflow-mcp-jira-read/SKILL.md +80 -0
  45. package/dist/mcp-skills/deepflow-mcp-jira-write/SKILL.md +74 -0
  46. package/dist/mcp-skills/deepflow-mcp-playwright-read/SKILL.md +79 -0
  47. package/dist/mcp-skills/deepstorm-mcp-feishu-wiki-read/SKILL.md +65 -0
  48. package/dist/mcp-skills/deepstorm-mcp-feishu-wiki-write/SKILL.md +63 -0
  49. package/dist/mcp-skills/deepstorm-mcp-figma-read/SKILL.md +98 -0
  50. package/dist/mcp-skills/deepstorm-mcp-github-read/SKILL.md +62 -0
  51. package/dist/mcp-skills/deepstorm-mcp-github-write/SKILL.md +63 -0
  52. package/dist/mcp-skills/deepstorm-mcp-jira-read/SKILL.md +80 -0
  53. package/dist/mcp-skills/deepstorm-mcp-jira-write/SKILL.md +74 -0
  54. package/dist/mcp-skills/deepstorm-mcp-playwright-read/SKILL.md +79 -0
  55. package/dist/registry.json +818 -0
  56. package/dist/skills/atoll-ops/SKILL.md +46 -0
  57. package/dist/skills/reef-commit/SKILL.md +127 -0
  58. package/dist/skills/reef-gen-backend/SKILL.md.tmpl +87 -0
  59. package/dist/skills/reef-gen-backend/variants/java/steps.md +28 -0
  60. package/dist/skills/reef-gen-backend/variants/python/steps.md +70 -0
  61. package/dist/skills/reef-gen-frontend/SKILL.md.tmpl +83 -0
  62. package/dist/skills/reef-gen-frontend/variants/angular/steps.md +30 -0
  63. package/dist/skills/reef-harden/EXAMPLES.md +89 -0
  64. package/dist/skills/reef-harden/SKILL.md +136 -0
  65. package/dist/skills/reef-pr/SKILL.md +97 -0
  66. package/dist/skills/reef-review/SKILL.md.tmpl +107 -0
  67. package/dist/skills/reef-scope/SKILL.md +134 -0
  68. package/dist/skills/reef-start/SKILL.md.tmpl +562 -0
  69. package/dist/skills/reef-start/references/jira-start-subagent.md +60 -0
  70. package/dist/skills/reef-style-backend/SKILL.md.tmpl +134 -0
  71. package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/chat-client.md +96 -0
  72. package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/rag.md +94 -0
  73. package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/structured-output.md +62 -0
  74. package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/examples/tool-calling.md +68 -0
  75. package/dist/skills/reef-style-backend/fragments/java/ai/spring-ai/quick-reference.md +220 -0
  76. package/dist/skills/reef-style-backend/fragments/java/api-spec/quick-reference.md +148 -0
  77. package/dist/skills/reef-style-backend/fragments/java/db-migration/liquibase/examples/database-migration.md +131 -0
  78. package/dist/skills/reef-style-backend/fragments/java/db-migration/liquibase/quick-reference.md +103 -0
  79. package/dist/skills/reef-style-backend/fragments/java/dependency-management/quick-reference.md +119 -0
  80. package/dist/skills/reef-style-backend/fragments/java/exception-handling/examples/error-code-enum.md +101 -0
  81. package/dist/skills/reef-style-backend/fragments/java/exception-handling/quick-reference.md +181 -0
  82. package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/controller.md +95 -0
  83. package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/dto-mapper.md +121 -0
  84. package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/infrastructure.md +179 -0
  85. package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/service-entity.md +202 -0
  86. package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/examples/testing.md +107 -0
  87. package/dist/skills/reef-style-backend/fragments/java/framework/spring-boot/quick-reference.md +83 -0
  88. package/dist/skills/reef-style-backend/fragments/java/orm/hibernate/quick-reference.md +150 -0
  89. package/dist/skills/reef-style-backend/fragments/java/security-redlines/quick-reference.md +197 -0
  90. package/dist/skills/reef-style-backend/fragments/java/test/data-jpa-test/examples/user-repository-test.md +69 -0
  91. package/dist/skills/reef-style-backend/fragments/java/test/data-jpa-test/quick-reference.md +101 -0
  92. package/dist/skills/reef-style-backend/fragments/java/test/junit5/examples/user-service-test.md +61 -0
  93. package/dist/skills/reef-style-backend/fragments/java/test/junit5/quick-reference.md +100 -0
  94. package/dist/skills/reef-style-backend/fragments/java/test/spring-mvc-test/examples/user-controller-test.md +61 -0
  95. package/dist/skills/reef-style-backend/fragments/java/test/spring-mvc-test/quick-reference.md +85 -0
  96. package/dist/skills/reef-style-backend/fragments/java/test/spring-service-test/examples/user-service-integration-test.md +56 -0
  97. package/dist/skills/reef-style-backend/fragments/java/test/spring-service-test/quick-reference.md +83 -0
  98. package/dist/skills/reef-style-backend/fragments/python/alembic-migration/quick-reference.md +77 -0
  99. package/dist/skills/reef-style-backend/fragments/python/api-spec/quick-reference.md +164 -0
  100. package/dist/skills/reef-style-backend/fragments/python/dependency-management/quick-reference.md +139 -0
  101. package/dist/skills/reef-style-backend/fragments/python/exception-handling/quick-reference.md +177 -0
  102. package/dist/skills/reef-style-backend/fragments/python/fastapi-quick-reference/quick-reference.md +101 -0
  103. package/dist/skills/reef-style-backend/fragments/python/langchain/quick-reference.md +135 -0
  104. package/dist/skills/reef-style-backend/fragments/python/pytest-testing/quick-reference.md +111 -0
  105. package/dist/skills/reef-style-backend/fragments/python/ruff-mypy-toolchain/quick-reference.md +83 -0
  106. package/dist/skills/reef-style-backend/fragments/python/security-redlines/quick-reference.md +207 -0
  107. package/dist/skills/reef-style-backend/fragments/python/sqlalchemy-orm/quick-reference.md +91 -0
  108. package/dist/skills/reef-style-backend/variants/java/examples/code-wrapping.md +227 -0
  109. package/dist/skills/reef-style-backend/variants/java/examples/contributor-pattern.md +97 -0
  110. package/dist/skills/reef-style-backend/variants/java/quick-reference.md +117 -0
  111. package/dist/skills/reef-style-backend/variants/python/examples/crud-router.md +71 -0
  112. package/dist/skills/reef-style-backend/variants/python/examples/pydantic-schema.md +45 -0
  113. package/dist/skills/reef-style-backend/variants/python/examples/pytest-fixture.md +60 -0
  114. package/dist/skills/reef-style-backend/variants/python/examples/sqlalchemy-model.md +31 -0
  115. package/dist/skills/reef-style-backend/variants/python/quick-reference.md +111 -0
  116. package/dist/skills/reef-style-frontend/SKILL.md.tmpl +70 -0
  117. package/dist/skills/reef-style-frontend/fragments/css/tailwind/quick-reference.md +79 -0
  118. package/dist/skills/reef-style-frontend/fragments/test/vitest/examples/testing.md +150 -0
  119. package/dist/skills/reef-style-frontend/fragments/test/vitest/quick-reference.md +141 -0
  120. package/dist/skills/reef-style-frontend/fragments/ts-config/strict/quick-reference.md +112 -0
  121. package/dist/skills/reef-style-frontend/fragments/ui-lib/primeng/examples/ui-components.md +134 -0
  122. package/dist/skills/reef-style-frontend/fragments/ui-lib/primeng/quick-reference.md +66 -0
  123. package/dist/skills/reef-style-frontend/variants/angular/examples/code-wrapping.md +252 -0
  124. package/dist/skills/reef-style-frontend/variants/angular/examples/component-types-pipes.md +56 -0
  125. package/dist/skills/reef-style-frontend/variants/angular/examples/entity-types.md +100 -0
  126. package/dist/skills/reef-style-frontend/variants/angular/examples/forms-layer.md +119 -0
  127. package/dist/skills/reef-style-frontend/variants/angular/examples/service-routing.md +95 -0
  128. package/dist/skills/reef-style-frontend/variants/angular/quick-reference.md +100 -0
  129. package/dist/skills/reef-testcase/SKILL.md +138 -0
  130. package/dist/skills/reef-testcase/references/coverage-dimensions.md +99 -0
  131. package/dist/skills/reef-testcase/references/test-case-template.md +63 -0
  132. package/dist/skills/sweep-init/SKILL.md +286 -0
  133. package/dist/skills/sweep-init/scripts/flow-selector.mjs +305 -0
  134. package/dist/skills/sweep-plan/SKILL.md.tmpl +312 -0
  135. package/dist/skills/sweep-plan/references/test-flow-template.md +46 -0
  136. package/dist/skills/sweep-run/SKILL.md +437 -0
  137. package/dist/skills/sweep-run/scripts/env-manager.mjs +208 -0
  138. package/dist/skills/sweep-run/scripts/flow-parser.mjs +329 -0
  139. package/dist/skills/sweep-run/scripts/flow-selector.mjs +483 -0
  140. package/dist/skills/sweep-run/scripts/mcp-manager.mjs +208 -0
  141. package/dist/skills/sweep-run/scripts/spec-compiler.mjs +303 -0
  142. package/dist/skills/tide-discuss/SKILL.md.tmpl +449 -0
  143. package/dist/skills/tide-discuss/references/checklists.md +88 -0
  144. package/dist/skills/tide-discuss/references/data-format.md +237 -0
  145. package/dist/skills/tide-discuss/references/prd-template.md +134 -0
  146. package/dist/skills/tide-discuss/references/publish-flow.md +167 -0
  147. package/dist/skills/tide-discuss/references/role-prompts.md +105 -0
  148. package/package.json +38 -0
@@ -0,0 +1,375 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var build_registry_exports = {};
30
+ __export(build_registry_exports, {
31
+ buildRegistry: () => buildRegistry
32
+ });
33
+ module.exports = __toCommonJS(build_registry_exports);
34
+ var fs = __toESM(require("node:fs"));
35
+ var path = __toESM(require("node:path"));
36
+ var import_js_yaml = __toESM(require("js-yaml"));
37
+ const PACKAGE_LABELS = {
38
+ tide: { label: "\u4EA7\u54C1\u4FA7", description: "BMAD \u9700\u6C42\u8BA8\u8BBA\u3001PRD\u3001Jira", mcpDependencies: ["jira", "feishu-wiki", "figma"] },
39
+ reef: { label: "\u5F00\u53D1\u4FA7", description: "\u89C4\u8303\u751F\u6210\u3001\u4EE3\u7801\u5B9E\u73B0", mcpDependencies: ["jira", "feishu-wiki", "figma", "github", "context7"] },
40
+ sweep: { label: "\u6D4B\u8BD5\u4FA7", description: "\u6D4B\u8BD5\u751F\u6210\u3001\u8986\u76D6\u7387\u3001CI", mcpDependencies: ["jira", "feishu-wiki", "playwright"] },
41
+ atoll: { label: "\u8FD0\u7EF4\u4FA7", description: "\u90E8\u7F72\u8F85\u52A9\u3001\u76D1\u63A7\u3001\u6545\u969C\u6392\u67E5", mcpDependencies: ["jira", "feishu-wiki"] },
42
+ shared: { label: "\u5171\u4EAB", description: "\u516C\u5171\u6280\u80FD\u4E0E\u5DE5\u5177" }
43
+ };
44
+ const TOOL_ORDER = ["tide", "reef", "sweep", "atoll", "shared"];
45
+ function getPackageDirs(packagesDir) {
46
+ if (!fs.existsSync(packagesDir)) return [];
47
+ const dirs = fs.readdirSync(packagesDir).filter((name) => {
48
+ const dir = path.join(packagesDir, name);
49
+ return fs.statSync(dir).isDirectory() && name !== "cli";
50
+ });
51
+ dirs.sort((a, b) => {
52
+ const ia = TOOL_ORDER.indexOf(a);
53
+ const ib = TOOL_ORDER.indexOf(b);
54
+ return (ia === -1 ? 999 : ia) - (ib === -1 ? 999 : ib);
55
+ });
56
+ return dirs;
57
+ }
58
+ function parseFrontmatter(content) {
59
+ const trimmed = content.trim();
60
+ if (!trimmed.startsWith("---")) return null;
61
+ const endIndex = trimmed.indexOf("---", 3);
62
+ if (endIndex === -1) return null;
63
+ const yamlBlock = trimmed.slice(3, endIndex).trim();
64
+ if (!yamlBlock) return null;
65
+ try {
66
+ return import_js_yaml.default.load(yamlBlock);
67
+ } catch {
68
+ return null;
69
+ }
70
+ }
71
+ function collectJsonFiles(dir) {
72
+ const results = [];
73
+ if (!fs.existsSync(dir)) return results;
74
+ for (const entry of fs.readdirSync(dir)) {
75
+ const fullPath = path.join(dir, entry);
76
+ if (entry === ".DS_Store") continue;
77
+ if (fs.statSync(fullPath).isDirectory()) {
78
+ results.push(...collectJsonFiles(fullPath));
79
+ } else if (entry.endsWith(".json")) {
80
+ results.push(fullPath);
81
+ }
82
+ }
83
+ return results;
84
+ }
85
+ function scanAssets(dir) {
86
+ if (!fs.existsSync(dir)) return [];
87
+ return fs.readdirSync(dir).filter((n) => n !== ".DS_Store").filter((n) => n !== "hooks.json").filter((n) => {
88
+ const stat = fs.statSync(path.join(dir, n));
89
+ return stat.isFile();
90
+ }).map((n) => n.replace(/\.tmpl$/, "")).filter((v, i, a) => a.indexOf(v) === i);
91
+ }
92
+ function buildRegistry(cliDir) {
93
+ console.log("\u{1F528} \u6784\u5EFA registry...\n");
94
+ const root = path.resolve(cliDir, "..", "..");
95
+ const distDir = path.join(cliDir, "dist");
96
+ const packagesDir = path.join(root, "packages");
97
+ const packageDirs = getPackageDirs(packagesDir);
98
+ const registry = {
99
+ version: "1",
100
+ tools: {},
101
+ wizards: {},
102
+ skills: {}
103
+ };
104
+ console.log("\u{1F4C4} \u626B\u63CF SKILL.md frontmatter...");
105
+ let skillCount = 0;
106
+ for (const pkg of packageDirs) {
107
+ const skillsDir = path.join(root, "packages", pkg, "skills");
108
+ if (!fs.existsSync(skillsDir)) continue;
109
+ const skillNames = fs.readdirSync(skillsDir).filter(
110
+ (n) => fs.statSync(path.join(skillsDir, n)).isDirectory()
111
+ );
112
+ for (const skillName of skillNames) {
113
+ const mdPath = path.join(skillsDir, skillName, "SKILL.md");
114
+ const tmplPath = path.join(skillsDir, skillName, "SKILL.md.tmpl");
115
+ const hasMd = fs.existsSync(mdPath);
116
+ const hasTmpl = fs.existsSync(tmplPath);
117
+ if (!hasMd && !hasTmpl) {
118
+ console.log(` \u26A0 ${pkg}/${skillName}: \u7F3A\u5C11 SKILL.md/SKILL.md.tmpl\uFF0C\u8DF3\u8FC7`);
119
+ continue;
120
+ }
121
+ const skillMd = hasMd ? mdPath : tmplPath;
122
+ const content = fs.readFileSync(skillMd, "utf-8");
123
+ const fm = parseFrontmatter(content);
124
+ if (!fm) {
125
+ console.log(` \u26A0 ${pkg}/${skillName}: frontmatter \u89E3\u6790\u5931\u8D25\uFF0C\u8DF3\u8FC7`);
126
+ continue;
127
+ }
128
+ if (!fm.deepstormm) {
129
+ console.log(` - ${pkg}/${skillName}: \u65E0 deepstormm \u5B57\u6BB5\uFF0C\u8DF3\u8FC7\u6CE8\u518C`);
130
+ continue;
131
+ }
132
+ const df = fm.deepstormm;
133
+ const entry = {
134
+ tool: df.tool,
135
+ configKey: df.configKey,
136
+ configValue: df.configValue,
137
+ name: fm.name || void 0,
138
+ description: fm.description || void 0
139
+ };
140
+ if (hasTmpl) {
141
+ entry.hasTemplate = true;
142
+ }
143
+ const deps = df.dependencies;
144
+ if (Array.isArray(deps) && deps.length > 0) {
145
+ entry.dependencies = deps;
146
+ }
147
+ registry.skills[skillName] = entry;
148
+ skillCount++;
149
+ }
150
+ }
151
+ console.log(` \u2714 \u5DF2\u6CE8\u518C ${skillCount} \u4E2A skill
152
+ `);
153
+ console.log("\u{1F4CB} \u626B\u63CF wizard.json...");
154
+ let wizardCount = 0;
155
+ for (const pkg of packageDirs) {
156
+ const wizardPath = path.join(root, "packages", pkg, "wizard.json");
157
+ if (!fs.existsSync(wizardPath)) continue;
158
+ try {
159
+ const wizard = JSON.parse(fs.readFileSync(wizardPath, "utf-8"));
160
+ if (wizard.tool && wizard.questions) {
161
+ const pkgLabel = PACKAGE_LABELS[pkg];
162
+ const enriched = { ...wizard };
163
+ if (!enriched.label && pkgLabel) enriched.label = pkgLabel.label;
164
+ if (!enriched.description && pkgLabel) enriched.description = pkgLabel.description;
165
+ registry.wizards[enriched.tool] = enriched;
166
+ if (pkgLabel) registry.tools[enriched.tool] = pkgLabel;
167
+ wizardCount++;
168
+ console.log(` \u2714 ${pkg}/wizard.json (${wizard.tool})`);
169
+ } else {
170
+ console.log(` \u26A0 ${pkg}/wizard.json: \u7F3A\u5C11 tool \u6216 questions \u5B57\u6BB5`);
171
+ }
172
+ } catch {
173
+ console.log(` \u26A0 ${pkg}/wizard.json: \u89E3\u6790\u5931\u8D25`);
174
+ }
175
+ }
176
+ if (wizardCount === 0) console.log(" \u65E0 wizard.json \u6587\u4EF6");
177
+ console.log(` \u2714 \u5DF2\u6CE8\u518C ${wizardCount} \u4E2A wizard
178
+ `);
179
+ console.log("\u{1F50C} \u626B\u63CF MCP \u5DE5\u5177\u914D\u7F6E...");
180
+ const mcpTools = {};
181
+ const cliMcpDir = path.join(cliDir, "mcp");
182
+ const mcpJsonFiles = collectJsonFiles(cliMcpDir);
183
+ let mcpCount = 0;
184
+ for (const jsonPath of mcpJsonFiles) {
185
+ try {
186
+ const data = JSON.parse(fs.readFileSync(jsonPath, "utf-8"));
187
+ if (data.name && data.domain && data.label) {
188
+ mcpTools[data.name] = {
189
+ domain: data.domain,
190
+ label: data.label,
191
+ description: data.description || ""
192
+ };
193
+ mcpCount++;
194
+ console.log(` \u2714 ${data.label} (${data.name}) \u2192 ${data.domain}`);
195
+ } else {
196
+ console.log(` \u26A0 ${path.relative(cliDir, jsonPath)}: \u7F3A\u5C11 name/domain/label \u5B57\u6BB5\uFF0C\u8DF3\u8FC7`);
197
+ }
198
+ } catch {
199
+ console.log(` \u26A0 ${path.relative(cliDir, jsonPath)}: \u89E3\u6790\u5931\u8D25\uFF0C\u8DF3\u8FC7`);
200
+ }
201
+ }
202
+ registry.mcpTools = mcpTools;
203
+ console.log(` \u2714 \u5DF2\u6CE8\u518C ${mcpCount} \u4E2A MCP \u5DE5\u5177
204
+ `);
205
+ console.log("\u{1F4C1} \u626B\u63CF agents \u548C hooks \u5F52\u5C5E...");
206
+ const toolAssets = {};
207
+ for (const pkg of packageDirs) {
208
+ const wizardPath = path.join(root, "packages", pkg, "wizard.json");
209
+ if (!fs.existsSync(wizardPath)) continue;
210
+ let tool;
211
+ try {
212
+ const wizard = JSON.parse(fs.readFileSync(wizardPath, "utf-8"));
213
+ tool = wizard.tool;
214
+ } catch {
215
+ continue;
216
+ }
217
+ if (!tool) continue;
218
+ const assets = {};
219
+ const agentsDir = path.join(root, "packages", pkg, "agents");
220
+ const hooksDir = path.join(root, "packages", pkg, "hooks");
221
+ if (fs.existsSync(agentsDir)) {
222
+ const agents = scanAssets(agentsDir);
223
+ if (agents.length > 0) assets.agents = agents;
224
+ }
225
+ if (fs.existsSync(hooksDir)) {
226
+ const hooks = scanAssets(hooksDir);
227
+ if (hooks.length > 0) assets.hooks = hooks;
228
+ }
229
+ if (Object.keys(assets).length > 0) {
230
+ toolAssets[tool] = assets;
231
+ }
232
+ }
233
+ registry.toolAssets = toolAssets;
234
+ console.log(` \u2714 \u5DF2\u6620\u5C04 ${Object.keys(toolAssets).length} \u4E2A\u5DE5\u5177\u7684 assets
235
+ `);
236
+ for (const skill of Object.values(registry.skills)) {
237
+ if (skill.tool && !registry.tools[skill.tool]) {
238
+ registry.tools[skill.tool] = {
239
+ label: skill.tool.charAt(0).toUpperCase() + skill.tool.slice(1),
240
+ description: ""
241
+ };
242
+ }
243
+ }
244
+ const assetDirs = ["skills", "agents", "mcp", "hooks"];
245
+ const distHooksJson = path.join(distDir, "hooks", "hooks.json");
246
+ if (fs.existsSync(distHooksJson)) {
247
+ fs.rmSync(distHooksJson, { force: true });
248
+ }
249
+ for (const assetDir of assetDirs) {
250
+ for (const pkg of packageDirs) {
251
+ const srcDir = path.join(root, "packages", pkg, assetDir);
252
+ if (!fs.existsSync(srcDir)) continue;
253
+ const entries = fs.readdirSync(srcDir);
254
+ if (assetDir === "skills") {
255
+ const dirs = entries.filter((n) => fs.statSync(path.join(srcDir, n)).isDirectory());
256
+ if (dirs.length === 0) continue;
257
+ for (const item of dirs) {
258
+ const src = path.join(srcDir, item);
259
+ const dest = path.join(distDir, assetDir, item);
260
+ const needsUpdate = !fs.existsSync(dest);
261
+ if (!needsUpdate) {
262
+ const srcStat = fs.statSync(src);
263
+ const destStat = fs.statSync(dest);
264
+ if (srcStat.mtimeMs <= destStat.mtimeMs) continue;
265
+ }
266
+ fs.cpSync(src, dest, { recursive: true, force: true });
267
+ console.log(` ${needsUpdate ? " \u590D\u5236" : " \u66F4\u65B0"} ${pkg}/${assetDir}/${item}`);
268
+ }
269
+ } else {
270
+ const destDir = path.join(distDir, assetDir);
271
+ fs.mkdirSync(destDir, { recursive: true });
272
+ for (const entry of entries) {
273
+ if (entry === ".DS_Store" || entry === "variants") continue;
274
+ if (assetDir === "hooks" && entry === "hooks.json") {
275
+ copyToolHooksJson(destDir, pkg, srcDir);
276
+ continue;
277
+ }
278
+ const src = path.join(srcDir, entry);
279
+ const dest = path.join(destDir, entry);
280
+ if (fs.existsSync(dest)) continue;
281
+ fs.cpSync(src, dest, { recursive: true, force: false });
282
+ console.log(` \u590D\u5236 ${pkg}/${assetDir}/${entry}`);
283
+ }
284
+ }
285
+ }
286
+ }
287
+ let cleanedCount = 0;
288
+ function cleanTests(dir) {
289
+ if (!fs.existsSync(dir)) return;
290
+ for (const entry of fs.readdirSync(dir)) {
291
+ const full = path.join(dir, entry);
292
+ if (!fs.statSync(full).isDirectory()) continue;
293
+ if (entry === "__tests__") {
294
+ fs.rmSync(full, { recursive: true, force: true });
295
+ cleanedCount++;
296
+ } else {
297
+ cleanTests(full);
298
+ }
299
+ }
300
+ }
301
+ for (const assetDir of assetDirs) {
302
+ const d = path.join(distDir, assetDir);
303
+ if (fs.existsSync(d)) cleanTests(d);
304
+ }
305
+ if (cleanedCount > 0) console.log(` \u2714 \u5DF2\u6E05\u7406 ${cleanedCount} \u4E2A __tests__ \u76EE\u5F55`);
306
+ if (fs.existsSync(cliMcpDir)) {
307
+ const destDir = path.join(distDir, "mcp");
308
+ fs.mkdirSync(destDir, { recursive: true });
309
+ for (const entry of fs.readdirSync(cliMcpDir)) {
310
+ if (entry === ".DS_Store") continue;
311
+ const src = path.join(cliMcpDir, entry);
312
+ const dest = path.join(destDir, entry);
313
+ fs.cpSync(src, dest, { recursive: true, force: true });
314
+ }
315
+ console.log(` \u590D\u5236 cli/mcp/ \u2192 dist/mcp/`);
316
+ }
317
+ const cliMcpSkillsSrc = path.join(cliDir, "mcp-skills");
318
+ if (fs.existsSync(cliMcpSkillsSrc)) {
319
+ const destDir = path.join(distDir, "mcp-skills");
320
+ fs.mkdirSync(destDir, { recursive: true });
321
+ for (const entry of fs.readdirSync(cliMcpSkillsSrc)) {
322
+ if (entry === ".DS_Store") continue;
323
+ const src = path.join(cliMcpSkillsSrc, entry);
324
+ const dest = path.join(destDir, entry);
325
+ fs.cpSync(src, dest, { recursive: true, force: true });
326
+ }
327
+ console.log(` \u590D\u5236 cli/mcp-skills/ \u2192 dist/mcp-skills/`);
328
+ }
329
+ const cliEnvExamplesSrc = path.join(cliDir, "env-examples");
330
+ if (fs.existsSync(cliEnvExamplesSrc)) {
331
+ const destDir = path.join(distDir, "env-examples");
332
+ fs.mkdirSync(destDir, { recursive: true });
333
+ for (const entry of fs.readdirSync(cliEnvExamplesSrc)) {
334
+ if (entry === ".DS_Store") continue;
335
+ const src = path.join(cliEnvExamplesSrc, entry);
336
+ const dest = path.join(destDir, entry);
337
+ fs.cpSync(src, dest, { recursive: true, force: true });
338
+ }
339
+ console.log(` \u590D\u5236 cli/env-examples/ \u2192 dist/env-examples/`);
340
+ }
341
+ const registryPath = path.join(distDir, "registry.json");
342
+ fs.mkdirSync(distDir, { recursive: true });
343
+ fs.writeFileSync(registryPath, JSON.stringify(registry, null, 2), "utf-8");
344
+ const schemaSrc = path.join(cliDir, "config-schema.json");
345
+ const schemaDest = path.join(distDir, "config-schema.json");
346
+ if (fs.existsSync(schemaSrc)) {
347
+ fs.cpSync(schemaSrc, schemaDest, { force: true });
348
+ }
349
+ console.log(`
350
+ \u{1F4E6} registry.json \u5DF2\u751F\u6210 \u2192 ${registryPath}`);
351
+ console.log(` tools: ${Object.keys(registry.tools).length} \u4E2A\u5DE5\u5177`);
352
+ console.log(` wizards: ${Object.keys(registry.wizards).length} \u4E2A`);
353
+ console.log(` skills: ${Object.keys(registry.skills).length} \u4E2A`);
354
+ console.log("\n\u2714 \u6784\u5EFA\u5B8C\u6210");
355
+ }
356
+ function copyToolHooksJson(destDir, pkg, srcDir) {
357
+ const destPath = path.join(destDir, `${pkg}-hooks.json`);
358
+ const srcPath = path.join(srcDir, "hooks.json");
359
+ if (!fs.existsSync(srcPath)) return;
360
+ const destDirExists = fs.existsSync(destDir);
361
+ if (!destDirExists) {
362
+ fs.mkdirSync(destDir, { recursive: true });
363
+ }
364
+ fs.cpSync(srcPath, destPath, { force: true });
365
+ console.log(` \u590D\u5236 ${pkg}/hooks/hooks.json \u2192 ${pkg}-hooks.json`);
366
+ }
367
+ const isMainModule = typeof require !== "undefined" && typeof module !== "undefined" && require.main === module;
368
+ if (isMainModule) {
369
+ const cliDir = path.resolve(__dirname, "..");
370
+ buildRegistry(cliDir);
371
+ }
372
+ // Annotate the CommonJS export names for ESM import in node:
373
+ 0 && (module.exports = {
374
+ buildRegistry
375
+ });