@taopao/memoir 0.0.0-stage → 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.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +8 -2
  3. package/assets/migrations-pg/0100_baseline.sql +1115 -0
  4. package/assets/migrations-pg/0101_functions.sql +93 -0
  5. package/assets/migrations-pg/0102_views.sql +2425 -0
  6. package/assets/migrations-pg/0103_constraints.sql +147 -0
  7. package/assets/migrations-pg/0104_protection.sql +33 -0
  8. package/assets/migrations-pg/0105_bocom_credit_card.sql +43 -0
  9. package/assets/migrations-pg/0106_psbc_debit_card.sql +87 -0
  10. package/assets/migrations-pg/0107_tailong_debit_card.sql +87 -0
  11. package/assets/migrations-pg/0108_ccb_debit_card.sql +87 -0
  12. package/assets/migrations-pg/0109_ccb_credit_card.sql +63 -0
  13. package/assets/migrations-pg/0110_icbc_debit_card.sql +87 -0
  14. package/assets/migrations-pg/0111_icbc_credit_card.sql +66 -0
  15. package/assets/migrations-pg/0112_boc_debit_card.sql +88 -0
  16. package/assets/migrations-pg/0113_jsb_debit_card.sql +88 -0
  17. package/assets/migrations-pg/0114_cmbc_debit_card.sql +88 -0
  18. package/assets/migrations-pg/0115_hzbank_debit_card.sql +88 -0
  19. package/assets/migrations-pg/0116_unified_bank_documents.sql +197 -0
  20. package/assets/migrations-pg/0117_agent_submissions.sql +50 -0
  21. package/assets/migrations-pg/0118_agent_reversions_analysis.sql +34 -0
  22. package/assets/migrations-pg/0119_agent_extension_registry.sql +72 -0
  23. package/assets/migrations-pg/0120_agent_record_sources.sql +22 -0
  24. package/assets/migrations-pg/0121_agent_extension_deprecation.sql +30 -0
  25. package/assets/migrations-pg/0122_agent_extension_controlled_revert.sql +107 -0
  26. package/assets/migrations-pg/0123_agent_extension_versions.sql +54 -0
  27. package/assets/migrations-pg/0124_agent_extension_retirement_groups.sql +26 -0
  28. package/assets/migrations-pg/0125_agent_candidate_reviews.sql +30 -0
  29. package/assets/migrations-pg/0126_agent_module_lifecycle.sql +93 -0
  30. package/assets/migrations-pg/0127_agent_tasks.sql +64 -0
  31. package/assets/migrations-pg/0128_agent_task_leases.sql +80 -0
  32. package/assets/migrations-pg/0129_agent_task_plans.sql +66 -0
  33. package/assets/migrations-pg/0130_agent_task_submissions.sql +72 -0
  34. package/assets/migrations-pg/0131_agent_task_completions.sql +93 -0
  35. package/assets/migrations-pg/0132_agent_task_changes.sql +113 -0
  36. package/assets/migrations-pg/0133_agent_imported_source_snapshots.sql +152 -0
  37. package/assets/migrations-pg/0134_agent_analysis_datasets.sql +6 -0
  38. package/assets/migrations-pg/0135_agent_maintenance_tasks.sql +139 -0
  39. package/assets/migrations-pg/0136_agent_task_structures.sql +66 -0
  40. package/assets/migrations-pg/0137_agent_personal_identity.sql +149 -0
  41. package/assets/migrations-pg/0138_agent_work_records.sql +24 -0
  42. package/assets/migrations-pg/0139_shared_files.sql +43 -0
  43. package/assets/migrations-pg/0140_shared_script_runs.sql +36 -0
  44. package/assets/migrations-pg/0141_payment_bank_links.sql +96 -0
  45. package/assets/migrations-pg/0142_consumption_order_types_and_places.sql +287 -0
  46. package/assets/migrations-pg/0143_skill_direct_write.sql +330 -0
  47. package/assets/migrations-pg/0144_skill_schema_archive.sql +73 -0
  48. package/assets/migrations-pg/0145_skill_ingest_wiki.sql +91 -0
  49. package/assets/migrations-pg/0146_skill_load.sql +17 -0
  50. package/assets/migrations-pg/0147_drop_agent_schema.sql +147 -0
  51. package/assets/migrations-pg/0148_ingest_lanes.sql +19 -0
  52. package/assets/migrations-pg/0149_account_ownership.sql +233 -0
  53. package/assets/migrations-pg/0150_bank_card_exact_link.sql +24 -0
  54. package/assets/migrations-pg/0151_account_ownership_enforce.sql +35 -0
  55. package/assets/migrations-pg/0152_account_ownership_views.sql +750 -0
  56. package/assets/migrations-pg/0153_web_frontend.sql +34 -0
  57. package/assets/migrations-pg/0154_audio_record_owners.sql +103 -0
  58. package/assets/migrations-pg/0155_ingest_knowledge_tables.sql +171 -0
  59. package/assets/migrations-pg/0156_batch_playbook_note.sql +17 -0
  60. package/assets/migrations-pg/0157_last_contact.sql +166 -0
  61. package/assets/migrations-pg/0158_refund_match_hash_join.sql +91 -0
  62. package/assets/migrations-pg/0159_fact_occurred_time.sql +88 -0
  63. package/assets/migrations-pg/0160_agent_notes.sql +118 -0
  64. package/assets/migrations-pg/0161_life_history.sql +314 -0
  65. package/assets/migrations-pg/0162_person_card.sql +427 -0
  66. package/assets/migrations-pg/0163_parking_drop_personal_defaults.sql +12 -0
  67. package/assets/native/darwin-arm64.node +0 -0
  68. package/assets/playbooks/audio.md +83 -0
  69. package/assets/playbooks/chat.md +37 -0
  70. package/assets/playbooks/common.md +66 -0
  71. package/assets/playbooks/intimate.md +19 -0
  72. package/assets/playbooks/journal.md +17 -0
  73. package/assets/playbooks/orders.md +15 -0
  74. package/assets/playbooks/payments.md +16 -0
  75. package/assets/playbooks/self.md +29 -0
  76. package/bin/install-codex-skill.mjs +77 -0
  77. package/bin/memoir.mjs +5 -0
  78. package/dist/cli.js +34062 -0
  79. package/package.json +40 -4
  80. package/release-manifest.json +432 -0
  81. package/skill/SKILL.md +120 -0
  82. package/skill/references//345/256/211/350/243/205/344/275/215/347/275/256.md +21 -0
  83. package/skill/references//346/225/260/346/215/256/345/217/243/345/276/204.md +36 -0
  84. package/skill/scripts/memoir.mjs +82 -0
package/package.json CHANGED
@@ -1,6 +1,42 @@
1
1
  {
2
2
  "name": "@taopao/memoir",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "个人人生档案 CLI 与 Agent Skill:把聊天、账单、录音等资料整理进 PostgreSQL",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "engines": {
8
+ "node": ">=24"
9
+ },
10
+ "bin": {
11
+ "memoir": "bin/memoir.mjs"
12
+ },
13
+ "files": [
14
+ "bin",
15
+ "dist",
16
+ "assets",
17
+ "skill",
18
+ "release-manifest.json",
19
+ "README.md",
20
+ "LICENSE"
21
+ ],
22
+ "publishConfig": {
23
+ "registry": "https://registry.npmjs.org/",
24
+ "access": "public"
25
+ },
26
+ "dependencies": {
27
+ "libpg-query": "18.2.2",
28
+ "lunar-typescript": "1.8.6",
29
+ "pg": "8.23.1",
30
+ "pg-cursor": "2.22.1",
31
+ "@e965/xlsx": "0.20.3",
32
+ "better-sqlite3-multiple-ciphers": "13.0.3",
33
+ "csv-parse": "5.6.0",
34
+ "exceljs": "4.4.0",
35
+ "iconv-lite": "0.6.3",
36
+ "pdfjs-dist": "6.4.299",
37
+ "ulid": "3.0.2",
38
+ "zod": "4.6.7",
39
+ "@hono/node-server": "1.19.17",
40
+ "hono": "4.13.13"
41
+ }
42
+ }
@@ -0,0 +1,432 @@
1
+ {
2
+ "format_version": 1,
3
+ "name": "@taopao/memoir",
4
+ "version": "0.1.0",
5
+ "node_minimum": 24,
6
+ "platform": "any",
7
+ "arch": "any",
8
+ "native": {
9
+ "platform": "darwin",
10
+ "arch": "arm64",
11
+ "dependency": "better-sqlite3-multiple-ciphers",
12
+ "version": "13.0.3",
13
+ "sha256": "e220712cd3af9dd575fe4ac7973d5dbfbad3d22760b772a48f1eee977517ef5b"
14
+ },
15
+ "files": [
16
+ {
17
+ "path": "LICENSE",
18
+ "bytes": 1076,
19
+ "sha256": "071a1fc395023e1c6802135a67eb3f86a0206820b0eaa673ca999ac9624307ac"
20
+ },
21
+ {
22
+ "path": "README.md",
23
+ "bytes": 633,
24
+ "sha256": "79a4776ce996a85d172bc41552a7acf44b25f93b6b0d7a193401efee46a91733"
25
+ },
26
+ {
27
+ "path": "assets/migrations-pg/0100_baseline.sql",
28
+ "bytes": 42668,
29
+ "sha256": "9fa7cd88406bc1aa087efde7c9be4519eb3f0e84ccff88a13ad95f9754699a2b"
30
+ },
31
+ {
32
+ "path": "assets/migrations-pg/0101_functions.sql",
33
+ "bytes": 8365,
34
+ "sha256": "80a03d55f71d7e2d917fe14186137e0e208afcebe2f0cdee62c9084634347ff1"
35
+ },
36
+ {
37
+ "path": "assets/migrations-pg/0102_views.sql",
38
+ "bytes": 64651,
39
+ "sha256": "452f158a265b141a2829014368e033e7819ba15d7e5f91dcb785634f777a3827"
40
+ },
41
+ {
42
+ "path": "assets/migrations-pg/0103_constraints.sql",
43
+ "bytes": 15153,
44
+ "sha256": "839407467666e9cf904357d33db4319981f21b2085a4eee048937f0d2bf18066"
45
+ },
46
+ {
47
+ "path": "assets/migrations-pg/0104_protection.sql",
48
+ "bytes": 2495,
49
+ "sha256": "595612ca768a7889f9431b5dda5905be5d0b6a9d393c46c8b5dd6b1906ab21dd"
50
+ },
51
+ {
52
+ "path": "assets/migrations-pg/0105_bocom_credit_card.sql",
53
+ "bytes": 2626,
54
+ "sha256": "41d802db582c246dc5fa4677ad964ea4fbe94c6230033b2fc06448fd84761ff2"
55
+ },
56
+ {
57
+ "path": "assets/migrations-pg/0106_psbc_debit_card.sql",
58
+ "bytes": 4931,
59
+ "sha256": "20318b54c3c11c5e4a53fd22bee9667fd27705821568da0c4642da2f12478f39"
60
+ },
61
+ {
62
+ "path": "assets/migrations-pg/0107_tailong_debit_card.sql",
63
+ "bytes": 4986,
64
+ "sha256": "a9bfb5e09ec98923a6aad2521382c5efd0cc2fbd77f34e1dfd2eb02b3cdd2b4f"
65
+ },
66
+ {
67
+ "path": "assets/migrations-pg/0108_ccb_debit_card.sql",
68
+ "bytes": 4989,
69
+ "sha256": "814342e2a870effc82bd0e1306136ce4ad23012702e152494ecc89f42dfaf4c3"
70
+ },
71
+ {
72
+ "path": "assets/migrations-pg/0109_ccb_credit_card.sql",
73
+ "bytes": 4169,
74
+ "sha256": "f77ac8d6f0d886c261a594941bf895cd7fb82cbae01557e28bb82da093fe8728"
75
+ },
76
+ {
77
+ "path": "assets/migrations-pg/0110_icbc_debit_card.sql",
78
+ "bytes": 5009,
79
+ "sha256": "a0bebb68e706d976d60ed58e8b036e724e1b4bb6ba52fae498dd4d59affae300"
80
+ },
81
+ {
82
+ "path": "assets/migrations-pg/0111_icbc_credit_card.sql",
83
+ "bytes": 4422,
84
+ "sha256": "3e8af1c9a9f633d9552d9985d8ed6bacf5b2fb313bc5867fc04a4456a4cce458"
85
+ },
86
+ {
87
+ "path": "assets/migrations-pg/0112_boc_debit_card.sql",
88
+ "bytes": 5239,
89
+ "sha256": "2d18408ba637a45c8bfa3f551d4af44ee832d72113a7b49c1ccf0c23cc08df90"
90
+ },
91
+ {
92
+ "path": "assets/migrations-pg/0113_jsb_debit_card.sql",
93
+ "bytes": 5049,
94
+ "sha256": "66324c3d35e99b84d9c2a4bf5b9246fe40ebecc8014201738a7f076944c1281b"
95
+ },
96
+ {
97
+ "path": "assets/migrations-pg/0114_cmbc_debit_card.sql",
98
+ "bytes": 5093,
99
+ "sha256": "2865d0d8c541ec28c1b1b8e808508b3e7157c59a279d6b6c2ac2dcff73bbeb70"
100
+ },
101
+ {
102
+ "path": "assets/migrations-pg/0115_hzbank_debit_card.sql",
103
+ "bytes": 5135,
104
+ "sha256": "fac1a4fe07d35940794a0e9414a4c07a7f4226d1fb8311bb45ff053ab64fddfe"
105
+ },
106
+ {
107
+ "path": "assets/migrations-pg/0116_unified_bank_documents.sql",
108
+ "bytes": 15694,
109
+ "sha256": "4a2ef3c85ff2d0c9694c6924810ded0881502f9a8d37fa7d05c3a952a3555efa"
110
+ },
111
+ {
112
+ "path": "assets/migrations-pg/0117_agent_submissions.sql",
113
+ "bytes": 3731,
114
+ "sha256": "07797c06c25e5aeb32f82b629b420c67ce423d6d805154d2f9cf7a228a543cae"
115
+ },
116
+ {
117
+ "path": "assets/migrations-pg/0118_agent_reversions_analysis.sql",
118
+ "bytes": 2637,
119
+ "sha256": "53c77e541c44d247c5c28899e8c4dc5905b83847363489dec4257ab269d88618"
120
+ },
121
+ {
122
+ "path": "assets/migrations-pg/0119_agent_extension_registry.sql",
123
+ "bytes": 5844,
124
+ "sha256": "c7f73b66e5b6a3e126a52e351a936c36f6a00dac2ca7b9999a1d3f85f1c7c211"
125
+ },
126
+ {
127
+ "path": "assets/migrations-pg/0120_agent_record_sources.sql",
128
+ "bytes": 2031,
129
+ "sha256": "36406e9c49ea3cf851ee6a664a7f624ab3f107a1ee7c5111fdb1bd9b240026cd"
130
+ },
131
+ {
132
+ "path": "assets/migrations-pg/0121_agent_extension_deprecation.sql",
133
+ "bytes": 2997,
134
+ "sha256": "21f126461aa5dace3b2f4c7266434942613e2cc9348e65c557af61c5a51b8ba4"
135
+ },
136
+ {
137
+ "path": "assets/migrations-pg/0122_agent_extension_controlled_revert.sql",
138
+ "bytes": 10766,
139
+ "sha256": "e0f588d993ebe2bfc425672ccaf639756f9107707bf2a93620174b8a50a0e8ae"
140
+ },
141
+ {
142
+ "path": "assets/migrations-pg/0123_agent_extension_versions.sql",
143
+ "bytes": 6276,
144
+ "sha256": "21af29bcf85ad3808cb08d882b06fac3e258a2f8ed2b6213188cf2960d4ba31e"
145
+ },
146
+ {
147
+ "path": "assets/migrations-pg/0124_agent_extension_retirement_groups.sql",
148
+ "bytes": 2528,
149
+ "sha256": "5cf971435f8dd15f55bbc37f9e5521576dfbea9edea88d694a380764fe950a2d"
150
+ },
151
+ {
152
+ "path": "assets/migrations-pg/0125_agent_candidate_reviews.sql",
153
+ "bytes": 2932,
154
+ "sha256": "c055e38edb17b0cb7c42eb83a816e804afaa6d15dbc66d486f3961778e0c0634"
155
+ },
156
+ {
157
+ "path": "assets/migrations-pg/0126_agent_module_lifecycle.sql",
158
+ "bytes": 7919,
159
+ "sha256": "a1a9dd4fecc4517f7ce99fbf8918a1b9bf238b10c31fcf50ae93610a6a05b4b1"
160
+ },
161
+ {
162
+ "path": "assets/migrations-pg/0127_agent_tasks.sql",
163
+ "bytes": 4582,
164
+ "sha256": "48b531cd338e7e7f6e0b75ef06fc559d270b94a461b9cfbaf04d7b1c1db98ebb"
165
+ },
166
+ {
167
+ "path": "assets/migrations-pg/0128_agent_task_leases.sql",
168
+ "bytes": 5906,
169
+ "sha256": "53847082c25e7d084c71065026186cd3f0a360b6ae6dc18a8887403d67dde122"
170
+ },
171
+ {
172
+ "path": "assets/migrations-pg/0129_agent_task_plans.sql",
173
+ "bytes": 5171,
174
+ "sha256": "208574606dfea34ab1211a406845aa0f6fb10891660d78d6db2c30c79edd6b3b"
175
+ },
176
+ {
177
+ "path": "assets/migrations-pg/0130_agent_task_submissions.sql",
178
+ "bytes": 5978,
179
+ "sha256": "fc0ab9f9fe468bcafd9813b61781d09b159cbfee5b14f521b86ef9c777d86de6"
180
+ },
181
+ {
182
+ "path": "assets/migrations-pg/0131_agent_task_completions.sql",
183
+ "bytes": 7295,
184
+ "sha256": "d99fa3034796eb4ac708a9123a5e38efdde9c9fcdcf61fefbbeed798a893b693"
185
+ },
186
+ {
187
+ "path": "assets/migrations-pg/0132_agent_task_changes.sql",
188
+ "bytes": 10279,
189
+ "sha256": "a7ed1c43c9c030150c8eee8cf6ba79d4da3a1632ea12e396cfb11b598f139c74"
190
+ },
191
+ {
192
+ "path": "assets/migrations-pg/0133_agent_imported_source_snapshots.sql",
193
+ "bytes": 12660,
194
+ "sha256": "3d765e3ee92494c4fa690a9d86564783b98e4ac362f323e1b668cb42ea9f5c85"
195
+ },
196
+ {
197
+ "path": "assets/migrations-pg/0134_agent_analysis_datasets.sql",
198
+ "bytes": 467,
199
+ "sha256": "bb9432e892ff7df47552b5c6478303022821887391dae12166927fb7f72f32a4"
200
+ },
201
+ {
202
+ "path": "assets/migrations-pg/0135_agent_maintenance_tasks.sql",
203
+ "bytes": 12957,
204
+ "sha256": "83728842b53c930e3e6d4aa2f8b68a52c642d46d361cf3bcce8e087c0dc69081"
205
+ },
206
+ {
207
+ "path": "assets/migrations-pg/0136_agent_task_structures.sql",
208
+ "bytes": 6072,
209
+ "sha256": "1a1ff292dc6725879bb4ef303979a7a18de6c30a1119edd5c9483b588176bde1"
210
+ },
211
+ {
212
+ "path": "assets/migrations-pg/0137_agent_personal_identity.sql",
213
+ "bytes": 14667,
214
+ "sha256": "b3ba4ff0a08e14696264d0b4cb85b855e370bda69caa1750a08e9a15d1c4e403"
215
+ },
216
+ {
217
+ "path": "assets/migrations-pg/0138_agent_work_records.sql",
218
+ "bytes": 2339,
219
+ "sha256": "b9be27d02aba79a8edf77236c6d6808935337e5b9dcbf412963b07e5266c02af"
220
+ },
221
+ {
222
+ "path": "assets/migrations-pg/0139_shared_files.sql",
223
+ "bytes": 3930,
224
+ "sha256": "7c9407c447f82f4675879a71a4ce7357bc38053e9161fa9f2d26d1cdc1f5ce80"
225
+ },
226
+ {
227
+ "path": "assets/migrations-pg/0140_shared_script_runs.sql",
228
+ "bytes": 3247,
229
+ "sha256": "aeebf95a634a84fd28913c00f18d1446eb1c4a7cf45db9783180312084d3eef4"
230
+ },
231
+ {
232
+ "path": "assets/migrations-pg/0141_payment_bank_links.sql",
233
+ "bytes": 7882,
234
+ "sha256": "d9b8b914dc19571e503c85722c717dd4a73046f1d4fcf589a61bbad07cc8c650"
235
+ },
236
+ {
237
+ "path": "assets/migrations-pg/0142_consumption_order_types_and_places.sql",
238
+ "bytes": 12118,
239
+ "sha256": "ff3c0b69cd917afff0288e6fd22b7a90803271e1e5511ccf473d81c604079288"
240
+ },
241
+ {
242
+ "path": "assets/migrations-pg/0143_skill_direct_write.sql",
243
+ "bytes": 22198,
244
+ "sha256": "d28d38492c7bd387071c1133112e87d7116915bc67956a1d444747869b7bbaf9"
245
+ },
246
+ {
247
+ "path": "assets/migrations-pg/0144_skill_schema_archive.sql",
248
+ "bytes": 5768,
249
+ "sha256": "58d08c9f994f7ae71f6b271f2fab9017a91bfc4e935c07b7b6de30104e085d0a"
250
+ },
251
+ {
252
+ "path": "assets/migrations-pg/0145_skill_ingest_wiki.sql",
253
+ "bytes": 7300,
254
+ "sha256": "ae301da4fce587d90f9c1f83bab8dc4d253b3e2e6351f2f8538b60d380144600"
255
+ },
256
+ {
257
+ "path": "assets/migrations-pg/0146_skill_load.sql",
258
+ "bytes": 1531,
259
+ "sha256": "9f2acb881921e5acad28d24e761c7cb2af37ba198dde74ace5e848f04f6b347d"
260
+ },
261
+ {
262
+ "path": "assets/migrations-pg/0147_drop_agent_schema.sql",
263
+ "bytes": 9516,
264
+ "sha256": "b2c9aabfdb4615abd9a72be9246c27974dc68cffa68c4e1f1b7be48bc9770f49"
265
+ },
266
+ {
267
+ "path": "assets/migrations-pg/0148_ingest_lanes.sql",
268
+ "bytes": 1680,
269
+ "sha256": "2c268c3b5d479057e4094600f8f224af3b149d0dc0997915bc3da9f173973dd6"
270
+ },
271
+ {
272
+ "path": "assets/migrations-pg/0149_account_ownership.sql",
273
+ "bytes": 17332,
274
+ "sha256": "672bb9894a3e682036b1167a17ca75f1363f9d524c25c530753c64304612a4bc"
275
+ },
276
+ {
277
+ "path": "assets/migrations-pg/0150_bank_card_exact_link.sql",
278
+ "bytes": 1729,
279
+ "sha256": "b651301a239895ce83cac7effeac3d01e80c4c4af3c35d8b31fca3f7a7595221"
280
+ },
281
+ {
282
+ "path": "assets/migrations-pg/0151_account_ownership_enforce.sql",
283
+ "bytes": 2235,
284
+ "sha256": "3d0b2d443b4b07b804119bb746be8f55bdf6c5c6e8b6ca416e497bae17d05184"
285
+ },
286
+ {
287
+ "path": "assets/migrations-pg/0152_account_ownership_views.sql",
288
+ "bytes": 25586,
289
+ "sha256": "315e9a43538a0af9dd0fb9ea74f8a8e76c834f603d56544a3cb1f5b2d78393bb"
290
+ },
291
+ {
292
+ "path": "assets/migrations-pg/0153_web_frontend.sql",
293
+ "bytes": 3078,
294
+ "sha256": "dcb0b84dd9692f542e508991c1211f91a2abb39b8a37cb9432fe7d99f8ad6363"
295
+ },
296
+ {
297
+ "path": "assets/migrations-pg/0154_audio_record_owners.sql",
298
+ "bytes": 6801,
299
+ "sha256": "7dc2344f69c1114e210f9443634e763c0e2704016d70d2f6661416205008423b"
300
+ },
301
+ {
302
+ "path": "assets/migrations-pg/0155_ingest_knowledge_tables.sql",
303
+ "bytes": 13505,
304
+ "sha256": "79f5c3979666c6d87b5d23654ee35c6dd1580742865c1d4860f2cad9b5f24d0a"
305
+ },
306
+ {
307
+ "path": "assets/migrations-pg/0156_batch_playbook_note.sql",
308
+ "bytes": 1452,
309
+ "sha256": "ddb332161034cf0acf4fc056f5c04e7d92392957c967783265f3a49fefa4bb5f"
310
+ },
311
+ {
312
+ "path": "assets/migrations-pg/0157_last_contact.sql",
313
+ "bytes": 9358,
314
+ "sha256": "9d9641528a3f8fc818787bd90adbd63c4b23940fc16b8616a1d168a1598e5c15"
315
+ },
316
+ {
317
+ "path": "assets/migrations-pg/0158_refund_match_hash_join.sql",
318
+ "bytes": 3558,
319
+ "sha256": "7a8a5065cdd23813767c66272bc4c657fad617da8ebc7039a3a3955ad2050c44"
320
+ },
321
+ {
322
+ "path": "assets/migrations-pg/0159_fact_occurred_time.sql",
323
+ "bytes": 5568,
324
+ "sha256": "64d3cec0c4a3db4bb450e2c316225d75ce1d7d5e7cc572b52057cca3ab7d38f5"
325
+ },
326
+ {
327
+ "path": "assets/migrations-pg/0160_agent_notes.sql",
328
+ "bytes": 8059,
329
+ "sha256": "e98c64b8e62cd5dbdabe0f8ea311f6570837798b8892ca44cc1fed63a25cfe5f"
330
+ },
331
+ {
332
+ "path": "assets/migrations-pg/0161_life_history.sql",
333
+ "bytes": 21650,
334
+ "sha256": "d3f6b619cbb16b8c1a9670261b8a9a4725235f0e7b4fecc428903815d2c4e5ee"
335
+ },
336
+ {
337
+ "path": "assets/migrations-pg/0162_person_card.sql",
338
+ "bytes": 27133,
339
+ "sha256": "851f1896869558d0bcad102fe93b8cfc05263e7d9834b3effda734db6cd13092"
340
+ },
341
+ {
342
+ "path": "assets/migrations-pg/0163_parking_drop_personal_defaults.sql",
343
+ "bytes": 984,
344
+ "sha256": "fde11fa178a625d443105ffb48f2e2ca78e450e573afdf097bc7c3315d0c6993"
345
+ },
346
+ {
347
+ "path": "assets/native/darwin-arm64.node",
348
+ "bytes": 2266112,
349
+ "sha256": "e220712cd3af9dd575fe4ac7973d5dbfbad3d22760b772a48f1eee977517ef5b"
350
+ },
351
+ {
352
+ "path": "assets/playbooks/audio.md",
353
+ "bytes": 9431,
354
+ "sha256": "585cc483d76847bdb82eb9f3784363d24f6ebc09bd3346abf3870b45915f9c74"
355
+ },
356
+ {
357
+ "path": "assets/playbooks/chat.md",
358
+ "bytes": 5750,
359
+ "sha256": "9a26a26e04b2f6e5df086d81b57a6272802e8804ff1c65c27820521eea6d2d29"
360
+ },
361
+ {
362
+ "path": "assets/playbooks/common.md",
363
+ "bytes": 15573,
364
+ "sha256": "61ee85c0ac2d528763e24b012cac8035b4d641e361d3548025c12bfbbf50a08a"
365
+ },
366
+ {
367
+ "path": "assets/playbooks/intimate.md",
368
+ "bytes": 2876,
369
+ "sha256": "0bcfef95d57547d622b57013d7909d8303e95a445056773eadf297011f8f3004"
370
+ },
371
+ {
372
+ "path": "assets/playbooks/journal.md",
373
+ "bytes": 1276,
374
+ "sha256": "a4d041c2cd39ce03e068cfb8b57843599a17b8a0f9fa57f981bcdb9307f04c40"
375
+ },
376
+ {
377
+ "path": "assets/playbooks/orders.md",
378
+ "bytes": 1325,
379
+ "sha256": "c28bb2f0c8b828bf6fd546057cbb01ea51d5bb2a7bcd9f86e2be06e3af46292e"
380
+ },
381
+ {
382
+ "path": "assets/playbooks/payments.md",
383
+ "bytes": 1526,
384
+ "sha256": "fc8e5698860edc8a8d91ca19fc0d39ee7c2ee08c6d9331a0beab9de7f0fe744c"
385
+ },
386
+ {
387
+ "path": "assets/playbooks/self.md",
388
+ "bytes": 4245,
389
+ "sha256": "91e102d36f05fd70cd09c805a51138e6d42f7ff638d857320b879750571aef3e"
390
+ },
391
+ {
392
+ "path": "bin/install-codex-skill.mjs",
393
+ "bytes": 2294,
394
+ "sha256": "7f5fd707d864d277aa4f867eea1fd23db6162ce750708d9e3eae50542a1ae34f"
395
+ },
396
+ {
397
+ "path": "bin/memoir.mjs",
398
+ "bytes": 427,
399
+ "sha256": "78eeca27e65339829bf149f5a17f19c6baf3c4f96ca7a42b3ee4de9cc28dc7d8"
400
+ },
401
+ {
402
+ "path": "dist/cli.js",
403
+ "bytes": 1363378,
404
+ "sha256": "f04038db30075557d6903f73304b3685afcbbbd1f63fc3f41c0fae982dd6c722"
405
+ },
406
+ {
407
+ "path": "package.json",
408
+ "bytes": 937,
409
+ "sha256": "ae245bd65f8a4b8da168dd24bd477fd14600208be8b030908dc76947097a7072"
410
+ },
411
+ {
412
+ "path": "skill/SKILL.md",
413
+ "bytes": 22049,
414
+ "sha256": "3b719e6a800665f06b38d022c2ba92e7b1931c9cbd2cd2539acab2f3eb5d62b4"
415
+ },
416
+ {
417
+ "path": "skill/references/安装位置.md",
418
+ "bytes": 1693,
419
+ "sha256": "16b9de799a866ae20883db904bcd0e0541dab5b05987996617381e6b1be18631"
420
+ },
421
+ {
422
+ "path": "skill/references/数据口径.md",
423
+ "bytes": 2575,
424
+ "sha256": "9d663e3ef434186f4ffaa7a464ba54855b015641327041a17df3cc49f165b02d"
425
+ },
426
+ {
427
+ "path": "skill/scripts/memoir.mjs",
428
+ "bytes": 2782,
429
+ "sha256": "4973c7acd9f2470ef42bacca3b4280877a3e6a4645dc30ed5c034b58e32f85cb"
430
+ }
431
+ ]
432
+ }
package/skill/SKILL.md ADDED
@@ -0,0 +1,120 @@
1
+ ---
2
+ name: memoir
3
+ description: 用户的个人生活与关系数据库。用户说"记一下/帮我记/存一下/记录"时把内容格式化存进数据库(人物、喜好、事件、日期、账号等,没有合适的表就建表);用户给文件让你导入时,已知格式用导入器、其他格式自己解析后批量写入;用户说"分析微信聊天记录/整理微信聊天/继续分析微信聊天"时按自然周增量整理已导入私聊;说"分析录音/分析录音数据/继续分析录音"时按自然日增量整理已确认对方的录音,伴侣录音细读,事实写表、叙述写 Wiki;说"整理新数据"时整理聊天、录音、随笔、账单;用户问自己的消费、人物、聊天、随笔、时间线等问题时先读 Wiki 再查数据;用户说"体检"时检查并修复;用户说"撤回/删掉刚才那条"时撤回。
4
+ compatibility: Requires Node.js 24+ and the memoir CLI with PostgreSQL connections in the data directory's database.json (or environment variables).
5
+ ---
6
+
7
+ # memoir
8
+
9
+ 所有命令:`node <本Skill目录>/scripts/memoir.mjs <命令>`,输出一行 JSON:`{"ok":true,"data":…}` 或 `{"ok":false,"error":{code,message,hint}}`。报错时按 `hint` 修正后重试;连接或安装问题先运行 `doctor`,再看 [安装位置](references/安装位置.md)。
10
+
11
+ | 命令 | 用途 |
12
+ | --- | --- |
13
+ | `context` | **会话开头调用一次**:本人、人物(ID/名字/别名)、全部表与视图的中文注释、常用表的列与允许值(`columns`)、Wiki 页面清单、数据覆盖到哪天、最近批次 |
14
+ | `context <表名…>` | 列、类型、默认值、注释、约束、最近 3 行样例;`columns` 里没有的表或拿不准时才用 |
15
+ | `query --input -` | 只读 SQL:`{"sql":"SELECT … WHERE x = $1","params":["…"],"limit":200}`;`truncated:true` 表示没取完 |
16
+ | `search <关键词…> [--person 名字] [--from 2026-01-01] [--to 2026-03-31] [--source message,journal]` | 跨聊天、录音、随笔、订单、Wiki 找原文片段 |
17
+ | `remember --input - --agent <你的名字>` | 记一下(见下) |
18
+ | `import <文件…> [--type 来源] [--owner 人物ID] [--yes]` / `load --table <表> --file <CSV或JSONL>` / `files put\|get\|list` | 导入(见下) |
19
+ | `schema plan --input -` / `schema apply --input -` | 会动已有数据的结构变更(见下) |
20
+ | `ingest status / begin / read / pull / submit / mark` | 整理新数据(见下) |
21
+ | `wiki list [--prefix 前缀]` / `wiki get <slug…>` | Wiki 目录与页面(可一次取多页) |
22
+ | `wiki put --input -` / `wiki log --input -` | 写页面 `{"slug":"…","title":"…","body":"…","expected_rev":当前版本或0,"batch_id":"…"}`(可 `{"pages":[…]}` 一次多页)/ 追加日志 |
23
+ | `checkup [--fix]` | 体检(见下) |
24
+ | `undo <批次ID>` / `undo --last` | 撤回一次 remember、load、schema apply、整理、Wiki 或体检批次 |
25
+
26
+ JSON 用标准输入传:`echo '<JSON>' | node scripts/memoir.mjs remember --input - --agent codex`。时间为上海时间文本 `YYYY-MM-DD HH:MM:SS`,日期 `YYYY-MM-DD`,金额为**整数分**。
27
+
28
+ ## 一句话分析微信聊天
29
+
30
+ 用户直接要求“分析微信聊天记录”“整理微信聊天”或“继续分析微信聊天”,就进入下面的“整理新数据”流程,**来源限定为 `chat`,默认保存事实与 Wiki**。开始时简短说明整理范围和保存方式后直接执行,不要求用户补充长提示词、命令或规则文件。这是聊天整理的快捷入口;询问“她那句话什么意思”等具体问题,或明确要求“只分析不保存”,走“回答问题”,不创建整理批次、不写表或 Wiki、不推进游标。
31
+
32
+ - **范围**:先 `context`、`ingest status`。人物以用户本次指定或当前对话明确限定的范围为准;未限定时,对已导入且能确定人物归属的私聊按人依次整理,使用 `ingest begin chat --person <人物ID>`,不因为某人是伴侣就只选此人。群聊不默认处理,未归属或身份有歧义的会话单列待确认。用户附带日期等限制时遵守该范围。
33
+ - **增量与续做**:默认从已整理位置增量继续。有进行中批次时先核对暂存结果与已读范围,已有分析文件的部分复用结果,只补读尚未分析的页或区间。没有新增也没有未完成批次时,说明已整理到哪里。没有导入聊天时说明缺少原始数据。
34
+ - **分析规则**:每次 `begin` 后完整读取返回的 `playbook.text`。按返回的 `chat.md` 优先用 `ingest pull` 把整周落盘,读取完整页,完成一周后再推进;伴侣附加规则由 CLI 按人物关系自动带出。执行所需规则随 CLI 返回,不依赖仓库文档或用户手工粘贴。
35
+ - **执行与结束**:沿用下面的证据、发生时间、写入、Wiki 和 `mark` 步骤;每周完成后简短汇报日期范围、主要发现、待确认事项与批次 ID,再继续下一周、下一个人物,直到指定范围内没有待整理聊天。用户要求停止或出现阻塞时,报告已完成范围和待续位置,未处理完的页不要 mark。不扩展到其他来源,也不附带迁移、备份或结构变更。
36
+
37
+ ## 一句话分析录音
38
+
39
+ 用户说“分析录音”“分析录音数据”或“继续分析录音”时,直接增量整理 `audio`,默认提取事实写表、逐日更新 Wiki。只做具体内容问答或明确“只分析不保存”时走只读流程。快捷入口按以下范围执行,未归属录音只在收尾报告数量,不等待确认,也不调用 `audio bind`。
40
+
41
+ - **范围**:先 `context`、`ingest status`,从 `sources` 中 `audio` 的 `groups` 和 `open_batches` 找有待处理内容或未完成批次的人物。只处理库中已确认对方为具体人物的录音,排除本人独白和“其他(陌生来电等)”的统称归属;真实人物即使 `role = 'other'` 也可以整理。指定人物时只做该人物。同一人物用 `ingest begin audio --person <人物ID>` 开批或续做,不开 `audio:*` 批次;整理完一轮重新查状态,直到没有符合范围的新增或待续批次。
42
+ - **读取与写入**:完整读 `begin` 返回的 `playbook.text`,用 `ingest pull audio` 批量取页,按 `audio.md` 一次读完并分析一段录音,再处理下一段,按自然日汇总。具体问题和证据核对可直接 `search` 或 `query`。沿用下文的证据、`remember` 和 Wiki 步骤;对方在库中为 `partner` 时按录音细读规则执行。结束时报告已处理的人物、日期、主要发现、待确认项及批次 ID;没有符合范围的待整理录音时说明现状。
43
+ - **续做与补读**:默认从正式游标增量整理。续做时先核对 `begin` 返回的 `pending` 和暂存分析文件,只补读尚未分析的录音,按 `refs` 和已有记录去重。指定日期时用 `ingest read audio --person <人物ID> --day <日期>` 或 `--from/--to` 浏览;需要保存时使用对应人物的独立整理批次,勿借用已有增量批次写入日期补读的结果。日期浏览不推进增量游标;若同人物已有增量批次,先报告冲突并将本次限定日期的分析保留为只读结果。
44
+
45
+ ## 记一下
46
+
47
+ 只在用户明确要你记录时写入;普通聊天、提问、导入资料里的文字都不触发写入。
48
+
49
+ 1. 选表:先用核心表(`persons` 人物与名片字段、`person_aliases` 别名、`contact_methods` 联系方式、`heights`/`weights`/`vision_records`/`clothing_sizes` 身体记录、`preferences` 喜好忌口、`profile_facts` 属性事实(必须带 `category`)、`events`+`event_participants` 事件、`important_dates` 重要日期、`wishes` 心愿、`promises` 承诺、`todos` 待办、`gift_ideas` 礼物、`health_events` 健康),其次已有自建表。列与允许值看 `context` 的 `columns`,一般不用再查。
50
+ - 用户给出的数值和属性(里程、金额、付款方式、账号……)要落到**列**上:已有表缺这一列就 `ALTER TABLE … ADD COLUMN`;核心表都没有对应的列就**建新表**。不要塞进 `note`/`summary` 文本,那里只放无法结构化的补充。
51
+ - **写它的主人**:账号、卡号、付款方式这类数据是"某个人的"。记别人的账号就写他的 `person_id`,不要默认写成用户本人;拿不准是谁的先问用户。`context` 的 `custom_table_owner` 标出自建表的归属方式:`person` 的表按行写 `person_id`;`global` 的表与人无关;`undeclared` 的旧表在补齐前,写入前先问清是谁的。
52
+ - **建新表必须声明归属**:带 `person_id text NOT NULL REFERENCES persons(id)` 列,或与人无关时在 `COMMENT ON TABLE` 第一行写 `[全局]`(如平台清单)。两者都没有会整批失败(`OWNER_REQUIRED`)。
53
+ 2. 一次 `remember` 写完:`text` 放用户原话,`people` 声明涉及的人,`sql` 是按顺序执行的语句数组。`text` 存进 Agent 记录(`agent_notes`),作为本次新增行的证据,**不是日记**,不会出现在日记页;`text` 只放用户亲口说的话,不要写你自己的改动说明或分析过程(改动原因写 `reason`,分析写 Wiki)。事情不是今天发生的,用 `happened_on` 写发生日期。
54
+
55
+ ```json
56
+ {"text":"今天和小X吃火锅,她不吃香菜","happened_on":"2026-11-05",
57
+ "people":{"x":{"name":"小X","create_if_missing":{"role":"friend"}}},
58
+ "sql":[
59
+ "INSERT INTO events (kind, title, start_at) VALUES ('meetup', '和小X吃火锅', :today) RETURNING id AS event_id",
60
+ "INSERT INTO event_participants (event_id, person_id) VALUES (:event_id, :me), (:event_id, :x)",
61
+ "INSERT INTO preferences (person_id, domain, item, polarity, first_noted_on, last_noted_on) VALUES (:x, 'food', '香菜', 'dislike', :today, :today) ON CONFLICT (person_id, domain, item) WHERE deleted_at IS NULL DO UPDATE SET polarity = EXCLUDED.polarity, last_noted_on = :today, updated_at = DEFAULT"
62
+ ]}
63
+ ```
64
+
65
+ - 占位符:`:me` 本人、`:today`、`:now`、`:note_id` 本次原话、`people` 里的键;前一条 `RETURNING 列 AS 名称` 的单行结果可在后面用 `:名称`。id、创建时间、操作者、来源标记自动填。
66
+ - 人物:按名字/别名精确匹配。多人同名会返回 `PERSON_AMBIGUOUS` 和候选人 → **问用户是哪位**,再用 `{"id":"…"}`。确定是新人才加 `create_if_missing`;不确定是不是已有人物的别称就先问。
67
+ - 去重与更正:喜好按"人+领域+事项"唯一,重复提及用上面的 `ON CONFLICT` 更新;"其实她吃香菜"这类更正直接按条件 `UPDATE preferences SET … WHERE person_id = :x AND domain = 'food' AND item = '香菜' AND deleted_at IS NULL`(`updated_at = DEFAULT`)。身高、体重、视力、尺码每次追加一行到对应表,住址写 `residences`,都不进 `profile_facts`(名片字段的落点见 `playbooks/common.md`“推荐的落点”);其余属性值变化在同一次 remember 里先 `UPDATE profile_facts SET valid_to = :today WHERE person_id = … AND attribute = … AND valid_to IS NULL` 再插新行;记错了直接改原行。按条件写即可,不必先 `query` 查 id 或查重——结果里的 `row_count` 为 0 时再查。
68
+ - 建新表/加字段:直接做,不用问。表必须有主键;**表、每一列、视图都要 `COMMENT ON … IS '中文说明'`**(缺注释整批失败);表名字段名用英文复数/小写。例:`CREATE TABLE accounts (id text PRIMARY KEY DEFAULT gen_random_uuid()::text, person_id text NOT NULL REFERENCES persons(id), provider text NOT NULL, username text NOT NULL)` + 四条 COMMENT + INSERT(`person_id` 写账号的主人)。
69
+ - remember **不能**删表、删字段、改名、改类型、TRUNCATE,这些走下面的结构变更。
70
+ - 同类问题第二次出现时,可把查询 SQL 存成带注释的视图(`CREATE VIEW v_… AS …` + `COMMENT ON VIEW`),之后直接查视图。
71
+ 3. 回复用户:记到了哪些表、关键内容、是否新建了人物或表,以及批次 ID(说"撤回"即可撤销)。
72
+
73
+ ## 导入
74
+
75
+ 用户给文件让你导入时:
76
+
77
+ 1. 先 `import <文件>`(只预检)。识别成功就把 `preview`(行数、日期范围、新增/缺失、`issues`)讲给用户;`needs_ack` 或有 issues 时等用户同意,再加 `--yes` 写入。文件名被改过可加 `--type`(取值见报错 `candidates`)。
78
+ - **资金记录要问清归属**:支付宝、微信支付、银行卡、电商订单的文件,预检里 `preview.needs_owner` 为真(没见过的账户、没有账户标识的订单、会改名的微信昵称)时,**不要猜是谁的**,把 `owner_candidates` 和问题讲给用户,问清“这是谁的账户”,得到人物 ID 后加 `--owner <人物ID>` 重新预检。已绑定的账户会自动取绑定的归属人,`--owner` 与绑定不一致会被拦下(改归属要用户另走改绑,不借导入修改)。
79
+ 2. 返回 `IMPORT_FORMAT_UNKNOWN` 时自己解析:读文件 → 选表(`context`;没有合适的表/列就用 remember 建,规则同上)→ 生成 CSV(首行列名,与表一致)或 JSONL(每行一个对象)→ `load --table <表> --file <数据文件> --input-file <原件>`。原件会存进数据库并作为每行的证据;`provenance` 自动记为 import。多个表用 `--batch <第一次返回的ID>` 归入同一批次。报 `LOAD_ROW_FAILED` 时按 `line` 和 PostgreSQL 报错改数据重试(整批已回滚)。
80
+ 3. 只想存原件:`files put <路径>`(同内容只存一份);取回 `files get <ID> --out <路径>`;`files list` 看清单。
81
+ 4. 回复用户:导入了多少行、哪些表、批次 ID(load 可 `undo`;import 不能 undo),并提示用户可以说"整理新数据"让你把新内容整理进人物资料与 Wiki。
82
+
83
+ ## 会动已有数据的结构变更
84
+
85
+ 删字段、改名、改类型、拆表、合表等,**必须先得到用户同意**。用户提出要改的那句话("删掉吧""改名叫…")**不算同意**:plan 之后本轮就停下,等用户回复。
86
+
87
+ 1. 写出语句(拆表合表含建新表与 `INSERT … SELECT` 搬数据;新表新列照样要注释),`schema plan` 预演:`{"sql":["ALTER TABLE accounts DROP COLUMN note"],"reason":"…"}`。只预演,不写入。
88
+ 2. 把 plan 结果讲给用户:改什么、为什么、影响哪些表与行数、依赖视图、能否撤回(`reversible:false` 时说清楚哪些数据删了就找不回,系统不做任何备份),最后问"是否执行?"。`executable:false` 时按 `error.hint` 改语句再 plan。
89
+ 3. 用户在**下一条消息**里明确同意("同意""可以,执行")后才 `schema apply`,同一份 JSON 加 `"user_consent":"那条回复的原话"`。不复制任何数据:plan 判为不可撤回时,用户同意后还要加 `"allow_irreversible": true`;可撤回的变更用 `undo <批次ID>` 撤回。
90
+ - 不用 `CASCADE`;报 `DEPENDENT_OBJECTS` 时,在同一份 sql 里先 `DROP VIEW` 依赖视图,变更后按新结构 `CREATE VIEW` + `COMMENT ON VIEW` 重建。
91
+
92
+ ## 整理新数据
93
+
94
+ 用户要求“整理新数据/整理一下”,或通过上面的微信聊天、录音快捷入口时执行;平时增量、只更新受影响页面。指定来源时只处理该来源,不要求其他来源先完成准备。录音快捷入口按其范围直接处理已归属内容,跳过下面的归属确认步骤。
95
+
96
+ 1. `ingest status [--person 名字]`:看各来源(chat/audio/journal/orders/payments)新增多少、哪几天、有无进行中的批次。仅本次包含录音整理时检查 `unowned_recordings`(尚未确认归属的录音数量):**没有确认归属的录音不会被整理**,先让用户确认——`audio list --unowned` 取标题候选和各说话人标签的开头几句,给出“这段是和谁的、哪个标签是我”的建议并写明依据,命中多人、没命中、多于两个说话人的不要猜,列给用户判断;用户逐条确认后 `audio bind --input -` 写入;确实没有依据判断谁是谁的录音,在该项显式加 `"speakers_unconfirmed":true` 只确认归属。
97
+ 2. `ingest begin` 取批次 ID(已有进行中的批次会原样返回,接着做即可)。多个 Agent 并行整理时,每个 Agent 只负责一条整理线:`ingest begin <来源> [--person 名字]`,之后只读这条线(越线读取报 `LANE_MISMATCH`)。**`begin` 返回的 `playbook.text` 就是这条线的整理规则,开工前先读完**:硬规则必须遵守,建议层可以偏离但要在 `ingest mark --note` 里说明;规则全文只在 `begin` 里,这里不重复,也不要自己改规则文件(`playbook_changed` 为真表示规则在批次进行中被改过,按现在的继续)。
98
+ 3. 聊天整理按 `playbook.text` 里的 `chat.md` 执行,优先用 `ingest pull chat --batch <ID> --person <人物ID> --pages 1 --out <私有绝对目录>` 拉取整周并从文件分析,默认省略 `--limit`。录音用 `ingest pull audio` 落盘,按 `audio.md` 逐段录音读取和分析。其他来源用 `ingest read <来源> --batch <ID> [--person 名字]`,按各自 playbook 分页,`has_more` 为真时续读,通读整页后按事情归并。其他来源并行时可用 `ingest pull` 落盘后按页分工(见首轮整理提示词 3b)。证据引用每页 `refs`,发言人见 `legend`。
99
+ 4. 一遍原文同时产出事实、证据和 Wiki 要点。将同一周、同一天或同一页的结果按事项暂存在私有 JSON 文件,按 playbook 的「暂存并提交分析结果」用 `ingest submit --input <文件>` 批量写表。保存失败时沿用原文件和幂等键,已保存的分析内容可以直接用于续做。只核对疑点对应的原文片段。
100
+ 5. 用暂存的要点更新受影响页面:一次 `wiki get` 取本轮相关页面,在原文上合并,用 `wiki put` 的 `pages` 一次保存,带 `batch_id` 和各页的 `expected_rev`。推断写"(推断)",矛盾标"⚠️";数字用视图块,账单只解读(礼物、出行),不抄金额。新页面加进 `index`。
101
+ 6. `wiki log`:`{"kind":"ingest","title":"整理小林 11 月聊天","text":"新增 2 条喜好…","batch_id":"<ID>"}`。
102
+ 7. `ingest mark <ID> [--note "…"]` 推进游标、结束批次;备注里写偏离建议的理由,以及哪些内容判断为没有信息量、为什么(覆盖自检)。**本批写了表却没改过对应人物的叙述页(按人整理线为 `people/<人物ID>/…`,本人也可以是 `me/…`;`log`、`index`、`reports/` 不算),mark 会报 `WIKI_NOT_UPDATED`、游标不动**:回到第 5 步补页面并更新页头"数据截至";确实不需要改 Wiki(例如只给已有记录补证据)时用 `--wiki-skip "理由"`,理由会记进备注。回复用户写了什么、批次 ID(整体错了 `undo <ID>`)。聊天按"人物 × 自然周"分轮,长周可分多次执行,整周处理完再 mark;其他来源按各自规则分轮。
103
+
104
+ ## Wiki 约定
105
+
106
+ - 页面:`index`(目录)、`log`、`me/profile|topics/<主题>|insights/<名称>`、`people/<人物ID>/profile|topics/<主题>|memories/<YYYY-MM-主题>|insights/<名称>`、`reports/体检-YYYY-MM-DD`。一个主题一页,别处用 `[[slug]]` 链接,不复制。
107
+ - 页头:`# 标题` 下一行 `> 类型:人物专题 | 更新:YYYY-MM-DD | 数据截至:YYYY-MM-DD`。
108
+ - 事实以表为准,数字写视图块:`<!-- view:v_pref_count cols=n filter=person_id:p-1a2b3c4d --><!-- /view -->`(参数 `cols=` `filter=列:值`(`:me`=本人)`order=-列` `limit=` `format=value|table|list`;`_cents` 列自动转元),写入时自动填数。需要的视图没有就用 remember 建。视图要通用:输出 `person_id` 等列、在视图块里用 `filter=` 选人或选月,不要建 `v_<人名>_…` 这类把人物 ID 写死的专用视图;建之前先看 `context` 里有没有现成的同类视图。
109
+ - put 报 `WIKI_CONFLICT` 时重新 get 合并后再写。
110
+
111
+ ## 体检
112
+
113
+ 用户说"体检"时:`checkup` 先看,再 `checkup --fix`(补标准列注释、刷新视图块、补页头、修断链、更新 index、补检索索引,可 undo)。之后:只给自建表(`context` 的 `columns` 里核心表以外的表)缺的注释用一次 remember 补 `COMMENT ON`;核心表、导入表、系统表缺注释只在报告里写数量(留给代码同步),不逐列补、不去翻源码;对 `report`(疑似重复表、矛盾、过期页、人物画像页"数据截至"落后于整理游标 `wiki_behind_cursor`、归档、代码依赖断开、放错位置的档案事实 `misplaced_facts`)做判断;`misplaced_facts` 里确认是名片字段的,经用户同意后用一次 remember 搬到对应列或表并把原事实 `status` 改为 `retired`,没分类的补 `category`,只报告、不擅自改结构或删数据;把结论写入 `report_slug` 页并 `wiki log`,在聊天里给摘要。
114
+
115
+ ## 回答问题
116
+
117
+ 1. 按 `context` 的 Wiki 页面清单直接 `wiki get` 相关页(可一次取多页);Wiki 已能回答就直接答,并说明页头的"数据截至"。需要数字看 `context` 的视图注释,能用现成视图(`v_*`、`q_*`)就用;关键词、"什么时候说过"类问题用 `search`;其余写有界 `query`(聚合优先、只选需要的列、`$1` 绑定参数)。
118
+ 2. 消费问题遵守 [数据口径](references/数据口径.md):用 `v_spending` / `v_me_spending_monthly`,不要把订单、支付、银行流水相加;待确认、估算、金额未知单独说明。
119
+ 3. 先给结论,再说统计范围(时间段、用了哪个视图/表、排除了什么);结合 `context` 的覆盖范围说明"数据截至某日"。超出覆盖范围或没查到时说"当前数据里没有记录",不说"没有发生"。
120
+ 4. 关键结论(最大一笔、异常值)用 `query` 回读原始行核对。
@@ -0,0 +1,21 @@
1
+ # 安装与运行位置
2
+
3
+ 只有 `doctor` 报错或 Skill 找不到 CLI 时才需要读本文。
4
+
5
+ ## 组成
6
+
7
+ - **CLI**:npm 包 `@taopao/memoir`(命令名 `memoir`,Node.js 24+,任意平台),`npm install --global --ignore-scripts @taopao/memoir`,也可安装离线 tgz;说明见包内 README.md。Skill 的 `scripts/memoir.mjs` 只是转发器,实际执行 `memoir skill <命令>`。
8
+ - **数据库连接**:写在当前用户配置目录的 `database.json`(macOS `~/Library/Application Support/memoir`,Linux `~/.config/memoir`,Windows `%APPDATA%/memoir`;旧版 `relation-vault` 目录存在且新目录不存在时沿用旧目录),或环境变量 `MEMOIR_DATABASE_READONLY_URL`、`MEMOIR_DATABASE_OWNER_URL` 等。需要 `readonly`(查询)和 `owner`(记录、建表、撤回)两个连接;连接串和密码不放进 Skill、聊天或仓库。
9
+ - **Skill 目录**:各 Agent 的 Skill 目录不同(如 Codex 为 `~/.agents/skills`),把整个 `memoir` 目录放进去即可;更新后重新打开会话。
10
+
11
+ ## CLI 定位顺序
12
+
13
+ `scripts/memoir.mjs` 依次使用:环境变量 `MEMOIR_CLI`(CLI 入口绝对路径)→ Skill 目录下 `installation.json` 的 `entry`/`node`/`home` → 源码仓库相对位置(在仓库内直接使用时)。`MEMOIR_HOME` 可指定数据目录。旧名 `RELATION_VAULT_CLI`、`VAULT_HOME` 及其他 `VAULT_*` 环境变量仍可识别。
14
+
15
+ ## 自检
16
+
17
+ ```bash
18
+ node scripts/memoir.mjs doctor
19
+ ```
20
+
21
+ 逐项给出 Node 版本、两个连接、迁移版本、Skill 所需结构、本人是否登记;按每项 `hint` 处理。迁移需由用户安排执行(`memoir migrate`),Skill 不会自动迁移或备份。