@optima-chat/optima-agent 0.8.97 → 0.8.99

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 +76 -0
  4. package/.claude/skills/initializing-kb/SKILL.md +102 -0
  5. package/.claude/skills/kol-outreach/SKILL.md +351 -272
  6. package/.claude/skills/linting-the-wiki/SKILL.md +69 -0
  7. package/.claude/skills/querying-the-wiki/SKILL.md +66 -0
  8. package/.claude/skills/updating-related-pages/SKILL.md +76 -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 +6 -4
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: linting-the-wiki
3
+ description: Use when a maintained knowledge base needs a health check for gaps, stale claims, contradictions, missing links, or indexing issues.
4
+ ---
5
+
6
+ # Linting The Wiki
7
+
8
+ 这个 skill 用来检查 wiki 随时间推移后的完整性和可维护性。
9
+
10
+ ## 职责
11
+
12
+ - 识别 orphan pages
13
+ - 识别断链或缺失链接
14
+ - 识别过时或已被覆盖的结论
15
+ - 识别矛盾
16
+ - 识别索引覆盖不足
17
+ - 识别值得通过 web search 或补充来源来填补的数据空白
18
+ - 提出或执行有边界的修复
19
+
20
+ ## 不负责
21
+
22
+ - 初始 schema 设计
23
+ - 无边界 wiki 重写
24
+
25
+ ## 工作规则
26
+
27
+ lint 的目标是让维护债务变得可见。如果某条结论已经过时或被冲突信息挑战,这件事应该很容易被发现。
28
+
29
+ ## 流程
30
+
31
+ 使用这个 skill 时,按以下顺序进行:
32
+
33
+ 1. 检查 `index.md`、关键 wiki 目录和一组有代表性的页面
34
+ 2. 先识别结构性问题,再决定是否动手修改
35
+ 3. 按类型归类问题:链接、覆盖度、过时、矛盾、重复、页面规模或索引问题
36
+ 4. 除非用户要求更大范围修复,否则只应用小而明确的修补
37
+ 5. 清楚报告仍未解决的问题
38
+
39
+ ## 要检查什么
40
+
41
+ 应检查:
42
+
43
+ - 没有入链或出链的页面
44
+ - 被反复提及但没有独立页面的实体或概念
45
+ - 本应并入 overview 的 analysis 页面,或反过来的情况
46
+ - 新来源进入后仍未更新的旧综述
47
+ - `index.md` 与实际长期页面之间的漂移
48
+ - 为了清晰起见应被拆分的大页面
49
+ - 由于缺少来源而无法回答、但明显值得继续调查的问题
50
+
51
+ ## 修复边界
52
+
53
+ 安全的 lint 修复通常包括:
54
+
55
+ - 增加缺失链接
56
+ - 更新 `index.md`
57
+ - 澄清过时标签
58
+ - 就地标出矛盾
59
+
60
+ 不要把 lint 变成无边界重写。如果需要更深层次的结构调整,要明确说出来,并在边界处停下,除非用户明确要求继续。
61
+
62
+ ## 最小交付标准
63
+
64
+ 一次成功的 lint 至少应留下:
65
+
66
+ - 一份简短但具体的问题清单
67
+ - 已经完成的有边界修复
68
+ - 已修复问题与剩余债务之间的清晰区分
69
+ - 需要通过新来源或 web search 继续补足的空白点
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: querying-the-wiki
3
+ description: Use when answering questions against an existing wiki-like knowledge base and deciding whether the result should be preserved.
4
+ ---
5
+
6
+ # Querying The Wiki
7
+
8
+ 这个 skill 通过把“维护后的 wiki”视为主要知识层来回答问题。
9
+
10
+ ## 职责
11
+
12
+ - 从 `index.md` 开始
13
+ - 阅读相关 wiki 页面
14
+ - 优先基于维护后的 wiki 回答
15
+ - 在适当时把长期有效的结果回写到 `wiki/analyses/` 或 overview 页面
16
+
17
+ ## 不负责
18
+
19
+ - 把每个问题都转成新的 ingest
20
+ - 大规模维护性重构
21
+
22
+ ## 工作规则
23
+
24
+ 如果一个答案之后大概率还会有用,就应把它保存在 wiki 中,而不是只留在聊天里。
25
+
26
+ ## 流程
27
+
28
+ 使用这个 skill 时,按以下顺序进行:
29
+
30
+ 1. 阅读 `index.md`
31
+ 2. 找到最相关的 wiki 页面
32
+ 3. 优先基于这些维护后的页面回答
33
+ 4. 只有在 wiki 不完整或含混时才回到 raw sources
34
+ 5. 判断这个答案是否应该被保留
35
+ 6. 如果应该,就把它写进 `wiki/analyses/` 或对应 overview 页面
36
+
37
+ ## Query 规则
38
+
39
+ 回答时:
40
+
41
+ - 优先使用维护后的 wiki,而不是每次从头重建
42
+ - 当答案依赖不完整或过时的 wiki 覆盖时,要说清楚
43
+ - 把 source-backed 内容与综合推断区分开
44
+ - 标出这个问题是否暴露了 wiki 的结构性空缺
45
+ - 尽量在答案中显式引用所使用的 wiki 页面;如果回看了 raw sources,也要说明
46
+
47
+ ## 何时保留结果
48
+
49
+ 在下列情况下,应把结果写回 wiki:
50
+
51
+ - 同一个问题很可能会再次出现
52
+ - 这个答案比较了多个来源或页面
53
+ - 这个答案形成了可长期复用的综合
54
+ - 这个答案解决了当前 wiki 尚未解释清楚的混乱点
55
+
56
+ 独立的长期输出应进入 `wiki/analyses/`。如果这个答案主要是在改进某个主题的现有综述,则应写入对应 overview 页面。
57
+
58
+ ## 最小交付标准
59
+
60
+ 一次成功的 query 至少应产出:
61
+
62
+ - 一个直接回答用户问题的结果
63
+ - 在答案中或答案后明确引用使用了哪些 wiki 页面
64
+ - 清楚说明这个结果是否值得被保留
65
+
66
+ 如果答案暴露了长期缺口,却没有说明 wiki 该在哪里补强,这次 query 就是不完整的。
@@ -0,0 +1,76 @@
1
+ ---
2
+ name: updating-related-pages
3
+ description: Use when newly ingested source material affects existing entity pages, overview pages, or cross-references in the wiki.
4
+ ---
5
+
6
+ # Updating Related Pages
7
+
8
+ 这个 skill 用来在来源 ingest 之后,同步 wiki 的其他部分。
9
+
10
+ ## 职责
11
+
12
+ - 更新相关 entity 页面
13
+ - 更新相关 overview 页面
14
+ - 增加或修复交叉链接
15
+ - 显式记录冲突
16
+ - 更新 `index.md`
17
+ - 追加 `log.md`
18
+
19
+ ## 不负责
20
+
21
+ - 独自承担完整 ingest 流程
22
+ - 替代 query 行为
23
+
24
+ ## 工作规则
25
+
26
+ 当新证据改变已有认知时,不要静默覆盖旧结论。应把修正过程明确写出来。
27
+
28
+ ## 流程
29
+
30
+ 使用这个 skill 时,按以下顺序进行:
31
+
32
+ 1. 从来源页或 ingest 产出的 affected-page 列表开始
33
+ 2. 确认哪些 entity、overview 和 analysis 页面需要更新
34
+ 3. 优先更新现有页面,而不是先新建页面
35
+ 4. 为这些变更后的页面补齐或修复交叉链接
36
+ 5. 如果创建了新的长期页面,则更新 `index.md`
37
+ 6. 如果这次变更实质性影响了 wiki,则在 `log.md` 中追加记录
38
+
39
+ ## 更新规则
40
+
41
+ 更新既有页面时:
42
+
43
+ - 保持页面的稳定职责
44
+ - 把新信息合并进正确的 section,而不是随手堆一段笔记
45
+ - 当新来源改变了先前理解时,要让修正过程可见
46
+ - 让 source-backed 内容与综合推断保持可区分
47
+ - 优先使用可链接的短陈述,而不是长段无结构文字
48
+
49
+ ## 冲突处理
50
+
51
+ 如果新来源与旧页面冲突:
52
+
53
+ - 不要无解释地删除旧结论
54
+ - 记录新的证据
55
+ - 更新当前理解
56
+ - 让之后的读者仍然看得出分歧在哪里
57
+
58
+ 页面要体现“理解是如何变化的”,而不只是“它发生了变化”。
59
+
60
+ ## 何时创建新页面
61
+
62
+ 只有在下列情况下才应新建页面:
63
+
64
+ - 新信息引入了一个 recurring concept,但还没有稳定 landing page
65
+ - 某个 analysis 或 comparison 已经有独立长期价值
66
+ - 现有页面已经过宽,无法干净吸收这次更新
67
+
68
+ 如果对现有页面做一次聚焦更新会让 wiki 更清楚,那就不要新建页面。
69
+
70
+ ## 最小交付标准
71
+
72
+ 一次成功的 related-page update 至少应留下:
73
+
74
+ - 被同步更新过的相关页面,而不是只有一张孤立来源页
75
+ - source、entity、overview 和 analysis 页面之间清晰的交叉链接
76
+ - 在适用时,对“理解发生变化”这件事有可见处理
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"}