evo-skills 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.
- package/.eslintrc.json +36 -0
- package/.prettierrc +11 -0
- package/README.md +227 -0
- package/USER-GUIDE.md +382 -0
- package/dist/cli/commands/diff.d.ts +7 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +126 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/freeze.d.ts +12 -0
- package/dist/cli/commands/freeze.d.ts.map +1 -0
- package/dist/cli/commands/freeze.js +93 -0
- package/dist/cli/commands/freeze.js.map +1 -0
- package/dist/cli/commands/log.d.ts +7 -0
- package/dist/cli/commands/log.d.ts.map +1 -0
- package/dist/cli/commands/log.js +76 -0
- package/dist/cli/commands/log.js.map +1 -0
- package/dist/cli/commands/rollback.d.ts +7 -0
- package/dist/cli/commands/rollback.d.ts.map +1 -0
- package/dist/cli/commands/rollback.js +92 -0
- package/dist/cli/commands/rollback.js.map +1 -0
- package/dist/cli/commands/status.d.ts +7 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +88 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +25 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/defaults.d.ts +6 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +31 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +68 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +195 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/evaluator/base-rule.d.ts +50 -0
- package/dist/core/evaluator/base-rule.d.ts.map +1 -0
- package/dist/core/evaluator/base-rule.js +69 -0
- package/dist/core/evaluator/base-rule.js.map +1 -0
- package/dist/core/evaluator/index.d.ts +33 -0
- package/dist/core/evaluator/index.d.ts.map +1 -0
- package/dist/core/evaluator/index.js +74 -0
- package/dist/core/evaluator/index.js.map +1 -0
- package/dist/core/evaluator/rules/repeated-drift.d.ts +19 -0
- package/dist/core/evaluator/rules/repeated-drift.d.ts.map +1 -0
- package/dist/core/evaluator/rules/repeated-drift.js +82 -0
- package/dist/core/evaluator/rules/repeated-drift.js.map +1 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.d.ts +23 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.d.ts.map +1 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.js +97 -0
- package/dist/core/evaluator/rules/repeated-manual-fix.js.map +1 -0
- package/dist/core/journal/index.d.ts +76 -0
- package/dist/core/journal/index.d.ts.map +1 -0
- package/dist/core/journal/index.js +207 -0
- package/dist/core/journal/index.js.map +1 -0
- package/dist/core/observer/base-observer.d.ts +64 -0
- package/dist/core/observer/base-observer.d.ts.map +1 -0
- package/dist/core/observer/base-observer.js +142 -0
- package/dist/core/observer/base-observer.js.map +1 -0
- package/dist/core/observer/codex-observer.d.ts +71 -0
- package/dist/core/observer/codex-observer.d.ts.map +1 -0
- package/dist/core/observer/codex-observer.js +248 -0
- package/dist/core/observer/codex-observer.js.map +1 -0
- package/dist/core/observer/index.d.ts +7 -0
- package/dist/core/observer/index.d.ts.map +1 -0
- package/dist/core/observer/index.js +7 -0
- package/dist/core/observer/index.js.map +1 -0
- package/dist/core/observer/trace-manager.d.ts +82 -0
- package/dist/core/observer/trace-manager.d.ts.map +1 -0
- package/dist/core/observer/trace-manager.js +196 -0
- package/dist/core/observer/trace-manager.js.map +1 -0
- package/dist/core/origin-registry/index.d.ts +59 -0
- package/dist/core/origin-registry/index.d.ts.map +1 -0
- package/dist/core/origin-registry/index.js +235 -0
- package/dist/core/origin-registry/index.js.map +1 -0
- package/dist/core/patch-generator/base-strategy.d.ts +35 -0
- package/dist/core/patch-generator/base-strategy.d.ts.map +1 -0
- package/dist/core/patch-generator/base-strategy.js +55 -0
- package/dist/core/patch-generator/base-strategy.js.map +1 -0
- package/dist/core/patch-generator/index.d.ts +32 -0
- package/dist/core/patch-generator/index.d.ts.map +1 -0
- package/dist/core/patch-generator/index.js +101 -0
- package/dist/core/patch-generator/index.js.map +1 -0
- package/dist/core/patch-generator/strategies/add-fallback.d.ts +11 -0
- package/dist/core/patch-generator/strategies/add-fallback.d.ts.map +1 -0
- package/dist/core/patch-generator/strategies/add-fallback.js +57 -0
- package/dist/core/patch-generator/strategies/add-fallback.js.map +1 -0
- package/dist/core/patch-generator/strategies/prune-noise.d.ts +11 -0
- package/dist/core/patch-generator/strategies/prune-noise.d.ts.map +1 -0
- package/dist/core/patch-generator/strategies/prune-noise.js +48 -0
- package/dist/core/patch-generator/strategies/prune-noise.js.map +1 -0
- package/dist/core/shadow-manager/index.d.ts +65 -0
- package/dist/core/shadow-manager/index.d.ts.map +1 -0
- package/dist/core/shadow-manager/index.js +229 -0
- package/dist/core/shadow-manager/index.js.map +1 -0
- package/dist/core/shadow-registry/index.d.ts +68 -0
- package/dist/core/shadow-registry/index.d.ts.map +1 -0
- package/dist/core/shadow-registry/index.js +173 -0
- package/dist/core/shadow-registry/index.js.map +1 -0
- package/dist/daemon/index.d.ts +43 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +144 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +7 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/markdown.d.ts +66 -0
- package/dist/storage/markdown.d.ts.map +1 -0
- package/dist/storage/markdown.js +227 -0
- package/dist/storage/markdown.js.map +1 -0
- package/dist/storage/ndjson.d.ts +118 -0
- package/dist/storage/ndjson.d.ts.map +1 -0
- package/dist/storage/ndjson.js +238 -0
- package/dist/storage/ndjson.js.map +1 -0
- package/dist/storage/sqlite.d.ts +131 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +415 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/types/index.d.ts +158 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/diff.d.ts +20 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +47 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/hash.d.ts +17 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +28 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +64 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path.d.ts +67 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +115 -0
- package/dist/utils/path.js.map +1 -0
- package/docs/ENGINEERING_PLAN.md +1065 -0
- package/docs/PRD.md +1004 -0
- package/docs/PROGRESS.md +523 -0
- package/package.json +60 -0
- package/src/cli/commands/diff.ts +158 -0
- package/src/cli/commands/freeze.ts +108 -0
- package/src/cli/commands/log.ts +87 -0
- package/src/cli/commands/rollback.ts +99 -0
- package/src/cli/commands/status.ts +101 -0
- package/src/cli/index.ts +31 -0
- package/src/config/defaults.ts +32 -0
- package/src/config/index.ts +220 -0
- package/src/core/evaluator/base-rule.ts +90 -0
- package/src/core/evaluator/index.ts +86 -0
- package/src/core/evaluator/rules/repeated-drift.ts +109 -0
- package/src/core/evaluator/rules/repeated-manual-fix.ts +129 -0
- package/src/core/journal/index.ts +286 -0
- package/src/core/observer/base-observer.ts +200 -0
- package/src/core/observer/codex-observer.ts +309 -0
- package/src/core/observer/index.ts +7 -0
- package/src/core/observer/trace-manager.ts +250 -0
- package/src/core/origin-registry/index.ts +264 -0
- package/src/core/patch-generator/base-strategy.ts +67 -0
- package/src/core/patch-generator/index.ts +118 -0
- package/src/core/patch-generator/strategies/add-fallback.ts +69 -0
- package/src/core/patch-generator/strategies/prune-noise.ts +65 -0
- package/src/core/shadow-manager/index.ts +278 -0
- package/src/core/shadow-registry/index.ts +200 -0
- package/src/daemon/index.ts +174 -0
- package/src/storage/index.ts +7 -0
- package/src/storage/markdown.ts +267 -0
- package/src/storage/ndjson.ts +273 -0
- package/src/storage/sqlite.ts +555 -0
- package/src/types/index.ts +212 -0
- package/src/utils/diff.ts +60 -0
- package/src/utils/hash.ts +31 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/logger.ts +78 -0
- package/src/utils/path.ts +129 -0
- package/tests/unit/config.test.ts +65 -0
- package/tests/unit/path.test.ts +89 -0
- package/tests/unit/utils.test.ts +45 -0
- package/tsconfig.json +31 -0
- package/vitest.config.ts +19 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 计算字符串的 SHA256 哈希
|
|
3
|
+
*/
|
|
4
|
+
export declare function hashString(content: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* 计算文件的 SHA256 哈希
|
|
7
|
+
*/
|
|
8
|
+
export declare function hashFile(filePath: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* 计算 Buffer 的 SHA256 哈希
|
|
11
|
+
*/
|
|
12
|
+
export declare function hashBuffer(buffer: Buffer): string;
|
|
13
|
+
/**
|
|
14
|
+
* 生成短哈希(前 8 位)
|
|
15
|
+
*/
|
|
16
|
+
export declare function shortHash(content: string): string;
|
|
17
|
+
//# sourceMappingURL=hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
/**
|
|
4
|
+
* 计算字符串的 SHA256 哈希
|
|
5
|
+
*/
|
|
6
|
+
export function hashString(content) {
|
|
7
|
+
return createHash('sha256').update(content).digest('hex');
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 计算文件的 SHA256 哈希
|
|
11
|
+
*/
|
|
12
|
+
export function hashFile(filePath) {
|
|
13
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
14
|
+
return hashString(content);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 计算 Buffer 的 SHA256 哈希
|
|
18
|
+
*/
|
|
19
|
+
export function hashBuffer(buffer) {
|
|
20
|
+
return createHash('sha256').update(buffer).digest('hex');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 生成短哈希(前 8 位)
|
|
24
|
+
*/
|
|
25
|
+
export function shortHash(content) {
|
|
26
|
+
return hashString(content).substring(0, 8);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
export declare const logger: winston.Logger;
|
|
3
|
+
/**
|
|
4
|
+
* 创建带上下文的 logger
|
|
5
|
+
*/
|
|
6
|
+
export declare function createChildLogger(context: string): winston.Logger;
|
|
7
|
+
/**
|
|
8
|
+
* 设置日志级别
|
|
9
|
+
*/
|
|
10
|
+
export declare function setLogLevel(level: string): void;
|
|
11
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AA+D9B,eAAO,MAAM,MAAM,gBAAiB,CAAC;AAErC;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/C"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
const LOG_DIR = join(homedir(), '.evo', 'logs');
|
|
6
|
+
/**
|
|
7
|
+
* 创建日志目录
|
|
8
|
+
*/
|
|
9
|
+
function ensureLogDir() {
|
|
10
|
+
if (!existsSync(LOG_DIR)) {
|
|
11
|
+
mkdirSync(LOG_DIR, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 自定义日志格式
|
|
16
|
+
*/
|
|
17
|
+
const logFormat = winston.format.combine(winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.errors({ stack: true }), winston.format.printf(({ timestamp, level, message, stack }) => {
|
|
18
|
+
const baseMessage = `[${timestamp}] ${level.toUpperCase()}: ${message}`;
|
|
19
|
+
return stack ? `${baseMessage}\n${stack}` : baseMessage;
|
|
20
|
+
}));
|
|
21
|
+
/**
|
|
22
|
+
* 创建主 logger
|
|
23
|
+
*/
|
|
24
|
+
function createLogger() {
|
|
25
|
+
ensureLogDir();
|
|
26
|
+
return winston.createLogger({
|
|
27
|
+
level: 'info',
|
|
28
|
+
format: logFormat,
|
|
29
|
+
transports: [
|
|
30
|
+
// 文件日志
|
|
31
|
+
new winston.transports.File({
|
|
32
|
+
filename: join(LOG_DIR, 'error.log'),
|
|
33
|
+
level: 'error',
|
|
34
|
+
maxsize: 5 * 1024 * 1024, // 5MB
|
|
35
|
+
maxFiles: 5,
|
|
36
|
+
}),
|
|
37
|
+
new winston.transports.File({
|
|
38
|
+
filename: join(LOG_DIR, 'combined.log'),
|
|
39
|
+
maxsize: 10 * 1024 * 1024, // 10MB
|
|
40
|
+
maxFiles: 10,
|
|
41
|
+
}),
|
|
42
|
+
// 控制台日志(仅在开发环境)
|
|
43
|
+
new winston.transports.Console({
|
|
44
|
+
format: winston.format.combine(winston.format.colorize(), logFormat),
|
|
45
|
+
silent: process.env.NODE_ENV === 'production',
|
|
46
|
+
}),
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
// 导出单例 logger
|
|
51
|
+
export const logger = createLogger();
|
|
52
|
+
/**
|
|
53
|
+
* 创建带上下文的 logger
|
|
54
|
+
*/
|
|
55
|
+
export function createChildLogger(context) {
|
|
56
|
+
return logger.child({ context });
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 设置日志级别
|
|
60
|
+
*/
|
|
61
|
+
export function setLogLevel(level) {
|
|
62
|
+
logger.level = level;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD;;GAEG;AACH,SAAS,YAAY;IACnB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CACtC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAC3D,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACtC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;IAC7D,MAAM,WAAW,GAAG,IAAI,SAAS,KAAK,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;IACxE,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,WAAW,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;AAC1D,CAAC,CAAC,CACH,CAAC;AAEF;;GAEG;AACH,SAAS,YAAY;IACnB,YAAY,EAAE,CAAC;IAEf,OAAO,OAAO,CAAC,YAAY,CAAC;QAC1B,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE;YACV,OAAO;YACP,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;gBAC1B,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;gBACpC,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,MAAM;gBAChC,QAAQ,EAAE,CAAC;aACZ,CAAC;YACF,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;gBAC1B,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;gBACvC,OAAO,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;gBAClC,QAAQ,EAAE,EAAE;aACb,CAAC;YACF,gBAAgB;YAChB,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC7B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EACzB,SAAS,CACV;gBACD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;aAC9C,CAAC;SACH;KACF,CAAC,CAAC;AACL,CAAC;AAED,cAAc;AACd,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { join, resolve, relative, dirname, basename, extname } from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* 展开路径中的 ~ 为用户主目录
|
|
4
|
+
*/
|
|
5
|
+
export declare function expandHome(path: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* 获取项目的 .evo 目录路径
|
|
8
|
+
*/
|
|
9
|
+
export declare function getEvoDir(projectRoot: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* 获取项目的 skills 目录路径
|
|
12
|
+
*/
|
|
13
|
+
export declare function getSkillsDir(projectRoot: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* 获取项目的 state 目录路径
|
|
16
|
+
*/
|
|
17
|
+
export declare function getStateDir(projectRoot: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* 获取项目的 config 目录路径
|
|
20
|
+
*/
|
|
21
|
+
export declare function getConfigDir(projectRoot: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* 获取 shadow skill 的路径
|
|
24
|
+
*/
|
|
25
|
+
export declare function getShadowSkillPath(projectRoot: string, skillId: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* 获取 shadow skill 的 meta.json 路径
|
|
28
|
+
*/
|
|
29
|
+
export declare function getShadowMetaPath(projectRoot: string, skillId: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* 获取 shadow skill 的 journal 路径
|
|
32
|
+
*/
|
|
33
|
+
export declare function getShadowJournalPath(projectRoot: string, skillId: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* 获取 shadow skill 的 snapshots 目录路径
|
|
36
|
+
*/
|
|
37
|
+
export declare function getSnapshotsDir(projectRoot: string, skillId: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* 检查路径是否存在
|
|
40
|
+
*/
|
|
41
|
+
export declare function pathExists(path: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* 检查是否是目录
|
|
44
|
+
*/
|
|
45
|
+
export declare function isDirectory(path: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* 检查是否是文件
|
|
48
|
+
*/
|
|
49
|
+
export declare function isFile(path: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* 获取相对路径
|
|
52
|
+
*/
|
|
53
|
+
export declare function getRelativePath(from: string, to: string): string;
|
|
54
|
+
/**
|
|
55
|
+
* 获取文件扩展名
|
|
56
|
+
*/
|
|
57
|
+
export declare function getExtension(path: string): string;
|
|
58
|
+
/**
|
|
59
|
+
* 获取文件名(不含扩展名)
|
|
60
|
+
*/
|
|
61
|
+
export declare function getFileNameWithoutExt(path: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* 获取目录名
|
|
64
|
+
*/
|
|
65
|
+
export declare function getDirName(path: string): string;
|
|
66
|
+
export { join, resolve, relative, dirname, basename, extname };
|
|
67
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIhF;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMjD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM5C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAGD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { join, resolve, relative, dirname, basename, extname } from 'node:path';
|
|
2
|
+
import { existsSync, statSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
/**
|
|
5
|
+
* 展开路径中的 ~ 为用户主目录
|
|
6
|
+
*/
|
|
7
|
+
export function expandHome(path) {
|
|
8
|
+
if (path.startsWith('~/') || path === '~') {
|
|
9
|
+
return path.replace('~', homedir());
|
|
10
|
+
}
|
|
11
|
+
return path;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 获取项目的 .evo 目录路径
|
|
15
|
+
*/
|
|
16
|
+
export function getEvoDir(projectRoot) {
|
|
17
|
+
return join(projectRoot, '.evo');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 获取项目的 skills 目录路径
|
|
21
|
+
*/
|
|
22
|
+
export function getSkillsDir(projectRoot) {
|
|
23
|
+
return join(projectRoot, '.evo', 'skills');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 获取项目的 state 目录路径
|
|
27
|
+
*/
|
|
28
|
+
export function getStateDir(projectRoot) {
|
|
29
|
+
return join(projectRoot, '.evo', 'state');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 获取项目的 config 目录路径
|
|
33
|
+
*/
|
|
34
|
+
export function getConfigDir(projectRoot) {
|
|
35
|
+
return join(projectRoot, '.evo', 'config');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 获取 shadow skill 的路径
|
|
39
|
+
*/
|
|
40
|
+
export function getShadowSkillPath(projectRoot, skillId) {
|
|
41
|
+
return join(projectRoot, '.evo', 'skills', skillId, 'current.md');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 获取 shadow skill 的 meta.json 路径
|
|
45
|
+
*/
|
|
46
|
+
export function getShadowMetaPath(projectRoot, skillId) {
|
|
47
|
+
return join(projectRoot, '.evo', 'skills', skillId, 'meta.json');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 获取 shadow skill 的 journal 路径
|
|
51
|
+
*/
|
|
52
|
+
export function getShadowJournalPath(projectRoot, skillId) {
|
|
53
|
+
return join(projectRoot, '.evo', 'skills', skillId, 'journal.ndjson');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 获取 shadow skill 的 snapshots 目录路径
|
|
57
|
+
*/
|
|
58
|
+
export function getSnapshotsDir(projectRoot, skillId) {
|
|
59
|
+
return join(projectRoot, '.evo', 'skills', skillId, 'snapshots');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 检查路径是否存在
|
|
63
|
+
*/
|
|
64
|
+
export function pathExists(path) {
|
|
65
|
+
return existsSync(path);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 检查是否是目录
|
|
69
|
+
*/
|
|
70
|
+
export function isDirectory(path) {
|
|
71
|
+
try {
|
|
72
|
+
return statSync(path).isDirectory();
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 检查是否是文件
|
|
80
|
+
*/
|
|
81
|
+
export function isFile(path) {
|
|
82
|
+
try {
|
|
83
|
+
return statSync(path).isFile();
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 获取相对路径
|
|
91
|
+
*/
|
|
92
|
+
export function getRelativePath(from, to) {
|
|
93
|
+
return relative(from, to);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 获取文件扩展名
|
|
97
|
+
*/
|
|
98
|
+
export function getExtension(path) {
|
|
99
|
+
return extname(path);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 获取文件名(不含扩展名)
|
|
103
|
+
*/
|
|
104
|
+
export function getFileNameWithoutExt(path) {
|
|
105
|
+
return basename(path, extname(path));
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 获取目录名
|
|
109
|
+
*/
|
|
110
|
+
export function getDirName(path) {
|
|
111
|
+
return dirname(path);
|
|
112
|
+
}
|
|
113
|
+
// 重新导出常用的 path 函数
|
|
114
|
+
export { join, resolve, relative, dirname, basename, extname };
|
|
115
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"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"}
|