agent-ide 0.2.0 → 0.3.3

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 (575) hide show
  1. package/README.md +28 -355
  2. package/dist/application/events/event-bus.d.ts.map +1 -1
  3. package/dist/application/events/event-bus.js.map +1 -1
  4. package/dist/application/index.d.ts +3 -1
  5. package/dist/application/index.d.ts.map +1 -1
  6. package/dist/application/index.js +10 -5
  7. package/dist/application/index.js.map +1 -1
  8. package/dist/application/services/cache-coordinator.service.d.ts.map +1 -1
  9. package/dist/application/services/cache-coordinator.service.js.map +1 -1
  10. package/dist/application/services/error-handler.service.d.ts.map +1 -1
  11. package/dist/application/services/error-handler.service.js.map +1 -1
  12. package/dist/application/services/module-coordinator.service.d.ts +13 -2
  13. package/dist/application/services/module-coordinator.service.d.ts.map +1 -1
  14. package/dist/application/services/module-coordinator.service.js +63 -17
  15. package/dist/application/services/module-coordinator.service.js.map +1 -1
  16. package/dist/application/services/session-manager.service.d.ts.map +1 -1
  17. package/dist/application/services/session-manager.service.js.map +1 -1
  18. package/dist/application/services/workflow-engine.service.d.ts +1 -1
  19. package/dist/application/services/workflow-engine.service.d.ts.map +1 -1
  20. package/dist/application/services/workflow-engine.service.js.map +1 -1
  21. package/dist/application/state/state-manager.d.ts +3 -3
  22. package/dist/application/state/state-manager.d.ts.map +1 -1
  23. package/dist/application/state/state-manager.js +3 -3
  24. package/dist/application/state/state-manager.js.map +1 -1
  25. package/dist/application/types.d.ts.map +1 -1
  26. package/dist/application/workflows/analysis-workflow.d.ts +1 -1
  27. package/dist/application/workflows/analysis-workflow.d.ts.map +1 -1
  28. package/dist/application/workflows/analysis-workflow.js +1 -1
  29. package/dist/application/workflows/analysis-workflow.js.map +1 -1
  30. package/dist/application/workflows/base-workflow.d.ts.map +1 -1
  31. package/dist/application/workflows/base-workflow.js.map +1 -1
  32. package/dist/application/workflows/index.d.ts +2 -2
  33. package/dist/application/workflows/index.d.ts.map +1 -1
  34. package/dist/application/workflows/index.js +2 -2
  35. package/dist/application/workflows/index.js.map +1 -1
  36. package/dist/application/workflows/refactor-workflow.d.ts +1 -1
  37. package/dist/application/workflows/refactor-workflow.d.ts.map +1 -1
  38. package/dist/application/workflows/refactor-workflow.js +1 -1
  39. package/dist/application/workflows/refactor-workflow.js.map +1 -1
  40. package/dist/core/dependency/cycle-detector.d.ts +1 -1
  41. package/dist/core/dependency/cycle-detector.d.ts.map +1 -1
  42. package/dist/core/dependency/cycle-detector.js +1 -1
  43. package/dist/core/dependency/cycle-detector.js.map +1 -1
  44. package/dist/core/dependency/dependency-analyzer.d.ts +3 -1
  45. package/dist/core/dependency/dependency-analyzer.d.ts.map +1 -1
  46. package/dist/core/dependency/dependency-analyzer.js +25 -24
  47. package/dist/core/dependency/dependency-analyzer.js.map +1 -1
  48. package/dist/core/dependency/types.d.ts.map +1 -1
  49. package/dist/core/indexing/file-index.d.ts.map +1 -1
  50. package/dist/core/indexing/file-index.js +1 -1
  51. package/dist/core/indexing/file-index.js.map +1 -1
  52. package/dist/core/indexing/file-watcher.d.ts +4 -2
  53. package/dist/core/indexing/file-watcher.d.ts.map +1 -1
  54. package/dist/core/indexing/file-watcher.js +10 -6
  55. package/dist/core/indexing/file-watcher.js.map +1 -1
  56. package/dist/core/indexing/index-engine.d.ts +3 -1
  57. package/dist/core/indexing/index-engine.d.ts.map +1 -1
  58. package/dist/core/indexing/index-engine.js +24 -15
  59. package/dist/core/indexing/index-engine.js.map +1 -1
  60. package/dist/core/indexing/symbol-index.d.ts.map +1 -1
  61. package/dist/core/indexing/types.d.ts.map +1 -1
  62. package/dist/core/search/engines/text-engine.d.ts +3 -0
  63. package/dist/core/search/engines/text-engine.d.ts.map +1 -1
  64. package/dist/core/search/engines/text-engine.js +7 -6
  65. package/dist/core/search/engines/text-engine.js.map +1 -1
  66. package/dist/core/search/service.d.ts +2 -1
  67. package/dist/core/search/service.d.ts.map +1 -1
  68. package/dist/core/search/service.js +3 -3
  69. package/dist/core/search/service.js.map +1 -1
  70. package/dist/core/search/types.d.ts.map +1 -1
  71. package/dist/core/snapshot/index.d.ts +3 -19
  72. package/dist/core/snapshot/index.d.ts.map +1 -1
  73. package/dist/core/snapshot/index.js +2 -23
  74. package/dist/core/snapshot/index.js.map +1 -1
  75. package/dist/core/snapshot/snapshot-generator.d.ts +66 -0
  76. package/dist/core/snapshot/snapshot-generator.d.ts.map +1 -0
  77. package/dist/core/snapshot/snapshot-generator.js +258 -0
  78. package/dist/core/snapshot/snapshot-generator.js.map +1 -0
  79. package/dist/core/snapshot/types.d.ts +41 -190
  80. package/dist/core/snapshot/types.d.ts.map +1 -1
  81. package/dist/core/snapshot/types.js +13 -67
  82. package/dist/core/snapshot/types.js.map +1 -1
  83. package/dist/core/transform/index.d.ts +10 -0
  84. package/dist/core/transform/index.d.ts.map +1 -0
  85. package/dist/core/transform/index.js +21 -0
  86. package/dist/core/transform/index.js.map +1 -0
  87. package/dist/core/transform/location/index.d.ts +8 -0
  88. package/dist/core/transform/location/index.d.ts.map +1 -0
  89. package/dist/core/transform/location/index.js +9 -0
  90. package/dist/core/transform/location/index.js.map +1 -0
  91. package/dist/core/{move → transform/location/move-file}/import-resolver.d.ts +1 -1
  92. package/dist/core/transform/location/move-file/import-resolver.d.ts.map +1 -0
  93. package/dist/core/{move → transform/location/move-file}/import-resolver.js +11 -12
  94. package/dist/core/transform/location/move-file/import-resolver.js.map +1 -0
  95. package/dist/core/{move → transform/location/move-file}/index.d.ts +2 -2
  96. package/dist/core/transform/location/move-file/index.d.ts.map +1 -0
  97. package/dist/core/{move → transform/location/move-file}/index.js +2 -2
  98. package/dist/core/transform/location/move-file/index.js.map +1 -0
  99. package/dist/core/{move → transform/location/move-file}/move-service.d.ts +5 -3
  100. package/dist/core/transform/location/move-file/move-service.d.ts.map +1 -0
  101. package/dist/core/{move → transform/location/move-file}/move-service.js +67 -85
  102. package/dist/core/transform/location/move-file/move-service.js.map +1 -0
  103. package/dist/core/{move → transform/location/move-file}/types.d.ts +1 -1
  104. package/dist/core/transform/location/move-file/types.d.ts.map +1 -0
  105. package/dist/core/transform/location/move-file/types.js.map +1 -0
  106. package/dist/core/transform/location/move-member/index.d.ts +10 -0
  107. package/dist/core/transform/location/move-member/index.d.ts.map +1 -0
  108. package/dist/core/transform/location/move-member/index.js +12 -0
  109. package/dist/core/transform/location/move-member/index.js.map +1 -0
  110. package/dist/core/transform/location/move-member/member-extractor.d.ts +96 -0
  111. package/dist/core/transform/location/move-member/member-extractor.d.ts.map +1 -0
  112. package/dist/core/transform/location/move-member/member-extractor.js +439 -0
  113. package/dist/core/transform/location/move-member/member-extractor.js.map +1 -0
  114. package/dist/core/transform/location/move-member/move-member-service.d.ts +87 -0
  115. package/dist/core/transform/location/move-member/move-member-service.d.ts.map +1 -0
  116. package/dist/core/transform/location/move-member/move-member-service.js +412 -0
  117. package/dist/core/transform/location/move-member/move-member-service.js.map +1 -0
  118. package/dist/core/transform/location/move-member/types.d.ts +182 -0
  119. package/dist/core/transform/location/move-member/types.d.ts.map +1 -0
  120. package/dist/core/transform/location/move-member/types.js +75 -0
  121. package/dist/core/transform/location/move-member/types.js.map +1 -0
  122. package/dist/core/transform/location/shift/file-generator.d.ts +45 -0
  123. package/dist/core/transform/location/shift/file-generator.d.ts.map +1 -0
  124. package/dist/core/transform/location/shift/file-generator.js +94 -0
  125. package/dist/core/transform/location/shift/file-generator.js.map +1 -0
  126. package/dist/core/transform/location/shift/index.d.ts +11 -0
  127. package/dist/core/transform/location/shift/index.d.ts.map +1 -0
  128. package/dist/core/transform/location/shift/index.js +13 -0
  129. package/dist/core/transform/location/shift/index.js.map +1 -0
  130. package/dist/core/transform/location/shift/line-extractor.d.ts +55 -0
  131. package/dist/core/transform/location/shift/line-extractor.d.ts.map +1 -0
  132. package/dist/core/transform/location/shift/line-extractor.js +123 -0
  133. package/dist/core/transform/location/shift/line-extractor.js.map +1 -0
  134. package/dist/core/transform/location/shift/shift-service.d.ts +57 -0
  135. package/dist/core/transform/location/shift/shift-service.d.ts.map +1 -0
  136. package/dist/core/transform/location/shift/shift-service.js +199 -0
  137. package/dist/core/transform/location/shift/shift-service.js.map +1 -0
  138. package/dist/core/transform/location/shift/types.d.ts +195 -0
  139. package/dist/core/transform/location/shift/types.d.ts.map +1 -0
  140. package/dist/core/transform/location/shift/types.js +89 -0
  141. package/dist/core/transform/location/shift/types.js.map +1 -0
  142. package/dist/core/transform/shared/code-editor.d.ts +70 -0
  143. package/dist/core/transform/shared/code-editor.d.ts.map +1 -0
  144. package/dist/core/transform/shared/code-editor.js +206 -0
  145. package/dist/core/transform/shared/code-editor.js.map +1 -0
  146. package/dist/core/transform/shared/index.d.ts +7 -0
  147. package/dist/core/transform/shared/index.d.ts.map +1 -0
  148. package/dist/core/transform/shared/index.js +7 -0
  149. package/dist/core/transform/shared/index.js.map +1 -0
  150. package/dist/core/transform/shared/symbol-finder.d.ts +154 -0
  151. package/dist/core/transform/shared/symbol-finder.d.ts.map +1 -0
  152. package/dist/core/transform/shared/symbol-finder.js +433 -0
  153. package/dist/core/transform/shared/symbol-finder.js.map +1 -0
  154. package/dist/core/transform/structure/extract/extract-function.d.ts.map +1 -0
  155. package/dist/core/{refactor → transform/structure/extract}/extract-function.js +1 -1
  156. package/dist/core/transform/structure/extract/extract-function.js.map +1 -0
  157. package/dist/core/transform/structure/extract/index.d.ts +7 -0
  158. package/dist/core/transform/structure/extract/index.d.ts.map +1 -0
  159. package/dist/core/transform/structure/extract/index.js +9 -0
  160. package/dist/core/transform/structure/extract/index.js.map +1 -0
  161. package/dist/core/transform/structure/extract/swift-extractor.d.ts.map +1 -0
  162. package/dist/core/transform/structure/extract/swift-extractor.js.map +1 -0
  163. package/dist/core/transform/structure/index.d.ts +8 -0
  164. package/dist/core/transform/structure/index.d.ts.map +1 -0
  165. package/dist/core/transform/structure/index.js +8 -0
  166. package/dist/core/transform/structure/index.js.map +1 -0
  167. package/dist/core/transform/structure/inline/index.d.ts +6 -0
  168. package/dist/core/transform/structure/inline/index.d.ts.map +1 -0
  169. package/dist/core/transform/structure/inline/index.js +6 -0
  170. package/dist/core/transform/structure/inline/index.js.map +1 -0
  171. package/dist/core/transform/structure/inline/inline-function.d.ts.map +1 -0
  172. package/dist/core/{refactor → transform/structure/inline}/inline-function.js +37 -26
  173. package/dist/core/transform/structure/inline/inline-function.js.map +1 -0
  174. package/dist/core/transform/structure/patterns/design-patterns.d.ts.map +1 -0
  175. package/dist/core/transform/structure/patterns/design-patterns.js.map +1 -0
  176. package/dist/core/transform/structure/patterns/index.d.ts +6 -0
  177. package/dist/core/transform/structure/patterns/index.d.ts.map +1 -0
  178. package/dist/core/transform/structure/patterns/index.js +6 -0
  179. package/dist/core/transform/structure/patterns/index.js.map +1 -0
  180. package/dist/core/transform/symbol/change-signature/change-signature-service.d.ts +94 -0
  181. package/dist/core/transform/symbol/change-signature/change-signature-service.d.ts.map +1 -0
  182. package/dist/core/transform/symbol/change-signature/change-signature-service.js +544 -0
  183. package/dist/core/transform/symbol/change-signature/change-signature-service.js.map +1 -0
  184. package/dist/core/transform/symbol/change-signature/index.d.ts +10 -0
  185. package/dist/core/transform/symbol/change-signature/index.d.ts.map +1 -0
  186. package/dist/core/transform/symbol/change-signature/index.js +12 -0
  187. package/dist/core/transform/symbol/change-signature/index.js.map +1 -0
  188. package/dist/core/transform/symbol/change-signature/signature-parser.d.ts +76 -0
  189. package/dist/core/transform/symbol/change-signature/signature-parser.d.ts.map +1 -0
  190. package/dist/core/transform/symbol/change-signature/signature-parser.js +387 -0
  191. package/dist/core/transform/symbol/change-signature/signature-parser.js.map +1 -0
  192. package/dist/core/transform/symbol/change-signature/types.d.ts +244 -0
  193. package/dist/core/transform/symbol/change-signature/types.d.ts.map +1 -0
  194. package/dist/core/transform/symbol/change-signature/types.js +73 -0
  195. package/dist/core/transform/symbol/change-signature/types.js.map +1 -0
  196. package/dist/core/transform/symbol/index.d.ts +7 -0
  197. package/dist/core/transform/symbol/index.d.ts.map +1 -0
  198. package/dist/core/transform/symbol/index.js +7 -0
  199. package/dist/core/transform/symbol/index.js.map +1 -0
  200. package/dist/core/transform/symbol/rename/index.d.ts +9 -0
  201. package/dist/core/transform/symbol/rename/index.d.ts.map +1 -0
  202. package/dist/core/{rename → transform/symbol/rename}/index.js +5 -3
  203. package/dist/core/transform/symbol/rename/index.js.map +1 -0
  204. package/dist/core/{rename → transform/symbol/rename}/reference-updater.d.ts +2 -2
  205. package/dist/core/transform/symbol/rename/reference-updater.d.ts.map +1 -0
  206. package/dist/core/transform/symbol/rename/reference-updater.js.map +1 -0
  207. package/dist/core/{rename → transform/symbol/rename}/rename-engine.d.ts +2 -2
  208. package/dist/core/transform/symbol/rename/rename-engine.d.ts.map +1 -0
  209. package/dist/core/{rename → transform/symbol/rename}/rename-engine.js +3 -3
  210. package/dist/core/transform/symbol/rename/rename-engine.js.map +1 -0
  211. package/dist/core/{rename → transform/symbol/rename}/scope-analyzer.d.ts +3 -3
  212. package/dist/core/transform/symbol/rename/scope-analyzer.d.ts.map +1 -0
  213. package/dist/core/{rename → transform/symbol/rename}/scope-analyzer.js +2 -2
  214. package/dist/core/transform/symbol/rename/scope-analyzer.js.map +1 -0
  215. package/dist/core/{rename → transform/symbol/rename}/types.d.ts +2 -2
  216. package/dist/core/transform/symbol/rename/types.d.ts.map +1 -0
  217. package/dist/core/transform/symbol/rename/types.js.map +1 -0
  218. package/dist/core/transform/types.d.ts +185 -0
  219. package/dist/core/transform/types.d.ts.map +1 -0
  220. package/dist/core/transform/types.js +150 -0
  221. package/dist/core/transform/types.js.map +1 -0
  222. package/dist/infrastructure/cache/cache-manager.d.ts +1 -1
  223. package/dist/infrastructure/cache/cache-manager.d.ts.map +1 -1
  224. package/dist/infrastructure/cache/cache-manager.js +1 -1
  225. package/dist/infrastructure/cache/cache-manager.js.map +1 -1
  226. package/dist/infrastructure/cache/memory-cache.js +1 -1
  227. package/dist/infrastructure/cache/memory-cache.js.map +1 -1
  228. package/dist/infrastructure/cache/strategies.d.ts +1 -1
  229. package/dist/infrastructure/cache/strategies.d.ts.map +1 -1
  230. package/dist/infrastructure/cache/strategies.js +1 -1
  231. package/dist/infrastructure/cache/strategies.js.map +1 -1
  232. package/dist/infrastructure/formatters/diff-generator.d.ts +11 -0
  233. package/dist/infrastructure/formatters/diff-generator.d.ts.map +1 -0
  234. package/dist/infrastructure/formatters/diff-generator.js +217 -0
  235. package/dist/infrastructure/formatters/diff-generator.js.map +1 -0
  236. package/dist/infrastructure/formatters/index.d.ts +11 -0
  237. package/dist/infrastructure/formatters/index.d.ts.map +1 -0
  238. package/dist/infrastructure/formatters/index.js +13 -0
  239. package/dist/infrastructure/formatters/index.js.map +1 -0
  240. package/dist/infrastructure/formatters/preview-converter.d.ts +85 -0
  241. package/dist/infrastructure/formatters/preview-converter.d.ts.map +1 -0
  242. package/dist/infrastructure/formatters/preview-converter.js +209 -0
  243. package/dist/infrastructure/formatters/preview-converter.js.map +1 -0
  244. package/dist/infrastructure/formatters/preview-formatter.d.ts +61 -0
  245. package/dist/infrastructure/formatters/preview-formatter.d.ts.map +1 -0
  246. package/dist/infrastructure/formatters/preview-formatter.js +208 -0
  247. package/dist/infrastructure/formatters/preview-formatter.js.map +1 -0
  248. package/dist/infrastructure/formatters/query-formatter.d.ts +63 -0
  249. package/dist/infrastructure/formatters/query-formatter.d.ts.map +1 -0
  250. package/dist/infrastructure/formatters/query-formatter.js +218 -0
  251. package/dist/infrastructure/formatters/query-formatter.js.map +1 -0
  252. package/dist/infrastructure/formatters/query-types.d.ts +165 -0
  253. package/dist/infrastructure/formatters/query-types.d.ts.map +1 -0
  254. package/dist/infrastructure/formatters/query-types.js +30 -0
  255. package/dist/infrastructure/formatters/query-types.js.map +1 -0
  256. package/dist/infrastructure/formatters/types.d.ts +153 -0
  257. package/dist/infrastructure/formatters/types.d.ts.map +1 -0
  258. package/dist/infrastructure/formatters/types.js +27 -0
  259. package/dist/infrastructure/formatters/types.js.map +1 -0
  260. package/dist/infrastructure/parser/base.d.ts +1 -1
  261. package/dist/infrastructure/parser/base.d.ts.map +1 -1
  262. package/dist/infrastructure/parser/base.js +1 -1
  263. package/dist/infrastructure/parser/base.js.map +1 -1
  264. package/dist/infrastructure/parser/factory.d.ts +3 -3
  265. package/dist/infrastructure/parser/factory.d.ts.map +1 -1
  266. package/dist/infrastructure/parser/factory.js +1 -1
  267. package/dist/infrastructure/parser/factory.js.map +1 -1
  268. package/dist/infrastructure/parser/interface.d.ts +1 -1
  269. package/dist/infrastructure/parser/interface.d.ts.map +1 -1
  270. package/dist/infrastructure/parser/registry.d.ts +1 -1
  271. package/dist/infrastructure/parser/registry.d.ts.map +1 -1
  272. package/dist/infrastructure/parser/registry.js +1 -1
  273. package/dist/infrastructure/parser/registry.js.map +1 -1
  274. package/dist/infrastructure/parser/types.d.ts.map +1 -1
  275. package/dist/infrastructure/storage/file-system.d.ts +2 -1
  276. package/dist/infrastructure/storage/file-system.d.ts.map +1 -1
  277. package/dist/infrastructure/storage/file-system.interface.d.ts +69 -0
  278. package/dist/infrastructure/storage/file-system.interface.d.ts.map +1 -0
  279. package/dist/infrastructure/storage/file-system.interface.js +6 -0
  280. package/dist/infrastructure/storage/file-system.interface.js.map +1 -0
  281. package/dist/infrastructure/storage/file-system.js.map +1 -1
  282. package/dist/infrastructure/storage/index.d.ts +2 -2
  283. package/dist/infrastructure/storage/index.d.ts.map +1 -1
  284. package/dist/infrastructure/storage/index.js +1 -6
  285. package/dist/infrastructure/storage/index.js.map +1 -1
  286. package/dist/infrastructure/storage/mem-file-system.d.ts +44 -0
  287. package/dist/infrastructure/storage/mem-file-system.d.ts.map +1 -0
  288. package/dist/infrastructure/storage/mem-file-system.js +105 -0
  289. package/dist/infrastructure/storage/mem-file-system.js.map +1 -0
  290. package/dist/infrastructure/storage/path-utils.d.ts +1 -1
  291. package/dist/infrastructure/storage/path-utils.d.ts.map +1 -1
  292. package/dist/interfaces/cli/cli.d.ts +13 -94
  293. package/dist/interfaces/cli/cli.d.ts.map +1 -1
  294. package/dist/interfaces/cli/cli.js +53 -2450
  295. package/dist/interfaces/cli/cli.js.map +1 -1
  296. package/dist/interfaces/cli/commands/analyze.command.d.ts +11 -0
  297. package/dist/interfaces/cli/commands/analyze.command.d.ts.map +1 -0
  298. package/dist/interfaces/cli/commands/analyze.command.js +460 -0
  299. package/dist/interfaces/cli/commands/analyze.command.js.map +1 -0
  300. package/dist/interfaces/cli/commands/change-signature.command.d.ts +11 -0
  301. package/dist/interfaces/cli/commands/change-signature.command.d.ts.map +1 -0
  302. package/dist/interfaces/cli/commands/change-signature.command.js +299 -0
  303. package/dist/interfaces/cli/commands/change-signature.command.js.map +1 -0
  304. package/dist/interfaces/cli/commands/deps.command.d.ts +11 -0
  305. package/dist/interfaces/cli/commands/deps.command.d.ts.map +1 -0
  306. package/dist/interfaces/cli/commands/deps.command.js +143 -0
  307. package/dist/interfaces/cli/commands/deps.command.js.map +1 -0
  308. package/dist/interfaces/cli/commands/extract.command.d.ts +11 -0
  309. package/dist/interfaces/cli/commands/extract.command.d.ts.map +1 -0
  310. package/dist/interfaces/cli/commands/extract.command.js +314 -0
  311. package/dist/interfaces/cli/commands/extract.command.js.map +1 -0
  312. package/dist/interfaces/cli/commands/index.d.ts +16 -0
  313. package/dist/interfaces/cli/commands/index.d.ts.map +1 -0
  314. package/dist/interfaces/cli/commands/index.js +15 -0
  315. package/dist/interfaces/cli/commands/index.js.map +1 -0
  316. package/dist/interfaces/cli/commands/inline.command.d.ts +11 -0
  317. package/dist/interfaces/cli/commands/inline.command.d.ts.map +1 -0
  318. package/dist/interfaces/cli/commands/inline.command.js +208 -0
  319. package/dist/interfaces/cli/commands/inline.command.js.map +1 -0
  320. package/dist/interfaces/cli/commands/move-member.command.d.ts +11 -0
  321. package/dist/interfaces/cli/commands/move-member.command.d.ts.map +1 -0
  322. package/dist/interfaces/cli/commands/move-member.command.js +194 -0
  323. package/dist/interfaces/cli/commands/move-member.command.js.map +1 -0
  324. package/dist/interfaces/cli/commands/move.command.d.ts +11 -0
  325. package/dist/interfaces/cli/commands/move.command.d.ts.map +1 -0
  326. package/dist/interfaces/cli/commands/move.command.js +220 -0
  327. package/dist/interfaces/cli/commands/move.command.js.map +1 -0
  328. package/dist/interfaces/cli/commands/refactor.command.d.ts +11 -0
  329. package/dist/interfaces/cli/commands/refactor.command.d.ts.map +1 -0
  330. package/dist/interfaces/cli/commands/refactor.command.js +414 -0
  331. package/dist/interfaces/cli/commands/refactor.command.js.map +1 -0
  332. package/dist/interfaces/cli/commands/rename.command.d.ts +11 -0
  333. package/dist/interfaces/cli/commands/rename.command.d.ts.map +1 -0
  334. package/dist/interfaces/cli/commands/rename.command.js +272 -0
  335. package/dist/interfaces/cli/commands/rename.command.js.map +1 -0
  336. package/dist/interfaces/cli/commands/search.command.d.ts +11 -0
  337. package/dist/interfaces/cli/commands/search.command.d.ts.map +1 -0
  338. package/dist/interfaces/cli/commands/search.command.js +409 -0
  339. package/dist/interfaces/cli/commands/search.command.js.map +1 -0
  340. package/dist/interfaces/cli/commands/shift.command.d.ts +11 -0
  341. package/dist/interfaces/cli/commands/shift.command.d.ts.map +1 -0
  342. package/dist/interfaces/cli/commands/shift.command.js +143 -0
  343. package/dist/interfaces/cli/commands/shift.command.js.map +1 -0
  344. package/dist/interfaces/cli/commands/snapshot.command.d.ts +11 -0
  345. package/dist/interfaces/cli/commands/snapshot.command.d.ts.map +1 -0
  346. package/dist/interfaces/cli/commands/snapshot.command.js +68 -0
  347. package/dist/interfaces/cli/commands/snapshot.command.js.map +1 -0
  348. package/dist/interfaces/cli/commands/types.d.ts +18 -0
  349. package/dist/interfaces/cli/commands/types.d.ts.map +1 -0
  350. package/dist/interfaces/cli/commands/types.js +5 -0
  351. package/dist/interfaces/cli/commands/types.js.map +1 -0
  352. package/dist/interfaces/cli/index.d.ts +1 -1
  353. package/dist/interfaces/cli/index.d.ts.map +1 -1
  354. package/dist/interfaces/cli/index.js +1 -1
  355. package/dist/interfaces/cli/index.js.map +1 -1
  356. package/dist/interfaces/cli/preview-output-handler.d.ts +53 -0
  357. package/dist/interfaces/cli/preview-output-handler.d.ts.map +1 -0
  358. package/dist/interfaces/cli/preview-output-handler.js +73 -0
  359. package/dist/interfaces/cli/preview-output-handler.js.map +1 -0
  360. package/dist/interfaces/cli/unified-output-handler.d.ts +77 -0
  361. package/dist/interfaces/cli/unified-output-handler.d.ts.map +1 -0
  362. package/dist/interfaces/cli/unified-output-handler.js +140 -0
  363. package/dist/interfaces/cli/unified-output-handler.js.map +1 -0
  364. package/dist/plugins/javascript/index.d.ts +2 -2
  365. package/dist/plugins/javascript/index.d.ts.map +1 -1
  366. package/dist/plugins/javascript/index.js +1 -1
  367. package/dist/plugins/javascript/index.js.map +1 -1
  368. package/dist/plugins/javascript/types.d.ts.map +1 -1
  369. package/dist/plugins/javascript/types.js.map +1 -1
  370. package/dist/plugins/python/analyzers/complexity-analyzer.d.ts +50 -0
  371. package/dist/plugins/python/analyzers/complexity-analyzer.d.ts.map +1 -0
  372. package/dist/plugins/python/analyzers/complexity-analyzer.js +172 -0
  373. package/dist/plugins/python/analyzers/complexity-analyzer.js.map +1 -0
  374. package/dist/plugins/python/analyzers/duplication-detector.d.ts +39 -0
  375. package/dist/plugins/python/analyzers/duplication-detector.d.ts.map +1 -0
  376. package/dist/plugins/python/analyzers/duplication-detector.js +146 -0
  377. package/dist/plugins/python/analyzers/duplication-detector.js.map +1 -0
  378. package/dist/plugins/python/analyzers/error-handling-checker.d.ts +28 -0
  379. package/dist/plugins/python/analyzers/error-handling-checker.d.ts.map +1 -0
  380. package/dist/plugins/python/analyzers/error-handling-checker.js +143 -0
  381. package/dist/plugins/python/analyzers/error-handling-checker.js.map +1 -0
  382. package/dist/plugins/python/analyzers/naming-checker.d.ts +56 -0
  383. package/dist/plugins/python/analyzers/naming-checker.d.ts.map +1 -0
  384. package/dist/plugins/python/analyzers/naming-checker.js +220 -0
  385. package/dist/plugins/python/analyzers/naming-checker.js.map +1 -0
  386. package/dist/plugins/python/analyzers/pattern-detector.d.ts +44 -0
  387. package/dist/plugins/python/analyzers/pattern-detector.d.ts.map +1 -0
  388. package/dist/plugins/python/analyzers/pattern-detector.js +222 -0
  389. package/dist/plugins/python/analyzers/pattern-detector.js.map +1 -0
  390. package/dist/plugins/python/analyzers/security-checker.d.ts +56 -0
  391. package/dist/plugins/python/analyzers/security-checker.d.ts.map +1 -0
  392. package/dist/plugins/python/analyzers/security-checker.js +279 -0
  393. package/dist/plugins/python/analyzers/security-checker.js.map +1 -0
  394. package/dist/plugins/python/analyzers/type-safety-checker.d.ts +44 -0
  395. package/dist/plugins/python/analyzers/type-safety-checker.d.ts.map +1 -0
  396. package/dist/plugins/python/analyzers/type-safety-checker.js +177 -0
  397. package/dist/plugins/python/analyzers/type-safety-checker.js.map +1 -0
  398. package/dist/plugins/python/analyzers/unused-symbol-detector.d.ts +37 -0
  399. package/dist/plugins/python/analyzers/unused-symbol-detector.d.ts.map +1 -0
  400. package/dist/plugins/python/analyzers/unused-symbol-detector.js +141 -0
  401. package/dist/plugins/python/analyzers/unused-symbol-detector.js.map +1 -0
  402. package/dist/plugins/python/dependency-analyzer.d.ts +86 -0
  403. package/dist/plugins/python/dependency-analyzer.d.ts.map +1 -0
  404. package/dist/plugins/python/dependency-analyzer.js +252 -0
  405. package/dist/plugins/python/dependency-analyzer.js.map +1 -0
  406. package/dist/plugins/python/index.d.ts +17 -0
  407. package/dist/plugins/python/index.d.ts.map +1 -0
  408. package/dist/plugins/python/index.js +23 -0
  409. package/dist/plugins/python/index.js.map +1 -0
  410. package/dist/plugins/python/parser.d.ts +150 -0
  411. package/dist/plugins/python/parser.d.ts.map +1 -0
  412. package/dist/plugins/python/parser.js +476 -0
  413. package/dist/plugins/python/parser.js.map +1 -0
  414. package/dist/plugins/python/symbol-extractor.d.ts +108 -0
  415. package/dist/plugins/python/symbol-extractor.d.ts.map +1 -0
  416. package/dist/plugins/python/symbol-extractor.js +389 -0
  417. package/dist/plugins/python/symbol-extractor.js.map +1 -0
  418. package/dist/plugins/python/tree-sitter-bridge.d.ts +57 -0
  419. package/dist/plugins/python/tree-sitter-bridge.d.ts.map +1 -0
  420. package/dist/plugins/python/tree-sitter-bridge.js +267 -0
  421. package/dist/plugins/python/tree-sitter-bridge.js.map +1 -0
  422. package/dist/plugins/python/types.d.ts +179 -0
  423. package/dist/plugins/python/types.d.ts.map +1 -0
  424. package/dist/plugins/python/types.js +252 -0
  425. package/dist/plugins/python/types.js.map +1 -0
  426. package/dist/plugins/swift/analyzers/complexity-analyzer.d.ts.map +1 -1
  427. package/dist/plugins/swift/analyzers/unused-symbol-detector.d.ts.map +1 -1
  428. package/dist/plugins/swift/dependency-analyzer.d.ts +1 -1
  429. package/dist/plugins/swift/dependency-analyzer.d.ts.map +1 -1
  430. package/dist/plugins/swift/dependency-analyzer.js +1 -1
  431. package/dist/plugins/swift/dependency-analyzer.js.map +1 -1
  432. package/dist/plugins/swift/parser.js +2 -2
  433. package/dist/plugins/swift/parser.js.map +1 -1
  434. package/dist/plugins/swift/symbol-extractor.d.ts +1 -1
  435. package/dist/plugins/swift/symbol-extractor.d.ts.map +1 -1
  436. package/dist/plugins/swift/symbol-extractor.js.map +1 -1
  437. package/dist/plugins/swift/types.d.ts.map +1 -1
  438. package/dist/plugins/swift/types.js.map +1 -1
  439. package/dist/plugins/typescript/analyzers/complexity-analyzer.d.ts +1 -1
  440. package/dist/plugins/typescript/analyzers/complexity-analyzer.d.ts.map +1 -1
  441. package/dist/plugins/typescript/analyzers/unused-symbol-detector.d.ts +1 -1
  442. package/dist/plugins/typescript/analyzers/unused-symbol-detector.d.ts.map +1 -1
  443. package/dist/plugins/typescript/analyzers/unused-symbol-detector.js.map +1 -1
  444. package/dist/plugins/typescript/parser.d.ts.map +1 -1
  445. package/dist/plugins/typescript/parser.js +12 -3
  446. package/dist/plugins/typescript/parser.js.map +1 -1
  447. package/dist/plugins/typescript/symbol-extractor.d.ts.map +1 -1
  448. package/dist/plugins/typescript/symbol-extractor.js +12 -0
  449. package/dist/plugins/typescript/symbol-extractor.js.map +1 -1
  450. package/dist/plugins/typescript/types.d.ts.map +1 -1
  451. package/dist/plugins/typescript/types.js +10 -0
  452. package/dist/plugins/typescript/types.js.map +1 -1
  453. package/dist/shared/errors/config-error.d.ts +1 -1
  454. package/dist/shared/errors/config-error.d.ts.map +1 -1
  455. package/dist/shared/errors/config-error.js +1 -1
  456. package/dist/shared/errors/config-error.js.map +1 -1
  457. package/dist/shared/errors/file-error.d.ts +1 -1
  458. package/dist/shared/errors/file-error.d.ts.map +1 -1
  459. package/dist/shared/errors/file-error.js +1 -1
  460. package/dist/shared/errors/file-error.js.map +1 -1
  461. package/dist/shared/errors/index.d.ts +1 -1
  462. package/dist/shared/errors/index.d.ts.map +1 -1
  463. package/dist/shared/errors/index.js +4 -4
  464. package/dist/shared/errors/index.js.map +1 -1
  465. package/dist/shared/errors/parser-error.d.ts +1 -1
  466. package/dist/shared/errors/parser-error.d.ts.map +1 -1
  467. package/dist/shared/errors/parser-error.js +1 -1
  468. package/dist/shared/errors/parser-error.js.map +1 -1
  469. package/dist/shared/errors/validation-error.d.ts +1 -1
  470. package/dist/shared/errors/validation-error.d.ts.map +1 -1
  471. package/dist/shared/errors/validation-error.js +1 -1
  472. package/dist/shared/errors/validation-error.js.map +1 -1
  473. package/dist/shared/types/ast.d.ts +1 -1
  474. package/dist/shared/types/ast.d.ts.map +1 -1
  475. package/dist/shared/types/ast.js +1 -1
  476. package/dist/shared/types/ast.js.map +1 -1
  477. package/dist/shared/types/symbol.d.ts +1 -1
  478. package/dist/shared/types/symbol.d.ts.map +1 -1
  479. package/dist/shared/utils/index.d.ts +5 -5
  480. package/dist/shared/utils/index.d.ts.map +1 -1
  481. package/dist/shared/utils/index.js +5 -5
  482. package/dist/shared/utils/index.js.map +1 -1
  483. package/package.json +8 -6
  484. package/dist/core/analysis/index.d.ts +0 -6
  485. package/dist/core/analysis/index.d.ts.map +0 -1
  486. package/dist/core/analysis/index.js +0 -7
  487. package/dist/core/analysis/index.js.map +0 -1
  488. package/dist/core/analysis/quality-metrics.d.ts +0 -158
  489. package/dist/core/analysis/quality-metrics.d.ts.map +0 -1
  490. package/dist/core/analysis/quality-metrics.js +0 -442
  491. package/dist/core/analysis/quality-metrics.js.map +0 -1
  492. package/dist/core/move/import-resolver.d.ts.map +0 -1
  493. package/dist/core/move/import-resolver.js.map +0 -1
  494. package/dist/core/move/index.d.ts.map +0 -1
  495. package/dist/core/move/index.js.map +0 -1
  496. package/dist/core/move/move-service.d.ts.map +0 -1
  497. package/dist/core/move/move-service.js.map +0 -1
  498. package/dist/core/move/types.d.ts.map +0 -1
  499. package/dist/core/move/types.js.map +0 -1
  500. package/dist/core/refactor/design-patterns.d.ts.map +0 -1
  501. package/dist/core/refactor/design-patterns.js.map +0 -1
  502. package/dist/core/refactor/extract-function.d.ts.map +0 -1
  503. package/dist/core/refactor/extract-function.js.map +0 -1
  504. package/dist/core/refactor/index.d.ts +0 -8
  505. package/dist/core/refactor/index.d.ts.map +0 -1
  506. package/dist/core/refactor/index.js +0 -11
  507. package/dist/core/refactor/index.js.map +0 -1
  508. package/dist/core/refactor/inline-function.d.ts.map +0 -1
  509. package/dist/core/refactor/inline-function.js.map +0 -1
  510. package/dist/core/refactor/swift-extractor.d.ts.map +0 -1
  511. package/dist/core/refactor/swift-extractor.js.map +0 -1
  512. package/dist/core/rename/index.d.ts +0 -9
  513. package/dist/core/rename/index.d.ts.map +0 -1
  514. package/dist/core/rename/index.js.map +0 -1
  515. package/dist/core/rename/reference-updater.d.ts.map +0 -1
  516. package/dist/core/rename/reference-updater.js.map +0 -1
  517. package/dist/core/rename/rename-engine.d.ts.map +0 -1
  518. package/dist/core/rename/rename-engine.js.map +0 -1
  519. package/dist/core/rename/scope-analyzer.d.ts.map +0 -1
  520. package/dist/core/rename/scope-analyzer.js.map +0 -1
  521. package/dist/core/rename/types.d.ts.map +0 -1
  522. package/dist/core/rename/types.js.map +0 -1
  523. package/dist/core/shit-score/grading.d.ts +0 -39
  524. package/dist/core/shit-score/grading.d.ts.map +0 -1
  525. package/dist/core/shit-score/grading.js +0 -253
  526. package/dist/core/shit-score/grading.js.map +0 -1
  527. package/dist/core/shit-score/index.d.ts +0 -9
  528. package/dist/core/shit-score/index.d.ts.map +0 -1
  529. package/dist/core/shit-score/index.js +0 -8
  530. package/dist/core/shit-score/index.js.map +0 -1
  531. package/dist/core/shit-score/score-calculator.d.ts +0 -75
  532. package/dist/core/shit-score/score-calculator.d.ts.map +0 -1
  533. package/dist/core/shit-score/score-calculator.js +0 -240
  534. package/dist/core/shit-score/score-calculator.js.map +0 -1
  535. package/dist/core/shit-score/shit-score-analyzer.d.ts +0 -84
  536. package/dist/core/shit-score/shit-score-analyzer.d.ts.map +0 -1
  537. package/dist/core/shit-score/shit-score-analyzer.js +0 -595
  538. package/dist/core/shit-score/shit-score-analyzer.js.map +0 -1
  539. package/dist/core/shit-score/types.d.ts +0 -231
  540. package/dist/core/shit-score/types.d.ts.map +0 -1
  541. package/dist/core/shit-score/types.js +0 -73
  542. package/dist/core/shit-score/types.js.map +0 -1
  543. package/dist/core/snapshot/code-compressor.d.ts +0 -39
  544. package/dist/core/snapshot/code-compressor.d.ts.map +0 -1
  545. package/dist/core/snapshot/code-compressor.js +0 -211
  546. package/dist/core/snapshot/code-compressor.js.map +0 -1
  547. package/dist/core/snapshot/config.d.ts +0 -60
  548. package/dist/core/snapshot/config.d.ts.map +0 -1
  549. package/dist/core/snapshot/config.js +0 -136
  550. package/dist/core/snapshot/config.js.map +0 -1
  551. package/dist/core/snapshot/snapshot-differ.d.ts +0 -54
  552. package/dist/core/snapshot/snapshot-differ.d.ts.map +0 -1
  553. package/dist/core/snapshot/snapshot-differ.js +0 -262
  554. package/dist/core/snapshot/snapshot-differ.js.map +0 -1
  555. package/dist/core/snapshot/snapshot-engine.d.ts +0 -94
  556. package/dist/core/snapshot/snapshot-engine.d.ts.map +0 -1
  557. package/dist/core/snapshot/snapshot-engine.js +0 -492
  558. package/dist/core/snapshot/snapshot-engine.js.map +0 -1
  559. package/dist/plugins/swift/analyzers/test-coverage-checker.d.ts +0 -26
  560. package/dist/plugins/swift/analyzers/test-coverage-checker.d.ts.map +0 -1
  561. package/dist/plugins/swift/analyzers/test-coverage-checker.js +0 -63
  562. package/dist/plugins/swift/analyzers/test-coverage-checker.js.map +0 -1
  563. package/dist/plugins/typescript/analyzers/test-coverage-checker.d.ts +0 -22
  564. package/dist/plugins/typescript/analyzers/test-coverage-checker.d.ts.map +0 -1
  565. package/dist/plugins/typescript/analyzers/test-coverage-checker.js +0 -62
  566. package/dist/plugins/typescript/analyzers/test-coverage-checker.js.map +0 -1
  567. /package/dist/core/{move → transform/location/move-file}/types.js +0 -0
  568. /package/dist/core/{refactor → transform/structure/extract}/extract-function.d.ts +0 -0
  569. /package/dist/core/{refactor → transform/structure/extract}/swift-extractor.d.ts +0 -0
  570. /package/dist/core/{refactor → transform/structure/extract}/swift-extractor.js +0 -0
  571. /package/dist/core/{refactor → transform/structure/inline}/inline-function.d.ts +0 -0
  572. /package/dist/core/{refactor → transform/structure/patterns}/design-patterns.d.ts +0 -0
  573. /package/dist/core/{refactor → transform/structure/patterns}/design-patterns.js +0 -0
  574. /package/dist/core/{rename → transform/symbol/rename}/reference-updater.js +0 -0
  575. /package/dist/core/{rename → transform/symbol/rename}/types.js +0 -0
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Python 安全性檢查器
3
+ * 檢查 eval()、exec()、SQL injection 等安全問題
4
+ */
5
+ import { PythonNodeKind, DANGEROUS_FUNCTIONS } from '../types.js';
6
+ import { traverseAST } from '../tree-sitter-bridge.js';
7
+ /**
8
+ * Python 安全性檢查器類別
9
+ */
10
+ export class PythonSecurityChecker {
11
+ /**
12
+ * 檢查安全性問題
13
+ */
14
+ check(code, ast) {
15
+ const issues = [];
16
+ // 檢查危險函數調用
17
+ this.checkDangerousFunctions(ast, issues);
18
+ // 檢查硬編碼密碼
19
+ this.checkHardcodedSecrets(ast, issues);
20
+ // 檢查 SQL injection
21
+ this.checkSQLInjection(ast, issues);
22
+ // 檢查不安全的 pickle 使用
23
+ this.checkUnsafePickle(ast, issues);
24
+ // 檢查 subprocess shell=True
25
+ this.checkShellInjection(ast, issues);
26
+ return issues;
27
+ }
28
+ /**
29
+ * 檢查危險函數調用
30
+ */
31
+ checkDangerousFunctions(ast, issues) {
32
+ traverseAST(ast.root, (node) => {
33
+ if (node.pythonKind === PythonNodeKind.Call) {
34
+ const funcNode = node.treeSitterNode.childForFieldName('function');
35
+ if (!funcNode) {
36
+ return;
37
+ }
38
+ const funcName = funcNode.text;
39
+ // 直接調用危險函數
40
+ if (DANGEROUS_FUNCTIONS.has(funcName)) {
41
+ issues.push({
42
+ type: 'unsafe-eval',
43
+ location: {
44
+ filePath: ast.sourceFile,
45
+ line: node.range.start.line,
46
+ column: node.range.start.column
47
+ },
48
+ message: `使用 ${funcName}() 可能導致程式碼注入漏洞`,
49
+ severity: this.getDangerousFunctionSeverity(funcName),
50
+ recommendation: this.getDangerousFunctionRecommendation(funcName)
51
+ });
52
+ }
53
+ // 屬性調用(如 os.system)
54
+ if (funcNode.type === 'attribute') {
55
+ this.checkDangerousAttributeCall(funcNode, node, ast.sourceFile, issues);
56
+ }
57
+ }
58
+ });
59
+ }
60
+ /**
61
+ * 檢查危險的屬性調用
62
+ */
63
+ checkDangerousAttributeCall(funcNode, callNode, filePath, issues) {
64
+ const objNode = funcNode.childForFieldName('object');
65
+ const attrNode = funcNode.childForFieldName('attribute');
66
+ if (!objNode || !attrNode) {
67
+ return;
68
+ }
69
+ const objName = objNode.text;
70
+ const attrName = attrNode.text;
71
+ // os.system, os.popen
72
+ if (objName === 'os' && (attrName === 'system' || attrName === 'popen')) {
73
+ issues.push({
74
+ type: 'unsafe-api',
75
+ location: {
76
+ filePath,
77
+ line: callNode.range.start.line,
78
+ column: callNode.range.start.column
79
+ },
80
+ message: `使用 ${objName}.${attrName}() 可能導致命令注入漏洞`,
81
+ severity: 'high',
82
+ recommendation: '使用 subprocess.run() 並避免 shell=True'
83
+ });
84
+ }
85
+ // pickle.loads
86
+ if (objName === 'pickle' && (attrName === 'loads' || attrName === 'load')) {
87
+ issues.push({
88
+ type: 'unsafe-api',
89
+ location: {
90
+ filePath,
91
+ line: callNode.range.start.line,
92
+ column: callNode.range.start.column
93
+ },
94
+ message: `使用 pickle.${attrName}() 處理不信任的資料可能導致任意程式碼執行`,
95
+ severity: 'critical',
96
+ recommendation: '使用 json 或其他安全的序列化格式'
97
+ });
98
+ }
99
+ }
100
+ /**
101
+ * 檢查硬編碼密碼
102
+ */
103
+ checkHardcodedSecrets(ast, issues) {
104
+ const secretPatterns = [
105
+ /password\s*=\s*["'][^"']+["']/i,
106
+ /secret\s*=\s*["'][^"']+["']/i,
107
+ /api_key\s*=\s*["'][^"']+["']/i,
108
+ /token\s*=\s*["'][^"']+["']/i,
109
+ /private_key\s*=\s*["'][^"']+["']/i
110
+ ];
111
+ traverseAST(ast.root, (node) => {
112
+ if (node.pythonKind === PythonNodeKind.Assignment
113
+ || node.pythonKind === PythonNodeKind.AnnotatedAssignment) {
114
+ const text = node.treeSitterNode.text;
115
+ for (const pattern of secretPatterns) {
116
+ if (pattern.test(text)) {
117
+ issues.push({
118
+ type: 'hardcoded-secret',
119
+ location: {
120
+ filePath: ast.sourceFile,
121
+ line: node.range.start.line,
122
+ column: node.range.start.column
123
+ },
124
+ message: '可能的硬編碼密碼或敏感資訊',
125
+ severity: 'high',
126
+ recommendation: '使用環境變數或安全的配置管理工具'
127
+ });
128
+ break;
129
+ }
130
+ }
131
+ }
132
+ });
133
+ }
134
+ /**
135
+ * 檢查 SQL injection
136
+ */
137
+ checkSQLInjection(ast, issues) {
138
+ traverseAST(ast.root, (node) => {
139
+ if (node.pythonKind === PythonNodeKind.Call) {
140
+ const funcNode = node.treeSitterNode.childForFieldName('function');
141
+ if (!funcNode) {
142
+ return;
143
+ }
144
+ // 檢查 execute() 調用
145
+ if (funcNode.type === 'attribute') {
146
+ const attrNode = funcNode.childForFieldName('attribute');
147
+ if (attrNode?.text === 'execute' || attrNode?.text === 'executemany') {
148
+ // 檢查第一個參數是否包含字串格式化
149
+ const argsNode = node.treeSitterNode.childForFieldName('arguments');
150
+ if (argsNode && argsNode.namedChildCount > 0) {
151
+ const firstArg = argsNode.namedChild(0);
152
+ if (firstArg && this.containsStringFormatting(firstArg.text)) {
153
+ issues.push({
154
+ type: 'sql-injection',
155
+ location: {
156
+ filePath: ast.sourceFile,
157
+ line: node.range.start.line,
158
+ column: node.range.start.column
159
+ },
160
+ message: 'SQL 查詢使用字串格式化,可能存在 SQL injection 風險',
161
+ severity: 'critical',
162
+ recommendation: '使用參數化查詢代替字串拼接'
163
+ });
164
+ }
165
+ }
166
+ }
167
+ }
168
+ }
169
+ });
170
+ }
171
+ /**
172
+ * 檢查不安全的 pickle 使用
173
+ */
174
+ checkUnsafePickle(ast, issues) {
175
+ // 已在 checkDangerousAttributeCall 中處理
176
+ }
177
+ /**
178
+ * 檢查 shell injection
179
+ */
180
+ checkShellInjection(ast, issues) {
181
+ traverseAST(ast.root, (node) => {
182
+ if (node.pythonKind === PythonNodeKind.Call) {
183
+ const funcNode = node.treeSitterNode.childForFieldName('function');
184
+ if (!funcNode) {
185
+ return;
186
+ }
187
+ // 檢查 subprocess.run() 或 subprocess.Popen()
188
+ if (funcNode.type === 'attribute') {
189
+ const objNode = funcNode.childForFieldName('object');
190
+ const attrNode = funcNode.childForFieldName('attribute');
191
+ if (objNode?.text === 'subprocess' && (attrNode?.text === 'run' || attrNode?.text === 'Popen' || attrNode?.text === 'call')) {
192
+ // 檢查是否有 shell=True
193
+ const argsNode = node.treeSitterNode.childForFieldName('arguments');
194
+ if (argsNode && this.hasShellTrue(argsNode)) {
195
+ issues.push({
196
+ type: 'unsafe-api',
197
+ location: {
198
+ filePath: ast.sourceFile,
199
+ line: node.range.start.line,
200
+ column: node.range.start.column
201
+ },
202
+ message: 'subprocess 使用 shell=True 可能導致命令注入漏洞',
203
+ severity: 'high',
204
+ recommendation: '避免使用 shell=True,改用列表形式的命令參數'
205
+ });
206
+ }
207
+ }
208
+ }
209
+ }
210
+ });
211
+ }
212
+ /**
213
+ * 檢查字串是否包含格式化
214
+ */
215
+ containsStringFormatting(text) {
216
+ // f-string
217
+ if (text.startsWith('f"') || text.startsWith('f\'')) {
218
+ return true;
219
+ }
220
+ // % 格式化
221
+ if (text.includes('%s') || text.includes('%d')) {
222
+ return true;
223
+ }
224
+ // .format()
225
+ if (text.includes('.format(')) {
226
+ return true;
227
+ }
228
+ // 字串拼接
229
+ if (text.includes('+')) {
230
+ return true;
231
+ }
232
+ return false;
233
+ }
234
+ /**
235
+ * 檢查是否有 shell=True 參數
236
+ */
237
+ hasShellTrue(argsNode) {
238
+ for (let i = 0; i < argsNode.childCount; i++) {
239
+ const child = argsNode.child(i);
240
+ if (child?.type === 'keyword_argument') {
241
+ const nameNode = child.childForFieldName('name');
242
+ const valueNode = child.childForFieldName('value');
243
+ if (nameNode?.text === 'shell' && valueNode?.text === 'True') {
244
+ return true;
245
+ }
246
+ }
247
+ }
248
+ return false;
249
+ }
250
+ /**
251
+ * 獲取危險函數的嚴重程度
252
+ */
253
+ getDangerousFunctionSeverity(funcName) {
254
+ const criticalFunctions = new Set(['eval', 'exec', 'compile']);
255
+ const highFunctions = new Set(['__import__']);
256
+ if (criticalFunctions.has(funcName)) {
257
+ return 'critical';
258
+ }
259
+ if (highFunctions.has(funcName)) {
260
+ return 'high';
261
+ }
262
+ return 'medium';
263
+ }
264
+ /**
265
+ * 獲取危險函數的建議
266
+ */
267
+ getDangerousFunctionRecommendation(funcName) {
268
+ const recommendations = {
269
+ eval: '使用 ast.literal_eval() 或 json.loads() 處理不信任的資料',
270
+ exec: '避免動態執行程式碼,使用安全的替代方案',
271
+ compile: '避免動態編譯程式碼',
272
+ __import__: '使用 importlib.import_module()',
273
+ open: '確保檔案路徑經過驗證,避免路徑穿越攻擊',
274
+ input: '驗證並清理使用者輸入'
275
+ };
276
+ return recommendations[funcName] || '評估是否有更安全的替代方案';
277
+ }
278
+ }
279
+ //# sourceMappingURL=security-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-checker.js","sourceRoot":"","sources":["../../../../src/plugins/python/analyzers/security-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Python 型別安全檢查器
3
+ * 檢查缺少 type hints、Any 使用等問題
4
+ */
5
+ import type { TypeSafetyIssue } from '../../../infrastructure/parser/analysis-types.js';
6
+ import { type PythonAST } from '../types.js';
7
+ /**
8
+ * Python 型別安全檢查器類別
9
+ */
10
+ export declare class PythonTypeSafetyChecker {
11
+ /**
12
+ * 檢查型別安全問題
13
+ */
14
+ check(code: string, ast: PythonAST): TypeSafetyIssue[];
15
+ /**
16
+ * 檢查函式缺少 type hints
17
+ */
18
+ private checkMissingTypeHints;
19
+ /**
20
+ * 檢查參數型別
21
+ */
22
+ private checkParameterTypes;
23
+ /**
24
+ * 檢查 Any 型別使用
25
+ */
26
+ private checkAnyUsage;
27
+ /**
28
+ * 檢查 cast() 使用
29
+ */
30
+ private checkCastUsage;
31
+ /**
32
+ * 檢查 # type: ignore 註解
33
+ */
34
+ private checkTypeIgnore;
35
+ /**
36
+ * 獲取函式名稱
37
+ */
38
+ private getFunctionName;
39
+ /**
40
+ * 判斷是否為特殊方法
41
+ */
42
+ private isSpecialMethod;
43
+ }
44
+ //# sourceMappingURL=type-safety-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-safety-checker.d.ts","sourceRoot":"","sources":["../../../../src/plugins/python/analyzers/type-safety-checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,EAAE,KAAK,SAAS,EAAsC,MAAM,aAAa,CAAC;AAGjF;;GAEG;AACH,qBAAa,uBAAuB;IAClC;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,eAAe,EAAE;IAkBtD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiC7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwC3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAoBrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;OAEG;IACH,OAAO,CAAC,eAAe;CAIxB"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Python 型別安全檢查器
3
+ * 檢查缺少 type hints、Any 使用等問題
4
+ */
5
+ import { PythonNodeKind } from '../types.js';
6
+ import { traverseAST, getNodeText } from '../tree-sitter-bridge.js';
7
+ /**
8
+ * Python 型別安全檢查器類別
9
+ */
10
+ export class PythonTypeSafetyChecker {
11
+ /**
12
+ * 檢查型別安全問題
13
+ */
14
+ check(code, ast) {
15
+ const issues = [];
16
+ // 檢查函式缺少 type hints
17
+ this.checkMissingTypeHints(ast, issues);
18
+ // 檢查 Any 型別使用
19
+ this.checkAnyUsage(ast, issues);
20
+ // 檢查 cast() 使用
21
+ this.checkCastUsage(ast, issues);
22
+ // 檢查 # type: ignore 註解
23
+ this.checkTypeIgnore(code, ast, issues);
24
+ return issues;
25
+ }
26
+ /**
27
+ * 檢查函式缺少 type hints
28
+ */
29
+ checkMissingTypeHints(ast, issues) {
30
+ traverseAST(ast.root, (node) => {
31
+ if (node.pythonKind === PythonNodeKind.FunctionDefinition
32
+ || node.pythonKind === PythonNodeKind.AsyncFunctionDefinition) {
33
+ // 跳過特殊方法
34
+ const name = this.getFunctionName(node);
35
+ if (this.isSpecialMethod(name)) {
36
+ return;
37
+ }
38
+ // 檢查返回型別
39
+ const returnType = node.treeSitterNode.childForFieldName('return_type');
40
+ if (!returnType) {
41
+ issues.push({
42
+ type: 'any-type',
43
+ location: {
44
+ filePath: ast.sourceFile,
45
+ line: node.range.start.line,
46
+ column: node.range.start.column
47
+ },
48
+ message: `函式 '${name}' 缺少返回型別註解`,
49
+ severity: 'warning'
50
+ });
51
+ }
52
+ // 檢查參數型別
53
+ this.checkParameterTypes(node, ast.sourceFile, issues);
54
+ }
55
+ });
56
+ }
57
+ /**
58
+ * 檢查參數型別
59
+ */
60
+ checkParameterTypes(funcNode, filePath, issues) {
61
+ const paramsNode = funcNode.treeSitterNode.childForFieldName('parameters');
62
+ if (!paramsNode) {
63
+ return;
64
+ }
65
+ for (let i = 0; i < paramsNode.namedChildCount; i++) {
66
+ const param = paramsNode.namedChild(i);
67
+ if (!param) {
68
+ continue;
69
+ }
70
+ const paramName = param.childForFieldName('name')?.text || param.text;
71
+ // 跳過 self 和 cls
72
+ if (paramName === 'self' || paramName === 'cls') {
73
+ continue;
74
+ }
75
+ // 跳過 *args 和 **kwargs
76
+ if (param.type === 'list_splat_pattern' || param.type === 'dictionary_splat_pattern') {
77
+ continue;
78
+ }
79
+ // 檢查是否有型別註解
80
+ const hasType = param.type === 'typed_parameter'
81
+ || param.type === 'typed_default_parameter'
82
+ || param.childForFieldName('type');
83
+ if (!hasType) {
84
+ issues.push({
85
+ type: 'any-type',
86
+ location: {
87
+ filePath,
88
+ line: param.startPosition.row,
89
+ column: param.startPosition.column
90
+ },
91
+ message: `參數 '${paramName}' 缺少型別註解`,
92
+ severity: 'warning'
93
+ });
94
+ }
95
+ }
96
+ }
97
+ /**
98
+ * 檢查 Any 型別使用
99
+ */
100
+ checkAnyUsage(ast, issues) {
101
+ traverseAST(ast.root, (node) => {
102
+ if (node.pythonKind === PythonNodeKind.Identifier) {
103
+ const text = getNodeText(node);
104
+ if (text === 'Any') {
105
+ issues.push({
106
+ type: 'any-type',
107
+ location: {
108
+ filePath: ast.sourceFile,
109
+ line: node.range.start.line,
110
+ column: node.range.start.column
111
+ },
112
+ message: '使用 Any 型別會降低型別安全性',
113
+ severity: 'warning'
114
+ });
115
+ }
116
+ }
117
+ });
118
+ }
119
+ /**
120
+ * 檢查 cast() 使用
121
+ */
122
+ checkCastUsage(ast, issues) {
123
+ traverseAST(ast.root, (node) => {
124
+ if (node.pythonKind === PythonNodeKind.Call) {
125
+ const funcNode = node.treeSitterNode.childForFieldName('function');
126
+ if (funcNode?.text === 'cast') {
127
+ issues.push({
128
+ type: 'unsafe-cast',
129
+ location: {
130
+ filePath: ast.sourceFile,
131
+ line: node.range.start.line,
132
+ column: node.range.start.column
133
+ },
134
+ message: '使用 cast() 可能繞過型別檢查',
135
+ severity: 'warning'
136
+ });
137
+ }
138
+ }
139
+ });
140
+ }
141
+ /**
142
+ * 檢查 # type: ignore 註解
143
+ */
144
+ checkTypeIgnore(code, ast, issues) {
145
+ const lines = code.split('\n');
146
+ for (let i = 0; i < lines.length; i++) {
147
+ const line = lines[i];
148
+ if (line.includes('# type: ignore')) {
149
+ issues.push({
150
+ type: 'ignore-directive',
151
+ location: {
152
+ filePath: ast.sourceFile,
153
+ line: i,
154
+ column: line.indexOf('# type: ignore')
155
+ },
156
+ message: '使用 # type: ignore 忽略型別檢查',
157
+ severity: 'warning'
158
+ });
159
+ }
160
+ }
161
+ }
162
+ /**
163
+ * 獲取函式名稱
164
+ */
165
+ getFunctionName(node) {
166
+ const nameNode = node.treeSitterNode.childForFieldName('name');
167
+ return nameNode?.text || '<anonymous>';
168
+ }
169
+ /**
170
+ * 判斷是否為特殊方法
171
+ */
172
+ isSpecialMethod(name) {
173
+ // __init__, __str__, __repr__ 等不需要完整 type hints
174
+ return name.startsWith('__') && name.endsWith('__');
175
+ }
176
+ }
177
+ //# sourceMappingURL=type-safety-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-safety-checker.js","sourceRoot":"","sources":["../../../../src/plugins/python/analyzers/type-safety-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Python 未使用符號檢測器
3
+ * 檢測未使用的變數、函式、類別和導入
4
+ */
5
+ import type { Symbol } from '../../../shared/types/index.js';
6
+ import type { UnusedCode } from '../../../infrastructure/parser/analysis-types.js';
7
+ import { type PythonAST } from '../types.js';
8
+ /**
9
+ * Python 未使用符號檢測器類別
10
+ */
11
+ export declare class PythonUnusedSymbolDetector {
12
+ /**
13
+ * 檢測未使用的符號
14
+ */
15
+ detect(ast: PythonAST, allSymbols: Symbol[]): UnusedCode[];
16
+ /**
17
+ * 收集所有使用的名稱及其出現次數
18
+ */
19
+ private collectUsedNames;
20
+ /**
21
+ * 判斷是否應該跳過該符號
22
+ */
23
+ private shouldSkipSymbol;
24
+ /**
25
+ * 獲取未使用類型
26
+ */
27
+ private getUnusedType;
28
+ /**
29
+ * 計算信心程度
30
+ */
31
+ private calculateConfidence;
32
+ /**
33
+ * 生成未使用原因說明
34
+ */
35
+ private generateReason;
36
+ }
37
+ //# sourceMappingURL=unused-symbol-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unused-symbol-detector.d.ts","sourceRoot":"","sources":["../../../../src/plugins/python/analyzers/unused-symbol-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,KAAK,SAAS,EAAkB,MAAM,aAAa,CAAC;AAG7D;;GAEG;AACH,qBAAa,0BAA0B;IACrC;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE;IAmC1D;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA2BxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;OAEG;IACH,OAAO,CAAC,cAAc;CAmBvB"}