weflow-cli 1.16.0 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +19 -4
  3. package/bin/weflow-cli.ts +515 -6
  4. package/dist/bin/weflow-cli.js +580 -8
  5. package/dist/bin/weflow-cli.js.map +1 -1
  6. package/dist/src/core/ntCore.d.ts +47 -0
  7. package/dist/src/core/ntCore.d.ts.map +1 -1
  8. package/dist/src/core/ntCore.js +24 -0
  9. package/dist/src/core/ntCore.js.map +1 -1
  10. package/dist/src/services/assistantService.d.ts +8 -1
  11. package/dist/src/services/assistantService.d.ts.map +1 -1
  12. package/dist/src/services/assistantService.js +47 -8
  13. package/dist/src/services/assistantService.js.map +1 -1
  14. package/dist/src/services/assistantTools.d.ts +8 -0
  15. package/dist/src/services/assistantTools.d.ts.map +1 -1
  16. package/dist/src/services/assistantTools.js +67 -11
  17. package/dist/src/services/assistantTools.js.map +1 -1
  18. package/dist/src/services/configService.d.ts.map +1 -1
  19. package/dist/src/services/configService.js +3 -2
  20. package/dist/src/services/configService.js.map +1 -1
  21. package/dist/src/services/cursorProbe.d.ts +44 -0
  22. package/dist/src/services/cursorProbe.d.ts.map +1 -0
  23. package/dist/src/services/cursorProbe.js +183 -0
  24. package/dist/src/services/cursorProbe.js.map +1 -0
  25. package/dist/src/services/diagnosticReport.d.ts +6 -0
  26. package/dist/src/services/diagnosticReport.d.ts.map +1 -1
  27. package/dist/src/services/diagnosticReport.js +16 -0
  28. package/dist/src/services/diagnosticReport.js.map +1 -1
  29. package/dist/src/services/qchatImport.d.ts +89 -0
  30. package/dist/src/services/qchatImport.d.ts.map +1 -0
  31. package/dist/src/services/qchatImport.js +273 -0
  32. package/dist/src/services/qchatImport.js.map +1 -0
  33. package/dist/src/services/setupVenv.d.ts +43 -0
  34. package/dist/src/services/setupVenv.d.ts.map +1 -0
  35. package/dist/src/services/setupVenv.js +198 -0
  36. package/dist/src/services/setupVenv.js.map +1 -0
  37. package/dist/src/services/wechatCompat.d.ts +29 -0
  38. package/dist/src/services/wechatCompat.d.ts.map +1 -0
  39. package/dist/src/services/wechatCompat.js +65 -0
  40. package/dist/src/services/wechatCompat.js.map +1 -0
  41. package/dist/src/utils/python.d.ts +10 -0
  42. package/dist/src/utils/python.d.ts.map +1 -1
  43. package/dist/src/utils/python.js +27 -4
  44. package/dist/src/utils/python.js.map +1 -1
  45. package/docs/DATA_CONTRACT.md +25 -0
  46. package/docs/DECISIONS.md +118 -30
  47. package/docs/NT_DATABASES.md +47 -0
  48. package/docs/PROJECT_STATE.md +7 -3
  49. package/docs/RELEASING.md +4 -0
  50. package/docs/REPLAY.md +169 -0
  51. package/docs/SYNC_CONTRACT.md +197 -180
  52. package/package.json +89 -88
  53. package/resources/js/graph3d/viewer2d.js +550 -448
  54. package/scripts/annual_report.py +3 -1
  55. package/scripts/chat_notes.py +86 -3
  56. package/scripts/check_readme_commands.py +427 -426
  57. package/scripts/extract_todos.py +3 -1
  58. package/scripts/graph_2d.py +156 -151
  59. package/scripts/graph_3d.py +672 -646
  60. package/scripts/imported_chats.py +68 -0
  61. package/scripts/mcp_bridge.py +3 -1
  62. package/scripts/media_index.py +150 -0
  63. package/scripts/nt_common.py +32 -0
  64. package/scripts/nt_decrypt.py +154 -16
  65. package/scripts/on_this_day.py +178 -178
  66. package/scripts/promises.py +185 -185
  67. package/scripts/replay.py +803 -0
  68. package/scripts/run_hidden.vbs +25 -0
  69. package/scripts/semantic_search.py +78 -6
  70. package/scripts/wechat_avatar.py +185 -0
  71. package/scripts/wechat_ledger.py +190 -0
  72. package/src/core/ntCore.ts +59 -0
  73. package/src/services/assistantService.ts +48 -8
  74. package/src/services/assistantTools.ts +73 -10
  75. package/src/services/configService.ts +3 -2
  76. package/src/services/cursorProbe.ts +222 -0
  77. package/src/services/diagnosticReport.ts +22 -0
  78. package/src/services/qchatImport.ts +327 -0
  79. package/src/services/setupVenv.ts +238 -0
  80. package/src/services/wechatCompat.ts +67 -0
  81. package/src/utils/python.ts +33 -4
@@ -1,6 +1,7 @@
1
1
  import { execFileSync } from 'child_process'
2
2
  import { delimiter, join } from 'path'
3
- import { accessSync, constants } from 'fs'
3
+ import { accessSync, constants, existsSync } from 'fs'
4
+ import { homedir } from 'os'
4
5
 
5
6
  let cached: string | null = null
6
7
 
@@ -17,6 +18,26 @@ function isExecutable(path: string): boolean {
17
18
  }
18
19
  }
19
20
 
21
+ /** `weflow-cli setup` 建的自管 venv 的解释器路径;没建过就是 null。 */
22
+ export function managedVenvPython(): string | null {
23
+ const exe = process.platform === 'win32'
24
+ ? join(homedir(), '.weflow-cli', 'venv', 'Scripts', 'python.exe')
25
+ : join(homedir(), '.weflow-cli', 'venv', 'bin', 'python')
26
+ return existsSync(exe) ? exe : null
27
+ }
28
+
29
+ /**
30
+ * 候选序:自管 venv 永远排最前,其余按调用方给的序。纯函数,供测试钉住
31
+ * "建了 venv 就该优先用它"这件事——它坏了的表现是 setup 装好了包、
32
+ * 运行时却仍在用 PATH 上的解释器,两边各自"正常"。
33
+ */
34
+ export function orderCandidates(
35
+ managed: string | null,
36
+ rest: string[],
37
+ ): string[] {
38
+ return managed ? [managed, ...rest.filter(c => c !== managed)] : [...rest]
39
+ }
40
+
20
41
  /** 按顺序返回 PATH 中所有可用的 Python 解释器(含命令名候选) */
21
42
  function candidates(): string[] {
22
43
  const found: string[] = []
@@ -55,13 +76,16 @@ function hasSqlcipher(cmd: string): boolean {
55
76
  }
56
77
 
57
78
  function detect(): string {
79
+ // 自管 venv(`weflow-cli setup`)优先:它就是为了"这台机器有一个能
80
+ // import sqlcipher3 的 Python"而存在的。venv 坏了(装完又被卸了包)会
81
+ // 自然落到下面的 PATH 候选——行为退回 setup 之前,而不是更糟。
82
+ const ordered = orderCandidates(managedVenvPython(), candidates())
58
83
  // 优先选择能 import sqlcipher3 的解释器(NT 解密核心依赖),
59
84
  // 避免命中 PATH 中仅有基础库的裸 Python 环境(如被 IDE 注入的 VM Python 抢占)。
60
- const list = candidates()
61
- for (const cmd of list) {
85
+ for (const cmd of ordered) {
62
86
  if (canRun(cmd) && hasSqlcipher(cmd)) return cmd
63
87
  }
64
- for (const cmd of list) {
88
+ for (const cmd of ordered) {
65
89
  if (canRun(cmd)) return cmd
66
90
  }
67
91
  return 'python'
@@ -71,3 +95,8 @@ export function getPythonCommand(): string {
71
95
  cached ??= detect()
72
96
  return cached
73
97
  }
98
+
99
+ /** setup 装完后清缓存,让同一进程里后续的 getPythonCommand 看见新 venv。 */
100
+ export function clearPythonCommandCache(): void {
101
+ cached = null
102
+ }