@optima-chat/optima-agent 0.8.98 → 0.8.100

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 (95) hide show
  1. package/.claude/settings.local.json +166 -0
  2. package/.claude/skills/.kb-skills-managed.json +9 -0
  3. package/.claude/skills/ingesting-sources/SKILL.md +67 -0
  4. package/.claude/skills/initializing-kb/SKILL.md +117 -0
  5. package/.claude/skills/kol-outreach/SKILL.md +194 -333
  6. package/.claude/skills/linting-the-wiki/SKILL.md +60 -0
  7. package/.claude/skills/querying-the-wiki/SKILL.md +59 -0
  8. package/.claude/skills/updating-related-pages/SKILL.md +65 -0
  9. package/dist/bin/bi-cli.js +0 -0
  10. package/dist/bin/browser-cli.js +0 -0
  11. package/dist/bin/comfy.d.ts +3 -0
  12. package/dist/bin/comfy.d.ts.map +1 -0
  13. package/dist/bin/comfy.js +3 -0
  14. package/dist/bin/comfy.js.map +1 -0
  15. package/dist/bin/commerce.js +0 -0
  16. package/dist/bin/gen.js +0 -0
  17. package/dist/bin/google-ads.js +0 -0
  18. package/dist/bin/growth.d.ts +3 -0
  19. package/dist/bin/growth.d.ts.map +1 -0
  20. package/dist/bin/growth.js +3 -0
  21. package/dist/bin/growth.js.map +1 -0
  22. package/dist/bin/logistics.js +0 -0
  23. package/dist/bin/optima.js +0 -0
  24. package/dist/bin/scout.js +0 -0
  25. package/dist/bin/sentinel.js +0 -0
  26. package/dist/bin/shopify.js +0 -0
  27. package/dist/bin/sync-kb-skills.d.ts +6 -0
  28. package/dist/bin/sync-kb-skills.d.ts.map +1 -0
  29. package/dist/bin/sync-kb-skills.js +65 -0
  30. package/dist/bin/sync-kb-skills.js.map +1 -0
  31. package/dist/src/hooks-loader.d.ts +6 -0
  32. package/dist/src/hooks-loader.d.ts.map +1 -0
  33. package/dist/src/hooks-loader.js +215 -0
  34. package/dist/src/hooks-loader.js.map +1 -0
  35. package/dist/src/ui/App.d.ts +6 -0
  36. package/dist/src/ui/App.d.ts.map +1 -0
  37. package/dist/src/ui/App.js +164 -0
  38. package/dist/src/ui/App.js.map +1 -0
  39. package/dist/src/ui/components/Composer.d.ts +10 -0
  40. package/dist/src/ui/components/Composer.d.ts.map +1 -0
  41. package/dist/src/ui/components/Composer.js +13 -0
  42. package/dist/src/ui/components/Composer.js.map +1 -0
  43. package/dist/src/ui/components/Header.d.ts +7 -0
  44. package/dist/src/ui/components/Header.d.ts.map +1 -0
  45. package/dist/src/ui/components/Header.js +7 -0
  46. package/dist/src/ui/components/Header.js.map +1 -0
  47. package/dist/src/ui/components/Message.d.ts +12 -0
  48. package/dist/src/ui/components/Message.d.ts.map +1 -0
  49. package/dist/src/ui/components/Message.js +21 -0
  50. package/dist/src/ui/components/Message.js.map +1 -0
  51. package/dist/src/ui/components/MessageList.d.ts +9 -0
  52. package/dist/src/ui/components/MessageList.d.ts.map +1 -0
  53. package/dist/src/ui/components/MessageList.js +18 -0
  54. package/dist/src/ui/components/MessageList.js.map +1 -0
  55. package/dist/src/ui/components/Spinner.d.ts +6 -0
  56. package/dist/src/ui/components/Spinner.d.ts.map +1 -0
  57. package/dist/src/ui/components/Spinner.js +7 -0
  58. package/dist/src/ui/components/Spinner.js.map +1 -0
  59. package/dist/src/ui/components/StatusBar.d.ts +11 -0
  60. package/dist/src/ui/components/StatusBar.d.ts.map +1 -0
  61. package/dist/src/ui/components/StatusBar.js +7 -0
  62. package/dist/src/ui/components/StatusBar.js.map +1 -0
  63. package/dist/src/ui/components/index.d.ts +7 -0
  64. package/dist/src/ui/components/index.d.ts.map +1 -0
  65. package/dist/src/ui/components/index.js +7 -0
  66. package/dist/src/ui/components/index.js.map +1 -0
  67. package/dist/src/validation/error-formatter.d.ts +21 -0
  68. package/dist/src/validation/error-formatter.d.ts.map +1 -0
  69. package/dist/src/validation/error-formatter.js +98 -0
  70. package/dist/src/validation/error-formatter.js.map +1 -0
  71. package/dist/src/validation/index.d.ts +10 -0
  72. package/dist/src/validation/index.d.ts.map +1 -0
  73. package/dist/src/validation/index.js +10 -0
  74. package/dist/src/validation/index.js.map +1 -0
  75. package/dist/src/validation/json-validator.d.ts +25 -0
  76. package/dist/src/validation/json-validator.d.ts.map +1 -0
  77. package/dist/src/validation/json-validator.js +173 -0
  78. package/dist/src/validation/json-validator.js.map +1 -0
  79. package/dist/src/validation/schema.d.ts +353 -0
  80. package/dist/src/validation/schema.d.ts.map +1 -0
  81. package/dist/src/validation/schema.js +57 -0
  82. package/dist/src/validation/schema.js.map +1 -0
  83. package/dist/src/validation/suggestions.d.ts +25 -0
  84. package/dist/src/validation/suggestions.d.ts.map +1 -0
  85. package/dist/src/validation/suggestions.js +144 -0
  86. package/dist/src/validation/suggestions.js.map +1 -0
  87. package/dist/src/validation/types.d.ts +40 -0
  88. package/dist/src/validation/types.d.ts.map +1 -0
  89. package/dist/src/validation/types.js +5 -0
  90. package/dist/src/validation/types.js.map +1 -0
  91. package/dist/src/validation/yaml-validator.d.ts +25 -0
  92. package/dist/src/validation/yaml-validator.d.ts.map +1 -0
  93. package/dist/src/validation/yaml-validator.js +177 -0
  94. package/dist/src/validation/yaml-validator.js.map +1 -0
  95. package/package.json +5 -3
@@ -0,0 +1,59 @@
1
+ ---
2
+ name: querying-the-wiki
3
+ description: "从已有知识库中查询和回答问题。当用户提到的话题可能在 ~/kb/ 的某个知识库中有覆盖时使用。"
4
+ ---
5
+
6
+ # Querying The Wiki
7
+
8
+ 通过把维护后的 wiki 视为主要知识层来回答问题。
9
+
10
+ ## 启动 SOP
11
+
12
+ 1. `ls ~/kb/REGISTRY.md`
13
+ - 不存在 → 告诉用户"还没有知识库,需要先创建一个",引导使用 initializing-kb
14
+ 2. 读 `~/kb/REGISTRY.md` — 获取所有 active 的 KB 列表
15
+ 3. 确定目标 KB:
16
+ - 用户明确指定了 KB slug 或主题 → 直接用
17
+ - 只有一个 active KB → 用它
18
+ - 多个 active → 根据用户问题匹配 `主题` + `说明` 字段;无法判断时列出让用户选
19
+ 4. 读 `~/kb/<slug>/AGENTS.md` 了解该 KB 的契约
20
+
21
+ ## 查询流程
22
+
23
+ 1. 读 `~/kb/<slug>/index.md`
24
+ 2. 找到最相关的 wiki 页面
25
+ 3. 优先基于维护后的页面回答
26
+ 4. 只有在 wiki 不完整或含混时才回到 raw sources
27
+ 5. 判断这个答案是否应该被保留
28
+ 6. 如果应该,写进 `~/kb/<slug>/wiki/analyses/` 或对应 overview 页面
29
+ 7. 追加 `~/kb/PROGRESS.md`
30
+ 8. `cd ~/kb && git add -A && git commit -m "[<slug>] query: <一句话>"`
31
+
32
+ ## Query 规则
33
+
34
+ 回答时:
35
+
36
+ - 优先使用维护后的 wiki,而不是每次从头重建
37
+ - 当答案依赖不完整或过时的 wiki 覆盖时,要说清楚
38
+ - 把 source-backed 内容与综合推断区分开
39
+ - 标出这个问题是否暴露了 wiki 的结构性空缺
40
+ - 在答案中显式引用所使用的 wiki 页面;如果回看了 raw sources,也要说明
41
+
42
+ ## 何时保留结果
43
+
44
+ 在下列情况下,应把结果写回 wiki:
45
+
46
+ - 同一个问题很可能会再次出现
47
+ - 这个答案比较了多个来源或页面
48
+ - 这个答案形成了可长期复用的综合
49
+ - 这个答案解决了当前 wiki 尚未解释清楚的混乱点
50
+
51
+ 独立的长期输出应进入 `wiki/analyses/`。如果主要是改进某个主题的现有综述,则写入对应 overview 页面。
52
+
53
+ ## 最小交付标准
54
+
55
+ 一次成功的 query 至少应产出:
56
+
57
+ - 一个直接回答用户问题的结果
58
+ - 在答案中明确引用使用了哪些 wiki 页面
59
+ - 清楚说明这个结果是否值得被保留
@@ -0,0 +1,65 @@
1
+ ---
2
+ name: updating-related-pages
3
+ description: "在 ingest 后同步更新知识库的关联页面。通常由 ingesting-sources 触发,不单独使用。"
4
+ ---
5
+
6
+ # Updating Related Pages
7
+
8
+ 在来源 ingest 之后,同步 wiki 的其他部分。
9
+
10
+ ## 启动 SOP
11
+
12
+ 1. `ls ~/kb/REGISTRY.md`
13
+ - 不存在 → 告诉用户"还没有知识库,需要先创建一个",引导使用 initializing-kb
14
+ 2. 读 `~/kb/REGISTRY.md` — 获取所有 active 的 KB 列表
15
+ 3. 确定目标 KB:
16
+ - 用户明确指定了 KB slug 或主题 → 直接用
17
+ - 只有一个 active KB → 用它
18
+ - 多个 active → 根据用户问题匹配 `主题` + `说明` 字段;无法判断时列出让用户选
19
+ 4. 读 `~/kb/<slug>/AGENTS.md` 了解该 KB 的契约
20
+
21
+ ## 更新流程
22
+
23
+ 1. 从来源页或 ingest 产出的 affected-page 列表开始
24
+ 2. 确认哪些 entity、overview 和 analysis 页面需要更新
25
+ 3. 优先更新现有页面,而不是先新建页面
26
+ 4. 为变更后的页面补齐或修复交叉链接
27
+ 5. 如果创建了新的长期页面,更新 `~/kb/<slug>/index.md`
28
+ 6. 如果这次变更实质性影响了 wiki,在 `~/kb/<slug>/log.md` 中追加记录
29
+ 7. 追加 `~/kb/PROGRESS.md`
30
+ 8. `cd ~/kb && git add -A && git commit -m "[<slug>] update: <更新了哪些页面>"`
31
+
32
+ ## 更新规则
33
+
34
+ 更新既有页面时:
35
+
36
+ - 保持页面的稳定职责
37
+ - 把新信息合并进正确的 section,而不是随手堆一段笔记
38
+ - 当新来源改变了先前理解时,要让修正过程可见
39
+ - 让 source-backed 内容与综合推断保持可区分
40
+ - 优先使用可链接的短陈述,而不是长段无结构文字
41
+
42
+ ## 冲突处理
43
+
44
+ 如果新来源与旧页面冲突:
45
+
46
+ - 不要无解释地删除旧结论
47
+ - 记录新的证据
48
+ - 更新当前理解
49
+ - 让之后的读者仍然看得出分歧在哪里
50
+
51
+ ## 何时创建新页面
52
+
53
+ 只有在下列情况下才应新建页面:
54
+
55
+ - 新信息引入了一个 recurring concept,但还没有稳定 landing page
56
+ - 某个 analysis 或 comparison 已经有独立长期价值
57
+ - 现有页面已经过宽,无法干净吸收这次更新
58
+
59
+ ## 最小交付标准
60
+
61
+ 一次成功的 related-page update 至少应留下:
62
+
63
+ - 被同步更新过的相关页面
64
+ - source、entity、overview 和 analysis 页面之间清晰的交叉链接
65
+ - 在适用时,对"理解发生变化"有可见处理
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "@optima-chat/comfy-cli";
3
+ //# sourceMappingURL=comfy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comfy.d.ts","sourceRoot":"","sources":["../../bin/comfy.ts"],"names":[],"mappings":";AACA,OAAO,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "@optima-chat/comfy-cli";
3
+ //# sourceMappingURL=comfy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comfy.js","sourceRoot":"","sources":["../../bin/comfy.ts"],"names":[],"mappings":";AACA,OAAO,wBAAwB,CAAC"}
File without changes
package/dist/bin/gen.js CHANGED
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "@optima-chat/growth-cli";
3
+ //# sourceMappingURL=growth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"growth.d.ts","sourceRoot":"","sources":["../../bin/growth.ts"],"names":[],"mappings":";AACA,OAAO,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "@optima-chat/growth-cli";
3
+ //# sourceMappingURL=growth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"growth.js","sourceRoot":"","sources":["../../bin/growth.ts"],"names":[],"mappings":";AACA,OAAO,yBAAyB,CAAC"}
File without changes
File without changes
package/dist/bin/scout.js CHANGED
File without changes
File without changes
File without changes
@@ -0,0 +1,6 @@
1
+ export interface SyncKbSkillsOptions {
2
+ repoRoot?: string;
3
+ packageRoot?: string;
4
+ }
5
+ export declare function syncKbSkills(options?: SyncKbSkillsOptions): string[];
6
+ //# sourceMappingURL=sync-kb-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-kb-skills.d.ts","sourceRoot":"","sources":["../../bin/sync-kb-skills.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAsCD,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,MAAM,EAAE,CA0BxE"}
@@ -0,0 +1,65 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { createRequire } from "node:module";
4
+ const MANIFEST_FILENAME = ".kb-skills-managed.json";
5
+ function ensureDir(dirPath) {
6
+ fs.mkdirSync(dirPath, { recursive: true });
7
+ }
8
+ function resolveKbSkillsPackageRoot() {
9
+ const require = createRequire(import.meta.url);
10
+ const packageJsonPath = require.resolve("kb-skills/package.json");
11
+ return path.dirname(packageJsonPath);
12
+ }
13
+ function listKbSkillNames(skillsDir) {
14
+ if (!fs.existsSync(skillsDir)) {
15
+ throw new Error(`kb-skills skills directory not found: ${skillsDir}`);
16
+ }
17
+ return fs
18
+ .readdirSync(skillsDir, { withFileTypes: true })
19
+ .filter((entry) => entry.isDirectory())
20
+ .map((entry) => entry.name)
21
+ .filter((name) => fs.existsSync(path.join(skillsDir, name, "SKILL.md")))
22
+ .sort();
23
+ }
24
+ function readManagedSkills(manifestPath) {
25
+ if (!fs.existsSync(manifestPath)) {
26
+ return [];
27
+ }
28
+ const parsed = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
29
+ return Array.isArray(parsed.skills) ? parsed.skills.filter((skill) => typeof skill === "string") : [];
30
+ }
31
+ function writeManagedSkills(manifestPath, skills) {
32
+ fs.writeFileSync(manifestPath, JSON.stringify({ skills }, null, 2) + "\n");
33
+ }
34
+ export function syncKbSkills(options = {}) {
35
+ const repoRoot = options.repoRoot ?? process.cwd();
36
+ const packageRoot = options.packageRoot ?? resolveKbSkillsPackageRoot();
37
+ const sourceBaseDir = path.join(packageRoot, "skills");
38
+ const targetBaseDir = path.join(repoRoot, ".claude", "skills");
39
+ const manifestPath = path.join(targetBaseDir, MANIFEST_FILENAME);
40
+ const skillNames = listKbSkillNames(sourceBaseDir);
41
+ const previouslyManagedSkills = readManagedSkills(manifestPath);
42
+ ensureDir(targetBaseDir);
43
+ for (const skillName of previouslyManagedSkills) {
44
+ if (!skillNames.includes(skillName)) {
45
+ fs.rmSync(path.join(targetBaseDir, skillName), { recursive: true, force: true });
46
+ }
47
+ }
48
+ for (const skillName of skillNames) {
49
+ const sourceDir = path.join(sourceBaseDir, skillName);
50
+ const targetDir = path.join(targetBaseDir, skillName);
51
+ fs.rmSync(targetDir, { recursive: true, force: true });
52
+ fs.cpSync(sourceDir, targetDir, { recursive: true });
53
+ }
54
+ writeManagedSkills(manifestPath, skillNames);
55
+ return skillNames;
56
+ }
57
+ const thisFilePath = process.argv[1] ? path.resolve(process.argv[1]) : "";
58
+ if (thisFilePath && import.meta.url === `file://${thisFilePath}`) {
59
+ const syncedSkills = syncKbSkills();
60
+ console.log(`Synced ${syncedSkills.length} kb skills.`);
61
+ for (const skillName of syncedSkills) {
62
+ console.log(skillName);
63
+ }
64
+ }
65
+ //# sourceMappingURL=sync-kb-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-kb-skills.js","sourceRoot":"","sources":["../../bin/sync-kb-skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { HooksConfig } from "./types.js";
2
+ /**
3
+ * 从 skills 目录加载所有 skill 的 hooks
4
+ */
5
+ export declare function loadSkillHooks(skillsDir: string, cwd: string, getSessionId: () => string | undefined): HooksConfig;
6
+ //# sourceMappingURL=hooks-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-loader.d.ts","sourceRoot":"","sources":["../../src/hooks-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAC;AAwL5D;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,MAAM,GAAG,SAAS,GACrC,WAAW,CAiFb"}
@@ -0,0 +1,215 @@
1
+ import { readFileSync, readdirSync, existsSync, writeFileSync, mkdirSync } from "fs";
2
+ import { join, dirname } from "path";
3
+ import yaml from "js-yaml";
4
+ import { execSync } from "child_process";
5
+ import { YamlValidator, formatValidationErrors, formatValidationWarning } from "./validation/index.js";
6
+ /**
7
+ * 从 SKILL.md 提取 YAML frontmatter
8
+ */
9
+ function extractYamlFrontmatter(content) {
10
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
11
+ if (!match)
12
+ return null;
13
+ try {
14
+ return yaml.load(match[1]);
15
+ }
16
+ catch (error) {
17
+ console.error("Failed to parse YAML frontmatter:", error);
18
+ return null;
19
+ }
20
+ }
21
+ /**
22
+ * 执行 shell 命令并返回结果
23
+ */
24
+ function executeCommand(command, cwd, skillDir, sessionId) {
25
+ try {
26
+ // 替换环境变量
27
+ const expandedCommand = command
28
+ .replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, skillDir)
29
+ .replace(/\$\{SESSION_ID\}/g, sessionId || 'default');
30
+ const result = execSync(expandedCommand, {
31
+ cwd,
32
+ encoding: "utf-8",
33
+ stdio: ["pipe", "pipe", "pipe"],
34
+ });
35
+ return result.trim();
36
+ }
37
+ catch (error) {
38
+ // 命令失败不阻塞,返回错误信息
39
+ return error.stdout || error.message || "";
40
+ }
41
+ }
42
+ /**
43
+ * 转换 skill hooks 为 SDK hooks 格式
44
+ */
45
+ function convertSkillHooksToSdkHooks(skillHooks, skillDir, cwd, getSessionId, hookType) {
46
+ return skillHooks.map((hookConfig) => ({
47
+ matcher: hookConfig.matcher,
48
+ hooks: hookConfig.hooks.map((hook) => {
49
+ // SDK HookCallback 签名: (input, toolUseID, options) => Promise<HookJSONOutput>
50
+ return async (input, toolUseID, options) => {
51
+ // PreToolUse: 拦截并重定向 planning 文件操作
52
+ if (hookType === "PreToolUse" && input.tool_name && input.tool_input) {
53
+ const toolName = input.tool_name;
54
+ const toolInput = input.tool_input;
55
+ // 处理文件操作工具的路径重定向
56
+ if ((toolName === "Write" || toolName === "Read" || toolName === "Edit") && toolInput.file_path) {
57
+ const filePath = toolInput.file_path;
58
+ if (filePath.includes(".planning/default/")) {
59
+ const sessionId = getSessionId() || "default";
60
+ const updatedPath = filePath.replace(".planning/default/", `.planning/${sessionId}/`);
61
+ console.log(`[hooks-loader] Intercepting and redirecting: ${filePath} -> ${updatedPath}`);
62
+ // 手动执行文件操作并 return,不要继续到 command 部分
63
+ try {
64
+ console.log(`[hooks-loader] Inside try block, toolName=${toolName}`);
65
+ if (toolName === "Write") {
66
+ console.log(`[hooks-loader] Handling Write operation`);
67
+ // 创建目录
68
+ const dir = dirname(updatedPath);
69
+ if (!existsSync(dir)) {
70
+ mkdirSync(dir, { recursive: true });
71
+ }
72
+ // 写入文件
73
+ writeFileSync(updatedPath, toolInput.content || "", "utf-8");
74
+ console.log(`[hooks-loader] File written to ${updatedPath}`);
75
+ // Block 原始工具执行
76
+ return {
77
+ decision: "block",
78
+ systemMessage: `File written to session-specific directory`,
79
+ };
80
+ }
81
+ else if (toolName === "Read") {
82
+ // 读取文件
83
+ if (existsSync(updatedPath)) {
84
+ const content = readFileSync(updatedPath, "utf-8");
85
+ console.log(`[hooks-loader] File read from ${updatedPath}`);
86
+ // Block 原始工具,返回文件内容
87
+ return {
88
+ decision: "block",
89
+ systemMessage: `File content:\n\n${content}`,
90
+ };
91
+ }
92
+ else {
93
+ return {
94
+ decision: "block",
95
+ systemMessage: `File not found: ${updatedPath}`,
96
+ };
97
+ }
98
+ }
99
+ else if (toolName === "Edit") {
100
+ // Edit 需要读取、修改、写入
101
+ if (existsSync(updatedPath)) {
102
+ let content = readFileSync(updatedPath, "utf-8");
103
+ // 执行替换
104
+ if (toolInput.old_string && toolInput.new_string) {
105
+ if (toolInput.replace_all) {
106
+ content = content.split(toolInput.old_string).join(toolInput.new_string);
107
+ }
108
+ else {
109
+ content = content.replace(toolInput.old_string, toolInput.new_string);
110
+ }
111
+ writeFileSync(updatedPath, content, "utf-8");
112
+ console.log(`[hooks-loader] File edited at ${updatedPath}`);
113
+ }
114
+ return {
115
+ decision: "block",
116
+ systemMessage: `File edited successfully`,
117
+ };
118
+ }
119
+ else {
120
+ return {
121
+ decision: "block",
122
+ systemMessage: `File not found: ${updatedPath}`,
123
+ };
124
+ }
125
+ }
126
+ }
127
+ catch (error) {
128
+ console.error(`[hooks-loader] Error:`, error);
129
+ return {
130
+ decision: "block",
131
+ systemMessage: `Error: ${error.message}`,
132
+ };
133
+ }
134
+ }
135
+ }
136
+ }
137
+ if (hook.type === "command") {
138
+ const sessionId = getSessionId();
139
+ const result = executeCommand(hook.command, cwd, skillDir, sessionId);
140
+ // 如果有输出,作为系统消息返回
141
+ if (result) {
142
+ return {
143
+ continue: true,
144
+ systemMessage: result,
145
+ };
146
+ }
147
+ }
148
+ return { continue: true };
149
+ };
150
+ }),
151
+ }));
152
+ }
153
+ /**
154
+ * 从 skills 目录加载所有 skill 的 hooks
155
+ */
156
+ export function loadSkillHooks(skillsDir, cwd, getSessionId) {
157
+ const hooks = {};
158
+ if (!existsSync(skillsDir)) {
159
+ return hooks;
160
+ }
161
+ const skillDirs = readdirSync(skillsDir, { withFileTypes: true })
162
+ .filter((dirent) => dirent.isDirectory())
163
+ .map((dirent) => dirent.name);
164
+ for (const skillName of skillDirs) {
165
+ const skillDir = join(skillsDir, skillName);
166
+ const skillMdPath = join(skillDir, "SKILL.md");
167
+ if (!existsSync(skillMdPath)) {
168
+ continue;
169
+ }
170
+ try {
171
+ const content = readFileSync(skillMdPath, "utf-8");
172
+ // 验证配置文件
173
+ const validator = new YamlValidator();
174
+ const validationResult = validator.validate(content, skillMdPath);
175
+ // 显示错误
176
+ if (!validationResult.valid) {
177
+ console.error(formatValidationErrors(validationResult.errors));
178
+ continue;
179
+ }
180
+ // 显示警告
181
+ if (validationResult.warnings && validationResult.warnings.length > 0) {
182
+ for (const warning of validationResult.warnings) {
183
+ console.warn(formatValidationWarning(warning));
184
+ }
185
+ }
186
+ const frontmatter = extractYamlFrontmatter(content);
187
+ if (!frontmatter?.hooks) {
188
+ continue;
189
+ }
190
+ // 转换各个 hook 事件
191
+ if (frontmatter.hooks.SessionStart) {
192
+ hooks.SessionStart = hooks.SessionStart || [];
193
+ hooks.SessionStart.push(...convertSkillHooksToSdkHooks(frontmatter.hooks.SessionStart, skillDir, cwd, getSessionId, "SessionStart"));
194
+ }
195
+ if (frontmatter.hooks.PreToolUse) {
196
+ hooks.PreToolUse = hooks.PreToolUse || [];
197
+ hooks.PreToolUse.push(...convertSkillHooksToSdkHooks(frontmatter.hooks.PreToolUse, skillDir, cwd, getSessionId, "PreToolUse"));
198
+ }
199
+ if (frontmatter.hooks.PostToolUse) {
200
+ hooks.PostToolUse = hooks.PostToolUse || [];
201
+ hooks.PostToolUse.push(...convertSkillHooksToSdkHooks(frontmatter.hooks.PostToolUse, skillDir, cwd, getSessionId, "PostToolUse"));
202
+ }
203
+ if (frontmatter.hooks.Stop) {
204
+ hooks.Stop = hooks.Stop || [];
205
+ hooks.Stop.push(...convertSkillHooksToSdkHooks(frontmatter.hooks.Stop, skillDir, cwd, getSessionId, "Stop"));
206
+ }
207
+ console.log(`[hooks-loader] Loaded hooks from skill: ${skillName}`);
208
+ }
209
+ catch (error) {
210
+ console.error(`[hooks-loader] Failed to load hooks from ${skillName}:`, error);
211
+ }
212
+ }
213
+ return hooks;
214
+ }
215
+ //# sourceMappingURL=hooks-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-loader.js","sourceRoot":"","sources":["../../src/hooks-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface AppProps {
2
+ cwd?: string;
3
+ }
4
+ export declare function App({ cwd }: AppProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/ui/App.tsx"],"names":[],"mappings":"AAcA,UAAU,QAAQ;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,QAAQ,2CAqMpC"}