ethan-skill 1.13.0 → 1.15.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 (42) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +1 -0
  3. package/dist/agents/orchestrator.d.ts.map +1 -1
  4. package/dist/agents/orchestrator.js +423 -2
  5. package/dist/agents/orchestrator.js.map +1 -1
  6. package/dist/agents/orchestrator.test.js +5 -6
  7. package/dist/agents/orchestrator.test.js.map +1 -1
  8. package/dist/agents/presets.d.ts +1 -1
  9. package/dist/agents/presets.d.ts.map +1 -1
  10. package/dist/agents/presets.js +42 -1
  11. package/dist/agents/presets.js.map +1 -1
  12. package/dist/agents/types.d.ts +4 -0
  13. package/dist/agents/types.d.ts.map +1 -1
  14. package/dist/cli/index.js +413 -26
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/extension/index.d.ts +54 -0
  17. package/dist/extension/index.d.ts.map +1 -0
  18. package/dist/extension/index.js +198 -0
  19. package/dist/extension/index.js.map +1 -0
  20. package/dist/mcp/server.d.ts.map +1 -1
  21. package/dist/mcp/server.js +90 -2
  22. package/dist/mcp/server.js.map +1 -1
  23. package/dist/memory/index.d.ts +42 -0
  24. package/dist/memory/index.d.ts.map +1 -0
  25. package/dist/memory/index.js +320 -0
  26. package/dist/memory/index.js.map +1 -0
  27. package/dist/memory/types.d.ts +47 -0
  28. package/dist/memory/types.d.ts.map +1 -0
  29. package/dist/memory/types.js +7 -0
  30. package/dist/memory/types.js.map +1 -0
  31. package/package.json +1 -1
  32. package/rules/claude-code/CLAUDE.md +2 -2
  33. package/rules/cline/.clinerules +2 -2
  34. package/rules/codebuddy/CODEBUDDY.md +2 -2
  35. package/rules/continue/.continuerules +2 -2
  36. package/rules/copilot/copilot-instructions.md +2 -2
  37. package/rules/cursor/.cursorrules +2 -2
  38. package/rules/cursor/smart-flow.mdc +2 -2
  39. package/rules/jetbrains/smart-flow.md +2 -2
  40. package/rules/lingma/smart-flow.md +2 -2
  41. package/rules/windsurf/.windsurf/rules/smart-flow.md +2 -2
  42. package/rules/zed/smart-flow.rules +1 -1
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Ethan Memory System — Core Module
3
+ * 提供持久化记忆存储、全文检索、标签索引和知识图谱能力
4
+ *
5
+ * 存储结构:
6
+ * ~/.ethan-memory/ 全局记忆库
7
+ * .ethan/memory/ 项目级记忆库
8
+ * .ethan/memory/index.json 快速检索索引(自动维护)
9
+ */
10
+ import type { MemoryEntry, MemoryIndex, SearchResult, MemoryStats } from './types';
11
+ export * from './types';
12
+ export declare const GLOBAL_MEMORY_DIR: string;
13
+ export declare function getMemoryDir(global: boolean, cwd?: string): string;
14
+ export declare function loadAllEntries(dir: string): MemoryEntry[];
15
+ export declare function saveEntry(entry: MemoryEntry, dir: string): void;
16
+ export declare function removeEntry(id: string, dir: string): boolean;
17
+ export declare function getEntry(id: string, dir: string): MemoryEntry | null;
18
+ export declare function loadIndex(dir: string): MemoryIndex | null;
19
+ /** 从当前目录所有记忆条目重建索引(增量维护代价高,直接全量重建) */
20
+ export declare function rebuildIndex(dir: string): MemoryIndex;
21
+ /**
22
+ * 全文检索:对 title、content、summary、tags 加权匹配
23
+ * 支持多词(所有词都命中得分最高)
24
+ */
25
+ export declare function searchMemory(query: string, dir: string, opts?: {
26
+ type?: MemoryEntry['type'];
27
+ tags?: string[];
28
+ project?: string;
29
+ limit?: number;
30
+ }): SearchResult[];
31
+ /** 生成短 ID(时间戳 + 随机) */
32
+ export declare function generateMemoryId(prefix?: string): string;
33
+ export declare function archiveWorkflowOutput(opts: {
34
+ skillId: string;
35
+ pipelineId: string;
36
+ summary: string;
37
+ content: string;
38
+ cwd: string;
39
+ rating?: number;
40
+ }): MemoryEntry;
41
+ export declare function getMemoryStats(dir: string): MemoryStats;
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEnF,cAAc,SAAS,CAAC;AAGxB,eAAO,MAAM,iBAAiB,QAA2C,CAAC;AAE1E,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAElE;AAGD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAczD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAS/D;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAM5D;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQpE;AAKD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQzD;AAED,sCAAsC;AACtC,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAgDrD;AAGD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IACJ,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,YAAY,EAAE,CAwBhB;AAgED,uBAAuB;AACvB,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAIxD;AAGD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,WAAW,CAkBd;AAGD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAoBvD"}
@@ -0,0 +1,320 @@
1
+ "use strict";
2
+ /**
3
+ * Ethan Memory System — Core Module
4
+ * 提供持久化记忆存储、全文检索、标签索引和知识图谱能力
5
+ *
6
+ * 存储结构:
7
+ * ~/.ethan-memory/ 全局记忆库
8
+ * .ethan/memory/ 项目级记忆库
9
+ * .ethan/memory/index.json 快速检索索引(自动维护)
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
45
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.GLOBAL_MEMORY_DIR = void 0;
49
+ exports.getMemoryDir = getMemoryDir;
50
+ exports.loadAllEntries = loadAllEntries;
51
+ exports.saveEntry = saveEntry;
52
+ exports.removeEntry = removeEntry;
53
+ exports.getEntry = getEntry;
54
+ exports.loadIndex = loadIndex;
55
+ exports.rebuildIndex = rebuildIndex;
56
+ exports.searchMemory = searchMemory;
57
+ exports.generateMemoryId = generateMemoryId;
58
+ exports.archiveWorkflowOutput = archiveWorkflowOutput;
59
+ exports.getMemoryStats = getMemoryStats;
60
+ const fs = __importStar(require("fs"));
61
+ const path = __importStar(require("path"));
62
+ const os = __importStar(require("os"));
63
+ __exportStar(require("./types"), exports);
64
+ // ─── 存储路径 ─────────────────────────────────────────────────────────────────
65
+ exports.GLOBAL_MEMORY_DIR = path.join(os.homedir(), '.ethan-memory');
66
+ function getMemoryDir(global, cwd) {
67
+ return global ? exports.GLOBAL_MEMORY_DIR : path.join(cwd ?? process.cwd(), '.ethan', 'memory');
68
+ }
69
+ // ─── 文件 I/O ─────────────────────────────────────────────────────────────────
70
+ function loadAllEntries(dir) {
71
+ if (!fs.existsSync(dir))
72
+ return [];
73
+ return fs
74
+ .readdirSync(dir)
75
+ .filter((f) => f.endsWith('.json') && f !== 'index.json')
76
+ .map((f) => {
77
+ try {
78
+ return JSON.parse(fs.readFileSync(path.join(dir, f), 'utf-8'));
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ })
84
+ .filter((e) => e !== null)
85
+ .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
86
+ }
87
+ function saveEntry(entry, dir) {
88
+ if (!fs.existsSync(dir))
89
+ fs.mkdirSync(dir, { recursive: true });
90
+ fs.writeFileSync(path.join(dir, `${entry.id}.json`), JSON.stringify(entry, null, 2), 'utf-8');
91
+ // 保存后自动重建索引
92
+ rebuildIndex(dir);
93
+ }
94
+ function removeEntry(id, dir) {
95
+ const file = path.join(dir, `${id}.json`);
96
+ if (!fs.existsSync(file))
97
+ return false;
98
+ fs.unlinkSync(file);
99
+ rebuildIndex(dir);
100
+ return true;
101
+ }
102
+ function getEntry(id, dir) {
103
+ const file = path.join(dir, `${id}.json`);
104
+ if (!fs.existsSync(file))
105
+ return null;
106
+ try {
107
+ return JSON.parse(fs.readFileSync(file, 'utf-8'));
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ // ─── 索引管理 ─────────────────────────────────────────────────────────────────
114
+ const INDEX_FILE = 'index.json';
115
+ function loadIndex(dir) {
116
+ const file = path.join(dir, INDEX_FILE);
117
+ if (!fs.existsSync(file))
118
+ return null;
119
+ try {
120
+ return JSON.parse(fs.readFileSync(file, 'utf-8'));
121
+ }
122
+ catch {
123
+ return null;
124
+ }
125
+ }
126
+ /** 从当前目录所有记忆条目重建索引(增量维护代价高,直接全量重建) */
127
+ function rebuildIndex(dir) {
128
+ var _a, _b, _c, _d, _e;
129
+ const entries = loadAllEntries(dir);
130
+ const index = {
131
+ version: 2,
132
+ updatedAt: new Date().toISOString(),
133
+ totalCount: entries.length,
134
+ invertedIndex: {},
135
+ tagIndex: {},
136
+ typeIndex: { workflow: [], skill: [], manual: [], decision: [], knowledge: [] },
137
+ projectIndex: {},
138
+ skillIndex: {},
139
+ };
140
+ for (const entry of entries) {
141
+ // 类型索引
142
+ if (index.typeIndex[entry.type]) {
143
+ index.typeIndex[entry.type].push(entry.id);
144
+ }
145
+ // 标签索引
146
+ for (const tag of entry.tags) {
147
+ ((_a = index.tagIndex)[tag] ?? (_a[tag] = [])).push(entry.id);
148
+ }
149
+ // 项目索引
150
+ if (entry.project) {
151
+ ((_b = index.projectIndex)[_c = entry.project] ?? (_b[_c] = [])).push(entry.id);
152
+ }
153
+ // Skill 索引
154
+ if (entry.skillId) {
155
+ ((_d = index.skillIndex)[_e = entry.skillId] ?? (_d[_e] = [])).push(entry.id);
156
+ }
157
+ // 倒排索引:对 title + summary + tags 分词
158
+ const text = `${entry.title} ${entry.summary ?? ''} ${entry.tags.join(' ')}`;
159
+ for (const token of tokenize(text)) {
160
+ if (!index.invertedIndex[token]) {
161
+ index.invertedIndex[token] = [entry.id];
162
+ }
163
+ else if (!index.invertedIndex[token].includes(entry.id)) {
164
+ index.invertedIndex[token].push(entry.id);
165
+ }
166
+ }
167
+ }
168
+ if (!fs.existsSync(dir))
169
+ fs.mkdirSync(dir, { recursive: true });
170
+ fs.writeFileSync(path.join(dir, INDEX_FILE), JSON.stringify(index, null, 2), 'utf-8');
171
+ return index;
172
+ }
173
+ // ─── 检索 ─────────────────────────────────────────────────────────────────────
174
+ /**
175
+ * 全文检索:对 title、content、summary、tags 加权匹配
176
+ * 支持多词(所有词都命中得分最高)
177
+ */
178
+ function searchMemory(query, dir, opts = {}) {
179
+ const entries = loadAllEntries(dir);
180
+ if (!entries.length)
181
+ return [];
182
+ const queryTokens = tokenize(query.toLowerCase());
183
+ const results = [];
184
+ for (const entry of entries) {
185
+ // 类型过滤
186
+ if (opts.type && entry.type !== opts.type)
187
+ continue;
188
+ // 标签过滤(AND 语义)
189
+ if (opts.tags?.length && !opts.tags.every((t) => entry.tags.includes(t)))
190
+ continue;
191
+ // 项目过滤
192
+ if (opts.project && entry.project !== opts.project)
193
+ continue;
194
+ const { score, matchedFields, snippet } = scoreEntry(entry, queryTokens, query);
195
+ if (score > 0) {
196
+ results.push({ entry, score, matchedFields, snippet });
197
+ }
198
+ }
199
+ // 按分数降序,再按时间降序
200
+ results.sort((a, b) => b.score - a.score || new Date(b.entry.createdAt).getTime() - new Date(a.entry.createdAt).getTime());
201
+ return results.slice(0, opts.limit ?? 20);
202
+ }
203
+ function scoreEntry(entry, queryTokens, rawQuery) {
204
+ let score = 0;
205
+ const matchedFields = [];
206
+ const titleLower = entry.title.toLowerCase();
207
+ const contentLower = entry.content.toLowerCase();
208
+ const summaryLower = (entry.summary ?? '').toLowerCase();
209
+ const tagsLower = entry.tags.map((t) => t.toLowerCase()).join(' ');
210
+ const rawLower = rawQuery.toLowerCase();
211
+ // 精确短语匹配(最高权重)
212
+ if (titleLower.includes(rawLower)) {
213
+ score += 100;
214
+ matchedFields.push('title');
215
+ }
216
+ if (summaryLower.includes(rawLower)) {
217
+ score += 60;
218
+ matchedFields.push('summary');
219
+ }
220
+ if (contentLower.includes(rawLower)) {
221
+ score += 30;
222
+ matchedFields.push('content');
223
+ }
224
+ if (tagsLower.includes(rawLower)) {
225
+ score += 50;
226
+ matchedFields.push('tags');
227
+ }
228
+ // 分词匹配
229
+ for (const token of queryTokens) {
230
+ if (titleLower.includes(token))
231
+ score += 20;
232
+ if (summaryLower.includes(token))
233
+ score += 10;
234
+ if (contentLower.includes(token))
235
+ score += 5;
236
+ if (tagsLower.includes(token))
237
+ score += 15;
238
+ }
239
+ // 重要度加权
240
+ if (entry.rating)
241
+ score += entry.rating * 5;
242
+ // 生成摘要片段(显示匹配上下文)
243
+ let snippet = entry.summary ?? entry.content.slice(0, 120);
244
+ const idx = contentLower.indexOf(rawLower);
245
+ if (idx > -1) {
246
+ const start = Math.max(0, idx - 40);
247
+ const end = Math.min(entry.content.length, idx + rawLower.length + 80);
248
+ snippet = (start > 0 ? '...' : '') + entry.content.slice(start, end) + (end < entry.content.length ? '...' : '');
249
+ }
250
+ return { score, matchedFields: [...new Set(matchedFields)], snippet };
251
+ }
252
+ // ─── 工具函数 ─────────────────────────────────────────────────────────────────
253
+ /** 简单中英文分词(空格 + CJK 字符级别) */
254
+ function tokenize(text) {
255
+ const tokens = new Set();
256
+ // 英文分词(按空格和标点)
257
+ for (const word of text.split(/[\s\-_.,!?,。!?\\/()()\[\]]+/)) {
258
+ if (word.length >= 2)
259
+ tokens.add(word.toLowerCase());
260
+ }
261
+ // CJK 字符:每个字单独作为 token,也提取 2-gram
262
+ const cjk = text.match(/[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff]+/g) ?? [];
263
+ for (const seg of cjk) {
264
+ for (let i = 0; i < seg.length; i++) {
265
+ tokens.add(seg[i]);
266
+ if (i + 1 < seg.length)
267
+ tokens.add(seg.slice(i, i + 2));
268
+ }
269
+ }
270
+ return [...tokens].filter((t) => t.length >= 1);
271
+ }
272
+ /** 生成短 ID(时间戳 + 随机) */
273
+ function generateMemoryId(prefix) {
274
+ const ts = Date.now().toString(36);
275
+ const rand = Math.random().toString(36).slice(2, 6);
276
+ return prefix ? `${prefix}-${ts}-${rand}` : `${ts}-${rand}`;
277
+ }
278
+ // ─── 归档工作流产出 ───────────────────────────────────────────────────────────
279
+ function archiveWorkflowOutput(opts) {
280
+ const { skillId, pipelineId, summary, content, cwd, rating } = opts;
281
+ const entry = {
282
+ id: generateMemoryId(skillId),
283
+ type: 'workflow',
284
+ skillId,
285
+ pipelineId,
286
+ title: `[${pipelineId}] ${skillId} — ${summary.slice(0, 60)}`,
287
+ content,
288
+ summary: summary.slice(0, 200),
289
+ tags: [skillId, pipelineId, path.basename(cwd)],
290
+ project: path.basename(cwd),
291
+ createdAt: new Date().toISOString(),
292
+ source: 'workflow',
293
+ ...(rating !== undefined ? { rating } : {}),
294
+ };
295
+ saveEntry(entry, getMemoryDir(false, cwd));
296
+ return entry;
297
+ }
298
+ // ─── 统计 ─────────────────────────────────────────────────────────────────────
299
+ function getMemoryStats(dir) {
300
+ const entries = loadAllEntries(dir);
301
+ const byType = {};
302
+ const byProject = {};
303
+ const tagCount = {};
304
+ let recentActivity = '';
305
+ for (const e of entries) {
306
+ byType[e.type] = (byType[e.type] ?? 0) + 1;
307
+ if (e.project)
308
+ byProject[e.project] = (byProject[e.project] ?? 0) + 1;
309
+ for (const t of e.tags)
310
+ tagCount[t] = (tagCount[t] ?? 0) + 1;
311
+ if (!recentActivity || e.createdAt > recentActivity)
312
+ recentActivity = e.createdAt;
313
+ }
314
+ const topTags = Object.entries(tagCount)
315
+ .sort((a, b) => b[1] - a[1])
316
+ .slice(0, 10)
317
+ .map(([tag, count]) => ({ tag, count }));
318
+ return { totalEntries: entries.length, byType, byProject, topTags, recentActivity };
319
+ }
320
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Ethan Memory System — Types
3
+ * 跨会话持久化记忆与快速检索的类型定义
4
+ */
5
+ export interface MemoryEntry {
6
+ id: string;
7
+ type: 'workflow' | 'skill' | 'manual' | 'decision' | 'knowledge';
8
+ skillId?: string;
9
+ pipelineId?: string;
10
+ title: string;
11
+ content: string;
12
+ summary?: string;
13
+ tags: string[];
14
+ project?: string;
15
+ createdAt: string;
16
+ updatedAt?: string;
17
+ rating?: number;
18
+ source?: string;
19
+ relatedIds?: string[];
20
+ }
21
+ export interface MemoryIndex {
22
+ version: 2;
23
+ updatedAt: string;
24
+ totalCount: number;
25
+ invertedIndex: Record<string, string[]>;
26
+ tagIndex: Record<string, string[]>;
27
+ typeIndex: Record<MemoryEntry['type'], string[]>;
28
+ projectIndex: Record<string, string[]>;
29
+ skillIndex: Record<string, string[]>;
30
+ }
31
+ export interface SearchResult {
32
+ entry: MemoryEntry;
33
+ score: number;
34
+ matchedFields: string[];
35
+ snippet: string;
36
+ }
37
+ export interface MemoryStats {
38
+ totalEntries: number;
39
+ byType: Record<string, number>;
40
+ byProject: Record<string, number>;
41
+ topTags: Array<{
42
+ tag: string;
43
+ count: number;
44
+ }>;
45
+ recentActivity: string;
46
+ }
47
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IAEnB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAExC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnC,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;CACxB"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * Ethan Memory System — Types
4
+ * 跨会话持久化记忆与快速检索的类型定义
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ethan-skill",
3
- "version": "1.13.0",
3
+ "version": "1.15.0",
4
4
  "description": "Ethan - Your AI Workflow Assistant",
5
5
  "keywords": [
6
6
  "ai-skill",
@@ -1,6 +1,6 @@
1
- # Ethan v1.12.0
1
+ # Ethan v1.15.0
2
2
 
3
- > Auto-generated from src/skills/ | 2026-04-06T16:19:27.840Z
3
+ > Auto-generated from src/skills/ | 2026-04-11T16:46:27.639Z
4
4
  > Do not edit manually. Source: src/skills/
5
5
 
6
6
  ## Ethan
@@ -1,5 +1,5 @@
1
- # Ethan v1.12.0
2
- # Generated: 2026-04-06T16:19:27.840Z
1
+ # Ethan v1.15.0
2
+ # Generated: 2026-04-11T16:46:27.639Z
3
3
  # Source: https://github.com/aokiz-ek/smart-flow-skill
4
4
 
5
5
  Ethan。当用户输入以下触发词时,按对应 Skill 的步骤执行。
@@ -1,6 +1,6 @@
1
- # Ethan v1.12.0
1
+ # Ethan v1.15.0
2
2
 
3
- Ethan - Your AI Workflow Assistant | Generated: 2026-04-06T16:19:27.840Z
3
+ Ethan - Your AI Workflow Assistant | Generated: 2026-04-11T16:46:27.639Z
4
4
 
5
5
  ## 重要:Skill 激活规则
6
6
 
@@ -1,5 +1,5 @@
1
- # Ethan v1.12.0
2
- # Generated: 2026-04-06T16:19:27.840Z
1
+ # Ethan v1.15.0
2
+ # Generated: 2026-04-11T16:46:27.639Z
3
3
  # Source: https://github.com/aokiz-ek/smart-flow-skill
4
4
 
5
5
  Ethan(Continue)。当用户输入以下触发词时,按对应 Skill 的步骤执行。
@@ -1,6 +1,6 @@
1
- # Ethan - Copilot Instructions (v1.12.0)
1
+ # Ethan - Copilot Instructions (v1.15.0)
2
2
 
3
- > Auto-generated from src/skills/ | 2026-04-06T16:19:27.840Z
3
+ > Auto-generated from src/skills/ | 2026-04-11T16:46:27.639Z
4
4
  > Do not edit manually.
5
5
 
6
6
  ## IMPORTANT: Skill Activation Rules
@@ -1,7 +1,7 @@
1
- # Ethan v1.12.0
1
+ # Ethan v1.15.0
2
2
 
3
3
  > 自动生成 - 请勿手动修改,源文件:src/skills/
4
- > Generated at: 2026-04-06T16:19:27.840Z
4
+ > Generated at: 2026-04-11T16:46:27.639Z
5
5
 
6
6
  ## 重要:Skill 激活规则
7
7
 
@@ -4,10 +4,10 @@ globs:
4
4
  alwaysApply: true
5
5
  ---
6
6
 
7
- # Ethan v1.12.0
7
+ # Ethan v1.15.0
8
8
 
9
9
  > 自动生成 - 请勿手动修改,源文件:src/skills/
10
- > Generated at: 2026-04-06T16:19:27.840Z
10
+ > Generated at: 2026-04-11T16:46:27.639Z
11
11
 
12
12
  ## 重要:Skill 激活规则
13
13
 
@@ -1,6 +1,6 @@
1
- # Ethan - JetBrains AI Instructions (v1.12.0)
1
+ # Ethan - JetBrains AI Instructions (v1.15.0)
2
2
 
3
- > Auto-generated from src/skills/ | 2026-04-06T16:19:27.840Z
3
+ > Auto-generated from src/skills/ | 2026-04-11T16:46:27.639Z
4
4
  > Do not edit manually.
5
5
 
6
6
  ## IMPORTANT: Skill Activation Rules
@@ -1,6 +1,6 @@
1
- # Ethan v1.12.0
1
+ # Ethan v1.15.0
2
2
 
3
- > 生成时间:2026-04-06T16:19:27.840Z
3
+ > 生成时间:2026-04-11T16:46:27.639Z
4
4
 
5
5
  ## 功能说明
6
6
 
@@ -4,9 +4,9 @@ globs: ["**/*"]
4
4
  alwaysApply: true
5
5
  ---
6
6
 
7
- # Ethan - Windsurf Rules (v1.12.0)
7
+ # Ethan - Windsurf Rules (v1.15.0)
8
8
 
9
- > Auto-generated from src/skills/ | 2026-04-06T16:19:27.840Z
9
+ > Auto-generated from src/skills/ | 2026-04-11T16:46:27.639Z
10
10
  > Do not edit manually.
11
11
 
12
12
  ## IMPORTANT: Skill Activation Rules
@@ -1,4 +1,4 @@
1
- Ethan v1.12.0 | 2026-04-06T16:19:27.840Z
1
+ Ethan v1.15.0 | 2026-04-11T16:46:27.639Z
2
2
 
3
3
  Workflow automation assistant. IMPORTANT: When user message matches a trigger keyword below, immediately activate that skill and execute ALL steps in order. Do not skip steps. Output per skill template.
4
4