agent-ide 0.1.7 → 0.1.9
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/dist/core/analysis/complexity-analyzer.d.ts.map +1 -1
- package/dist/core/analysis/complexity-analyzer.js +3 -2
- package/dist/core/analysis/complexity-analyzer.js.map +1 -1
- package/dist/core/analysis/dead-code-detector.d.ts +39 -10
- package/dist/core/analysis/dead-code-detector.d.ts.map +1 -1
- package/dist/core/analysis/dead-code-detector.js +160 -84
- package/dist/core/analysis/dead-code-detector.js.map +1 -1
- package/dist/core/analysis/index.d.ts +1 -1
- package/dist/core/analysis/index.d.ts.map +1 -1
- package/dist/core/dependency/dependency-analyzer.d.ts.map +1 -1
- package/dist/core/dependency/dependency-analyzer.js +11 -4
- package/dist/core/dependency/dependency-analyzer.js.map +1 -1
- package/dist/core/indexing/index-engine.d.ts +9 -0
- package/dist/core/indexing/index-engine.d.ts.map +1 -1
- package/dist/core/indexing/index-engine.js +60 -1
- package/dist/core/indexing/index-engine.js.map +1 -1
- package/dist/core/refactor/extract-function.d.ts +26 -4
- package/dist/core/refactor/extract-function.d.ts.map +1 -1
- package/dist/core/refactor/extract-function.js +300 -48
- package/dist/core/refactor/extract-function.js.map +1 -1
- package/dist/infrastructure/parser/base.d.ts +17 -0
- package/dist/infrastructure/parser/base.d.ts.map +1 -1
- package/dist/infrastructure/parser/base.js +58 -1
- package/dist/infrastructure/parser/base.js.map +1 -1
- package/dist/infrastructure/parser/interface.d.ts +20 -0
- package/dist/infrastructure/parser/interface.d.ts.map +1 -1
- package/dist/infrastructure/parser/interface.js +2 -0
- package/dist/infrastructure/parser/interface.js.map +1 -1
- package/dist/interfaces/cli/cli.d.ts +13 -1
- package/dist/interfaces/cli/cli.d.ts.map +1 -1
- package/dist/interfaces/cli/cli.js +155 -15
- package/dist/interfaces/cli/cli.js.map +1 -1
- package/dist/interfaces/cli/output-formatter.d.ts +55 -0
- package/dist/interfaces/cli/output-formatter.d.ts.map +1 -0
- package/dist/interfaces/cli/output-formatter.js +195 -0
- package/dist/interfaces/cli/output-formatter.js.map +1 -0
- package/dist/plugins/javascript/parser.d.ts +17 -0
- package/dist/plugins/javascript/parser.d.ts.map +1 -1
- package/dist/plugins/javascript/parser.js +71 -0
- package/dist/plugins/javascript/parser.js.map +1 -1
- package/dist/plugins/typescript/parser.d.ts +16 -0
- package/dist/plugins/typescript/parser.d.ts.map +1 -1
- package/dist/plugins/typescript/parser.js +76 -0
- package/dist/plugins/typescript/parser.js.map +1 -1
- package/package.json +8 -14
- package/dist/core/performance/analyzer.d.ts +0 -62
- package/dist/core/performance/analyzer.d.ts.map +0 -1
- package/dist/core/performance/analyzer.js +0 -378
- package/dist/core/performance/analyzer.js.map +0 -1
- package/dist/core/performance/cache-manager.d.ts +0 -161
- package/dist/core/performance/cache-manager.d.ts.map +0 -1
- package/dist/core/performance/cache-manager.js +0 -375
- package/dist/core/performance/cache-manager.js.map +0 -1
- package/dist/core/performance/index.d.ts +0 -14
- package/dist/core/performance/index.d.ts.map +0 -1
- package/dist/core/performance/index.js +0 -17
- package/dist/core/performance/index.js.map +0 -1
- package/dist/core/performance/interfaces.d.ts +0 -188
- package/dist/core/performance/interfaces.d.ts.map +0 -1
- package/dist/core/performance/interfaces.js +0 -17
- package/dist/core/performance/interfaces.js.map +0 -1
- package/dist/core/performance/memory-manager.d.ts +0 -176
- package/dist/core/performance/memory-manager.d.ts.map +0 -1
- package/dist/core/performance/memory-manager.js +0 -364
- package/dist/core/performance/memory-manager.js.map +0 -1
- package/dist/core/performance/monitor.d.ts +0 -92
- package/dist/core/performance/monitor.d.ts.map +0 -1
- package/dist/core/performance/monitor.js +0 -228
- package/dist/core/performance/monitor.js.map +0 -1
- package/dist/plugins/swift/index.d.ts +0 -11
- package/dist/plugins/swift/index.d.ts.map +0 -1
- package/dist/plugins/swift/index.js +0 -15
- package/dist/plugins/swift/index.js.map +0 -1
- package/dist/plugins/swift/parser.d.ts +0 -98
- package/dist/plugins/swift/parser.d.ts.map +0 -1
- package/dist/plugins/swift/parser.js +0 -612
- package/dist/plugins/swift/parser.js.map +0 -1
- package/dist/plugins/swift/types.d.ts +0 -196
- package/dist/plugins/swift/types.d.ts.map +0 -1
- package/dist/plugins/swift/types.js +0 -268
- package/dist/plugins/swift/types.js.map +0 -1
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* BaseParserPlugin 抽象類別
|
|
3
3
|
* 提供 Parser 插件的基礎實作和通用功能
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { minimatch } from 'minimatch';
|
|
6
|
+
import { isPosition, SymbolType } from '../../shared/types/index.js';
|
|
6
7
|
import { createValidationSuccess as createSuccessResult } from './types.js';
|
|
7
8
|
/**
|
|
8
9
|
* BaseParserPlugin 抽象類別
|
|
@@ -265,5 +266,61 @@ export class BaseParserPlugin {
|
|
|
265
266
|
return defaultValue;
|
|
266
267
|
}
|
|
267
268
|
}
|
|
269
|
+
// ===== 檔案過濾支援 =====
|
|
270
|
+
/**
|
|
271
|
+
* 獲取預設的排除模式
|
|
272
|
+
* 子類可以 override 此方法提供語言特定的排除模式
|
|
273
|
+
*/
|
|
274
|
+
getDefaultExcludePatterns() {
|
|
275
|
+
return [
|
|
276
|
+
'node_modules/**',
|
|
277
|
+
'.git/**',
|
|
278
|
+
'dist/**',
|
|
279
|
+
'build/**',
|
|
280
|
+
'coverage/**',
|
|
281
|
+
'.next/**',
|
|
282
|
+
'.nuxt/**',
|
|
283
|
+
'out/**',
|
|
284
|
+
'.cache/**',
|
|
285
|
+
'.turbo/**'
|
|
286
|
+
];
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* 判斷是否應該忽略特定檔案
|
|
290
|
+
* 使用 minimatch 比對檔案路徑與排除模式
|
|
291
|
+
*/
|
|
292
|
+
shouldIgnoreFile(filePath) {
|
|
293
|
+
const patterns = this.getDefaultExcludePatterns();
|
|
294
|
+
// 正規化路徑(移除開頭的 ./ 或 /)
|
|
295
|
+
const normalizedPath = filePath.replace(/^\.?\//, '');
|
|
296
|
+
// 檢查是否匹配任一排除模式
|
|
297
|
+
return patterns.some(pattern => {
|
|
298
|
+
try {
|
|
299
|
+
return minimatch(normalizedPath, pattern, { dot: true });
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
this.log('warn', `無效的排除模式: ${pattern}`);
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* 判斷符號是否為抽象宣告
|
|
309
|
+
* 預設實作:class, interface, type, enum, function, module, namespace 視為抽象宣告
|
|
310
|
+
* 排除實體:variable, constant(這些是具體的值實例)
|
|
311
|
+
* 子類別可以覆寫此方法以實作語言特定的判斷邏輯
|
|
312
|
+
*/
|
|
313
|
+
isAbstractDeclaration(symbol) {
|
|
314
|
+
const abstractTypes = [
|
|
315
|
+
SymbolType.Class,
|
|
316
|
+
SymbolType.Interface,
|
|
317
|
+
SymbolType.Type,
|
|
318
|
+
SymbolType.Enum,
|
|
319
|
+
SymbolType.Function,
|
|
320
|
+
SymbolType.Module,
|
|
321
|
+
SymbolType.Namespace
|
|
322
|
+
];
|
|
323
|
+
return abstractTypes.includes(symbol.type);
|
|
324
|
+
}
|
|
268
325
|
}
|
|
269
326
|
//# sourceMappingURL=base.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/infrastructure/parser/base.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/infrastructure/parser/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -83,6 +83,26 @@ export interface ParserPlugin {
|
|
|
83
83
|
* 應該釋放插件使用的所有資源
|
|
84
84
|
*/
|
|
85
85
|
dispose(): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* 獲取預設的排除模式
|
|
88
|
+
* 每個語言可以定義自己特定的忽略規則
|
|
89
|
+
* @returns 排除模式列表(glob patterns)
|
|
90
|
+
*/
|
|
91
|
+
getDefaultExcludePatterns?(): string[];
|
|
92
|
+
/**
|
|
93
|
+
* 判斷是否應該忽略特定檔案
|
|
94
|
+
* @param filePath 檔案路徑
|
|
95
|
+
* @returns true 表示應該忽略此檔案
|
|
96
|
+
*/
|
|
97
|
+
shouldIgnoreFile?(filePath: string): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* 判斷符號是否為抽象宣告
|
|
100
|
+
* 抽象宣告是指不產生實際執行程式碼的型別定義,如 class、interface、type、enum 等
|
|
101
|
+
* 各語言的抽象宣告定義不同,由各 Parser 實作
|
|
102
|
+
* @param symbol 要判斷的符號
|
|
103
|
+
* @returns true 表示此符號是抽象宣告
|
|
104
|
+
*/
|
|
105
|
+
isAbstractDeclaration?(symbol: Symbol): boolean;
|
|
86
106
|
}
|
|
87
107
|
/**
|
|
88
108
|
* Parser 插件型別守衛
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/parser/interface.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACvG,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEhF;;;GAGG;AACH,MAAM,WAAW,YAAY;IAG3B,WAAW;IACX,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,WAAW;IACX,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,eAAe;IACf,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAEhD,cAAc;IACd,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAI/C;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAEpD;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE5C;;;;;OAKG;IACH,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAE/D;;;;OAIG;IACH,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAIrD;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE3E;;;;;OAKG;IACH,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAIjE;;;;;OAKG;IACH,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAEzE;;;;;OAKG;IACH,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAIvD;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEtC;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/parser/interface.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACvG,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEhF;;;GAGG;AACH,MAAM,WAAW,YAAY;IAG3B,WAAW;IACX,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,WAAW;IACX,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,eAAe;IACf,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAEhD,cAAc;IACd,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAI/C;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAEpD;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE5C;;;;;OAKG;IACH,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAE/D;;;;OAIG;IACH,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAIrD;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE3E;;;;;OAKG;IACH,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAIjE;;;;;OAKG;IACH,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAEzE;;;;;OAKG;IACH,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAIvD;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEtC;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAIzB;;;;OAIG;IACH,yBAAyB,CAAC,IAAI,MAAM,EAAE,CAAC;IAEvC;;;;OAIG;IACH,gBAAgB,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAI7C;;;;;;OAMG;IACH,qBAAqB,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;CACjD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAyCpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAElF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEhF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,YAAY,EAAE,EACvB,QAAQ,EAAE,MAAM,GACf,YAAY,GAAG,IAAI,CAUrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/infrastructure/parser/interface.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/infrastructure/parser/interface.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwIH;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAE7C,SAAS;IACT,IACE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QACvC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EACtC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,eAAe;IACf,MAAM,eAAe,GAAG;QACtB,OAAO;QACP,gBAAgB;QAChB,gBAAgB;QAChB,qBAAqB;QACrB,QAAQ;QACR,iBAAiB;QACjB,gBAAgB;QAChB,YAAY;QACZ,UAAU;QACV,SAAS;KACV,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,oDAAoD;IAEpD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAoB,EAAE,SAAiB;IACvE,OAAQ,MAAM,CAAC,mBAAgC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAoB,EAAE,QAAgB;IACrE,OAAQ,MAAM,CAAC,kBAA+B,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAuB,EACvB,QAAgB;IAEhB,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;YACzC,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -59,7 +59,15 @@ export declare class AgentIdeCLI {
|
|
|
59
59
|
*/
|
|
60
60
|
private fileExists;
|
|
61
61
|
/**
|
|
62
|
-
*
|
|
62
|
+
* 正確套用程式碼編輯
|
|
63
|
+
*/
|
|
64
|
+
private applyEditCorrectly;
|
|
65
|
+
/**
|
|
66
|
+
* 將行列位置轉換為字元偏移量
|
|
67
|
+
*/
|
|
68
|
+
private positionToOffset;
|
|
69
|
+
/**
|
|
70
|
+
* @deprecated 使用 applyEditCorrectly 代替
|
|
63
71
|
*/
|
|
64
72
|
private applyCodeEdit;
|
|
65
73
|
/**
|
|
@@ -70,5 +78,9 @@ export declare class AgentIdeCLI {
|
|
|
70
78
|
* 讀取 tsconfig.json 的路徑別名設定
|
|
71
79
|
*/
|
|
72
80
|
private loadPathAliases;
|
|
81
|
+
/**
|
|
82
|
+
* 建立輸出格式化器
|
|
83
|
+
*/
|
|
84
|
+
private createFormatter;
|
|
73
85
|
}
|
|
74
86
|
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/interfaces/cli/cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/interfaces/cli/cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiCH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,kBAAkB,CAAC,CAAqB;IAChD,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,aAAa,CAAC,CAAgB;;IAQtC;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,OAAO,CAAC,iBAAiB;IAiDzB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,mBAAmB;YAuBb,kBAAkB;YA2DlB,mBAAmB;YAuHnB,qBAAqB;YAuHrB,iBAAiB;YA2EjB,mBAAmB;IAoEjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwB1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgD3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,cAAc;YAYR,oBAAoB;YAiLpB,iBAAiB;IAsG/B;;OAEG;YACW,yBAAyB;YAgBzB,wBAAwB;YA2BxB,uBAAuB;IAqBrC;;OAEG;YACW,UAAU;IASxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;YACW,kBAAkB;IAkDhC;;OAEG;YACW,eAAe;IAgC7B;;OAEG;IACH,OAAO,CAAC,eAAe;CAqBxB"}
|
|
@@ -14,6 +14,7 @@ import { TypeScriptParser } from '../../plugins/typescript/parser.js';
|
|
|
14
14
|
import { JavaScriptParser } from '../../plugins/javascript/parser.js';
|
|
15
15
|
import { ComplexityAnalyzer } from '../../core/analysis/complexity-analyzer.js';
|
|
16
16
|
import { DeadCodeDetector } from '../../core/analysis/dead-code-detector.js';
|
|
17
|
+
import { OutputFormatter, OutputFormat } from './output-formatter.js';
|
|
17
18
|
import * as fs from 'fs/promises';
|
|
18
19
|
import { readFileSync } from 'fs';
|
|
19
20
|
import * as path from 'path';
|
|
@@ -118,6 +119,7 @@ export class AgentIdeCLI {
|
|
|
118
119
|
.option('-u, --update', '增量更新索引')
|
|
119
120
|
.option('-e, --extensions <exts>', '包含的檔案副檔名', '.ts,.js,.tsx,.jsx')
|
|
120
121
|
.option('-x, --exclude <patterns>', '排除模式', 'node_modules/**,*.test.*')
|
|
122
|
+
.option('--format <format>', '輸出格式 (markdown|plain|json|minimal)', 'plain')
|
|
121
123
|
.action(async (options) => {
|
|
122
124
|
await this.handleIndexCommand(options);
|
|
123
125
|
});
|
|
@@ -133,6 +135,7 @@ export class AgentIdeCLI {
|
|
|
133
135
|
.option('-o, --to <name>', '新名稱(--new-name 的別名)')
|
|
134
136
|
.option('-p, --path <path>', '檔案或目錄路徑', '.')
|
|
135
137
|
.option('--preview', '預覽變更而不執行')
|
|
138
|
+
.option('--format <format>', '輸出格式 (markdown|plain|json|minimal)', 'plain')
|
|
136
139
|
.action(async (options) => {
|
|
137
140
|
await this.handleRenameCommand(options);
|
|
138
141
|
});
|
|
@@ -145,8 +148,10 @@ export class AgentIdeCLI {
|
|
|
145
148
|
.option('-s, --start-line <line>', '起始行號')
|
|
146
149
|
.option('-e, --end-line <line>', '結束行號')
|
|
147
150
|
.option('-n, --function-name <name>', '函式名稱')
|
|
151
|
+
.option('-t, --target-file <file>', '目標檔案路徑(跨檔案提取)')
|
|
148
152
|
.option('-p, --path <path>', '專案路徑', '.')
|
|
149
153
|
.option('--preview', '預覽變更而不執行')
|
|
154
|
+
.option('--format <format>', '輸出格式 (markdown|plain|json|minimal)', 'plain')
|
|
150
155
|
.action(async (action, options) => {
|
|
151
156
|
await this.handleRefactorCommand(action, options);
|
|
152
157
|
});
|
|
@@ -159,6 +164,7 @@ export class AgentIdeCLI {
|
|
|
159
164
|
.argument('<target>', '目標路徑')
|
|
160
165
|
.option('--update-imports', '自動更新 import 路徑', true)
|
|
161
166
|
.option('--preview', '預覽變更而不執行')
|
|
167
|
+
.option('--format <format>', '輸出格式 (markdown|plain|json|minimal)', 'plain')
|
|
162
168
|
.action(async (source, target, options) => {
|
|
163
169
|
await this.handleMoveCommand(source, target, options);
|
|
164
170
|
});
|
|
@@ -227,7 +233,12 @@ export class AgentIdeCLI {
|
|
|
227
233
|
}
|
|
228
234
|
// Command handlers
|
|
229
235
|
async handleIndexCommand(options) {
|
|
230
|
-
|
|
236
|
+
const formatter = this.createFormatter(options.format);
|
|
237
|
+
const startTime = Date.now();
|
|
238
|
+
if (options.format !== 'json' && options.format !== 'minimal') {
|
|
239
|
+
console.log(formatter.formatTitle('程式碼索引', 1));
|
|
240
|
+
console.log('\n🔍 開始建立程式碼索引...\n');
|
|
241
|
+
}
|
|
231
242
|
try {
|
|
232
243
|
const config = createIndexConfig(options.path, {
|
|
233
244
|
includeExtensions: options.extensions.split(','),
|
|
@@ -235,18 +246,43 @@ export class AgentIdeCLI {
|
|
|
235
246
|
});
|
|
236
247
|
this.indexEngine = new IndexEngine(config);
|
|
237
248
|
if (options.update) {
|
|
238
|
-
|
|
239
|
-
|
|
249
|
+
if (options.format !== 'json' && options.format !== 'minimal') {
|
|
250
|
+
console.log('📝 執行增量索引更新...');
|
|
251
|
+
}
|
|
240
252
|
}
|
|
241
253
|
else {
|
|
242
254
|
await this.indexEngine.indexProject(options.path);
|
|
243
255
|
}
|
|
244
256
|
const stats = await this.indexEngine.getStats();
|
|
245
|
-
|
|
246
|
-
|
|
257
|
+
const duration = Date.now() - startTime;
|
|
258
|
+
const statsData = {
|
|
259
|
+
檔案數: stats.totalFiles,
|
|
260
|
+
符號數: stats.totalSymbols,
|
|
261
|
+
'執行時間(ms)': duration
|
|
262
|
+
};
|
|
263
|
+
if (options.format === 'json') {
|
|
264
|
+
console.log(formatter.formatSuccess('索引完成', statsData));
|
|
265
|
+
}
|
|
266
|
+
else if (options.format === 'minimal') {
|
|
267
|
+
console.log(`index:success files=${stats.totalFiles} symbols=${stats.totalSymbols} time=${duration}ms`);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
console.log('\n' + formatter.formatSuccess('索引完成'));
|
|
271
|
+
console.log('\n' + formatter.formatTitle('統計資訊', 2));
|
|
272
|
+
console.log(formatter.formatStats(statsData));
|
|
273
|
+
}
|
|
247
274
|
}
|
|
248
275
|
catch (error) {
|
|
249
|
-
|
|
276
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
277
|
+
if (options.format === 'json') {
|
|
278
|
+
console.error(formatter.formatError(errorMessage));
|
|
279
|
+
}
|
|
280
|
+
else if (options.format === 'minimal') {
|
|
281
|
+
console.error(`index:error ${errorMessage}`);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
console.error('\n' + formatter.formatError(`索引失敗: ${errorMessage}`));
|
|
285
|
+
}
|
|
250
286
|
if (process.env.NODE_ENV !== 'test') {
|
|
251
287
|
process.exit(1);
|
|
252
288
|
}
|
|
@@ -393,18 +429,31 @@ export class AgentIdeCLI {
|
|
|
393
429
|
const { FunctionExtractor } = await import('../../core/refactor/extract-function.js');
|
|
394
430
|
const extractor = new FunctionExtractor();
|
|
395
431
|
// 執行提取
|
|
396
|
-
const
|
|
432
|
+
const extractConfig = {
|
|
397
433
|
functionName: options.functionName,
|
|
398
434
|
generateComments: true,
|
|
399
435
|
preserveFormatting: true,
|
|
400
|
-
validateExtraction: true
|
|
401
|
-
|
|
436
|
+
validateExtraction: true,
|
|
437
|
+
...(options.targetFile ? {
|
|
438
|
+
targetFile: path.resolve(options.targetFile),
|
|
439
|
+
sourceFile: filePath
|
|
440
|
+
} : {})
|
|
441
|
+
};
|
|
442
|
+
const result = await extractor.extract(code, range, extractConfig);
|
|
402
443
|
if (result.success) {
|
|
403
|
-
//
|
|
444
|
+
// 套用編輯(按正確順序)
|
|
404
445
|
let modifiedCode = code;
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
446
|
+
// 先處理所有 insert 類型(在檔案開頭插入函式定義)
|
|
447
|
+
const insertEdits = result.edits.filter(e => e.type === 'insert');
|
|
448
|
+
const replaceEdits = result.edits.filter(e => e.type === 'replace');
|
|
449
|
+
// 先應用 replace(替換選取範圍為函式呼叫)
|
|
450
|
+
for (const edit of replaceEdits) {
|
|
451
|
+
modifiedCode = this.applyEditCorrectly(modifiedCode, edit);
|
|
452
|
+
}
|
|
453
|
+
// 再應用 insert(插入函式定義)
|
|
454
|
+
for (const edit of insertEdits) {
|
|
455
|
+
modifiedCode = this.applyEditCorrectly(modifiedCode, edit);
|
|
456
|
+
}
|
|
408
457
|
// 提取函式簽名(從修改後的程式碼中)
|
|
409
458
|
const functionSignatureMatch = modifiedCode.match(new RegExp(`(async\\s+)?function\\s+${result.functionName}\\s*\\([^)]*\\)`));
|
|
410
459
|
const functionSignature = functionSignatureMatch ? functionSignatureMatch[0] : `function ${result.functionName}`;
|
|
@@ -412,17 +461,35 @@ export class AgentIdeCLI {
|
|
|
412
461
|
console.log(`📝 提取的函式: ${functionSignature}`);
|
|
413
462
|
console.log(functionSignature);
|
|
414
463
|
if (!options.preview) {
|
|
415
|
-
//
|
|
464
|
+
// 寫入原始檔案
|
|
416
465
|
await fs.writeFile(filePath, modifiedCode, 'utf-8');
|
|
417
466
|
console.log(`✓ 已更新 ${filePath}`);
|
|
467
|
+
// 如果是跨檔案提取,寫入目標檔案
|
|
468
|
+
if (result.targetFileContent && options.targetFile) {
|
|
469
|
+
const targetPath = path.resolve(options.targetFile);
|
|
470
|
+
// 確保目標目錄存在
|
|
471
|
+
const targetDir = path.dirname(targetPath);
|
|
472
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
473
|
+
// 寫入目標檔案
|
|
474
|
+
await fs.writeFile(targetPath, result.targetFileContent, 'utf-8');
|
|
475
|
+
console.log(`✓ 已建立/更新目標檔案 ${targetPath}`);
|
|
476
|
+
if (result.importStatement) {
|
|
477
|
+
console.log(`✓ 已加入 import: ${result.importStatement}`);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
418
480
|
}
|
|
419
481
|
else {
|
|
420
482
|
console.log('\n🔍 預覽模式 - 未寫入檔案');
|
|
421
483
|
console.log(`📊 參數: ${result.parameters.map(p => p.name).join(', ')}`);
|
|
484
|
+
if (result.targetFileContent && options.targetFile) {
|
|
485
|
+
console.log(`📁 目標檔案: ${options.targetFile}`);
|
|
486
|
+
console.log(`📥 Import: ${result.importStatement || '(無)'}`);
|
|
487
|
+
}
|
|
422
488
|
}
|
|
423
489
|
}
|
|
424
490
|
else {
|
|
425
491
|
console.error('❌ 重構失敗:', result.errors.join(', '));
|
|
492
|
+
process.exitCode = 1;
|
|
426
493
|
if (process.env.NODE_ENV !== 'test') {
|
|
427
494
|
process.exit(1);
|
|
428
495
|
}
|
|
@@ -1010,7 +1077,43 @@ export class AgentIdeCLI {
|
|
|
1010
1077
|
}
|
|
1011
1078
|
}
|
|
1012
1079
|
/**
|
|
1013
|
-
*
|
|
1080
|
+
* 正確套用程式碼編輯
|
|
1081
|
+
*/
|
|
1082
|
+
applyEditCorrectly(code, edit) {
|
|
1083
|
+
const lines = code.split('\n');
|
|
1084
|
+
switch (edit.type) {
|
|
1085
|
+
case 'replace': {
|
|
1086
|
+
// 計算起始和結束位置的偏移量
|
|
1087
|
+
const startOffset = this.positionToOffset(lines, edit.range.start);
|
|
1088
|
+
const endOffset = this.positionToOffset(lines, edit.range.end);
|
|
1089
|
+
return code.substring(0, startOffset) + edit.newText + code.substring(endOffset);
|
|
1090
|
+
}
|
|
1091
|
+
case 'insert': {
|
|
1092
|
+
const offset = this.positionToOffset(lines, edit.range.start);
|
|
1093
|
+
return code.substring(0, offset) + edit.newText + code.substring(offset);
|
|
1094
|
+
}
|
|
1095
|
+
case 'delete': {
|
|
1096
|
+
const startOffset = this.positionToOffset(lines, edit.range.start);
|
|
1097
|
+
const endOffset = this.positionToOffset(lines, edit.range.end);
|
|
1098
|
+
return code.substring(0, startOffset) + code.substring(endOffset);
|
|
1099
|
+
}
|
|
1100
|
+
default:
|
|
1101
|
+
return code;
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
/**
|
|
1105
|
+
* 將行列位置轉換為字元偏移量
|
|
1106
|
+
*/
|
|
1107
|
+
positionToOffset(lines, position) {
|
|
1108
|
+
let offset = 0;
|
|
1109
|
+
for (let i = 0; i < position.line - 1 && i < lines.length; i++) {
|
|
1110
|
+
offset += lines[i].length + 1; // +1 for newline
|
|
1111
|
+
}
|
|
1112
|
+
offset += position.column;
|
|
1113
|
+
return Math.min(offset, lines.join('\n').length);
|
|
1114
|
+
}
|
|
1115
|
+
/**
|
|
1116
|
+
* @deprecated 使用 applyEditCorrectly 代替
|
|
1014
1117
|
*/
|
|
1015
1118
|
applyCodeEdit(code, edit) {
|
|
1016
1119
|
const lines = code.split('\n');
|
|
@@ -1029,6 +1132,21 @@ export class AgentIdeCLI {
|
|
|
1029
1132
|
const files = [];
|
|
1030
1133
|
const allowedExtensions = ['.ts', '.tsx', '.js', '.jsx'];
|
|
1031
1134
|
const excludePatterns = ['node_modules', 'dist', '.git', 'coverage'];
|
|
1135
|
+
// 檢查路徑是檔案還是目錄
|
|
1136
|
+
try {
|
|
1137
|
+
const stats = await fs.stat(projectPath);
|
|
1138
|
+
if (stats.isFile()) {
|
|
1139
|
+
// 如果是單一檔案,直接返回
|
|
1140
|
+
if (allowedExtensions.some(ext => projectPath.endsWith(ext))) {
|
|
1141
|
+
return [projectPath];
|
|
1142
|
+
}
|
|
1143
|
+
return [];
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
catch (error) {
|
|
1147
|
+
// 路徑不存在
|
|
1148
|
+
return [];
|
|
1149
|
+
}
|
|
1032
1150
|
async function walkDir(dir) {
|
|
1033
1151
|
try {
|
|
1034
1152
|
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
@@ -1087,5 +1205,27 @@ export class AgentIdeCLI {
|
|
|
1087
1205
|
}
|
|
1088
1206
|
return pathAliases;
|
|
1089
1207
|
}
|
|
1208
|
+
/**
|
|
1209
|
+
* 建立輸出格式化器
|
|
1210
|
+
*/
|
|
1211
|
+
createFormatter(format) {
|
|
1212
|
+
let outputFormat;
|
|
1213
|
+
switch (format?.toLowerCase()) {
|
|
1214
|
+
case 'markdown':
|
|
1215
|
+
outputFormat = OutputFormat.Markdown;
|
|
1216
|
+
break;
|
|
1217
|
+
case 'json':
|
|
1218
|
+
outputFormat = OutputFormat.Json;
|
|
1219
|
+
break;
|
|
1220
|
+
case 'minimal':
|
|
1221
|
+
outputFormat = OutputFormat.Minimal;
|
|
1222
|
+
break;
|
|
1223
|
+
case 'plain':
|
|
1224
|
+
default:
|
|
1225
|
+
outputFormat = OutputFormat.Plain;
|
|
1226
|
+
break;
|
|
1227
|
+
}
|
|
1228
|
+
return new OutputFormatter(outputFormat);
|
|
1229
|
+
}
|
|
1090
1230
|
}
|
|
1091
1231
|
//# sourceMappingURL=cli.js.map
|