memorylink 1.0.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 (870) hide show
  1. package/.cursorrules +0 -0
  2. package/.github/workflows/buddy-check.yml +105 -0
  3. package/.github/workflows/memorylink-preflight.yml +63 -0
  4. package/.github/workflows/release-on-tag.yml +58 -0
  5. package/.github/workflows/stress-tests.yml +79 -0
  6. package/.memorylinkignore +24 -0
  7. package/5000_SCENARIOS_TEST_RESULTS.md +174 -0
  8. package/ADVANCED_SCENARIOS_TEST_RESULTS.md +377 -0
  9. package/AGGRESSIVE_RANDOM_TEST_RESULTS.md +134 -0
  10. package/AI_CONSENSUS_ANALYSIS.md +138 -0
  11. package/AI_CONSENSUS_ANALYSIS_FINAL.md +345 -0
  12. package/AI_CONSENSUS_ANALYSIS_v2.md +188 -0
  13. package/AI_CONSENSUS_ANALYSIS_v3.md +246 -0
  14. package/AI_CONSENSUS_ANALYSIS_v4.md +309 -0
  15. package/AI_CONSENSUS_ANALYSIS_v5.md +311 -0
  16. package/AI_CONSENSUS_ANALYSIS_v6.md +432 -0
  17. package/AI_PANEL_CLARIFICATION_REQUEST.md +37 -0
  18. package/AI_RESPONSES_BLACKBOX.md +338 -0
  19. package/AI_RESPONSES_CHATGPT.md +379 -0
  20. package/AI_RESPONSES_CLAUDE.md +464 -0
  21. package/AI_RESPONSES_CONSOLIDATED.md +560 -0
  22. package/AI_RESPONSES_DEEPSEEK.md +341 -0
  23. package/AI_RESPONSES_GEMINI.md +262 -0
  24. package/AI_RESPONSES_GROK.md +335 -0
  25. package/AI_RESPONSES_MANUS.md +246 -0
  26. package/AI_RESPONSES_PERPLEXITY.md +295 -0
  27. package/AI_RESPONSES_QWEN.md +335 -0
  28. package/AI_REVIEW_REQUEST.md +333 -0
  29. package/AI_STRATEGIC_CONSENSUS_COMPARISON.md +507 -0
  30. package/AI_VALIDATION_AND_GAP_ANALYSIS.md +410 -0
  31. package/ALL_10_AI_RESPONSES_FINAL.md +435 -0
  32. package/ALL_3_AI_RESPONSES_FINAL.md +305 -0
  33. package/ALL_4_AI_RESPONSES_FINAL.md +335 -0
  34. package/ALL_5_AI_RESPONSES_FINAL.md +349 -0
  35. package/ALL_6_AI_RESPONSES_FINAL.md +354 -0
  36. package/ALL_7_AI_RESPONSES_FINAL.md +369 -0
  37. package/ALL_8_AI_RESPONSES_FINAL.md +381 -0
  38. package/ALL_9_AI_RESPONSES_FINAL.md +398 -0
  39. package/ALL_AI_RESPONSES_TRACKER.md +152 -0
  40. package/ALL_AI_RESPONSES_VALIDATED.md +261 -0
  41. package/ALL_FEATURES_COMPLETE.md +198 -0
  42. package/BREAK_IT_TEST_RESULTS.md +273 -0
  43. package/BUDDY_CHECK_STRESS_TEST_PLAN.md +1089 -0
  44. package/CHANGELOG.md +135 -0
  45. package/CHATGPT_GAP_ANALYSIS.md +286 -0
  46. package/CHATGPT_V2_ANALYSIS.md +109 -0
  47. package/CHECK_MISSING_FEATURES.md +192 -0
  48. package/CI_CD_INTEGRATION.md +421 -0
  49. package/COMPETITIVE_LAUNCH_STRATEGY.md +257 -0
  50. package/COMPLETE_COMPETITIVE_ANALYSIS_ALL_AIS.md +339 -0
  51. package/COMPLETE_DEVELOPMENT_PLAN_ALL_AIS.md +622 -0
  52. package/COMPREHENSIVE_FEATURE_ANALYSIS_100_PERCENT.md +423 -0
  53. package/COMPREHENSIVE_TEST_SUMMARY.md +314 -0
  54. package/CONTINUOUS_TESTING_COMPLETE.md +268 -0
  55. package/CONTINUOUS_TESTING_GUIDE.md +328 -0
  56. package/CONTINUOUS_TEST_FINAL_RESULTS.md +148 -0
  57. package/CONTINUOUS_TEST_INSTRUCTIONS.md +173 -0
  58. package/CONTINUOUS_TEST_RESULTS.md +194 -0
  59. package/CONTINUOUS_TEST_STATUS.md +68 -0
  60. package/CURSOR_AI_BUDDY_CHECK_GUIDE.md +439 -0
  61. package/CURSOR_AI_INTEGRATION_GUIDE.md +775 -0
  62. package/CURSOR_AI_V1.4_NEXT_STEPS.md +314 -0
  63. package/CURSOR_BREAK_IT_TEST.md +389 -0
  64. package/CURSOR_DOCUMENTATION_RULES.md +259 -0
  65. package/CURSOR_HOSTILE_TEST_DOCUMENT.md +343 -0
  66. package/CURSOR_PROMPTS_FOR_TESTING.md +252 -0
  67. package/DEPLOYMENT_GUIDE.md +493 -0
  68. package/DEVELOPMENT_AND_OVERNIGHT_TESTING.md +304 -0
  69. package/DEVELOPMENT_PROGRESS.md +185 -0
  70. package/DOCS_CLEANUP_SUMMARY.md +192 -0
  71. package/DOC_CONFIDENTIALITY_RULES.md +259 -0
  72. package/E2E_TEST_REPORT_v1.3.0.md +196 -0
  73. package/E2E_TEST_RESULTS.md +250 -0
  74. package/E2E_TEST_SCENARIOS.md +357 -0
  75. package/END_TO_END_TEST_REPORT.md +217 -0
  76. package/ENHANCEMENT_RECOMMENDATIONS.md +368 -0
  77. package/EPIPE_FIX_SUMMARY.md +177 -0
  78. package/FEEDBACK_TEMPLATE.md +173 -0
  79. package/FINAL_100_PERCENT_CONFIRMATION.md +319 -0
  80. package/FINAL_8_AI_CONSENSUS_SUMMARY.md +355 -0
  81. package/FINAL_CONFIRMATION.md +143 -0
  82. package/FINAL_E2E_TEST_REPORT.md +248 -0
  83. package/FINAL_E2E_TEST_RESULTS.md +212 -0
  84. package/FINAL_LAUNCH_CLARIFICATION_SUMMARY.md +101 -0
  85. package/FINAL_LAUNCH_PLAN_BASED_ON_AI_CONSENSUS.md +410 -0
  86. package/FINAL_LAUNCH_SUMMARY.md +176 -0
  87. package/FINAL_PRODUCT_TEST.md +316 -0
  88. package/FINAL_PROJECT_STATUS.md +407 -0
  89. package/FINAL_STATUS_REPORT.md +244 -0
  90. package/FINAL_STRATEGIC_PLAN_9_AIS.md +576 -0
  91. package/FINAL_TEST_EXECUTION_REPORT.md +252 -0
  92. package/FINAL_VALIDATION_DOCUMENT.md +238 -0
  93. package/FINAL_VALIDATION_SUMMARY.md +230 -0
  94. package/FIX_SPECIAL_CHARS.sh +13 -0
  95. package/FRESH_SCENARIOS_TEST_RESULTS.md +358 -0
  96. package/GAP_EVALUATION_TEMPLATE.md +146 -0
  97. package/GITHUB_SETUP_GUIDE.md +193 -0
  98. package/HOSTILE_TEST_RESULTS.md +221 -0
  99. package/HOW_MEMORYLINK_HELPS_AI.md +401 -0
  100. package/IMPLEMENTATION_PLANS_DETAILED.md +516 -0
  101. package/LAUNCH_CHECKLIST.md +247 -0
  102. package/LAUNCH_DOCS_FRAMEWORK.md +378 -0
  103. package/LAUNCH_READINESS.md +148 -0
  104. package/LAUNCH_SEQUENCE.md +137 -0
  105. package/LICENSE +67 -0
  106. package/MARKET_ANALYSIS_AND_STRATEGY.md +280 -0
  107. package/MASTER_AI_VERIFICATION_DOCUMENT.md +1085 -0
  108. package/MASTER_VALIDATION_DOCUMENT.md +818 -0
  109. package/MINORITY_OPINION_ANALYSIS.md +464 -0
  110. package/NEW_RANDOM_TEST_RESULTS.md +127 -0
  111. package/NEW_SCENARIOS_TEST_RESULTS.md +272 -0
  112. package/NEXT_ACTIONS_COMPLETE.md +137 -0
  113. package/NEXT_PLAN_BASED_ON_AI_ANALYSES.md +413 -0
  114. package/NEXT_PLAN_BASED_ON_ALL_AI_RESPONSES.md +558 -0
  115. package/NEXT_STEPS.md +120 -0
  116. package/NEXT_STEPS_ACTION_PLAN.md +369 -0
  117. package/NPM_2FA_FIX.md +113 -0
  118. package/NPM_PUBLISH_TROUBLESHOOTING.md +230 -0
  119. package/PERPLEXITY_AI_VALIDATION_REQUEST.md +318 -0
  120. package/PERPLEXITY_AI_VALIDATION_RESPONSE.md +172 -0
  121. package/PERPLEXITY_BREAK_IT_VALIDATION.md +262 -0
  122. package/PERPLEXITY_DOCS_VALIDATION.md +237 -0
  123. package/PERPLEXITY_FEEDBACK_ACTION_PLAN.md +271 -0
  124. package/PERPLEXITY_FINAL_E2E_VALIDATION.md +210 -0
  125. package/PERPLEXITY_FINAL_SUMMARY.md +211 -0
  126. package/PERPLEXITY_PHASE2_VALIDATION.md +270 -0
  127. package/PERPLEXITY_PHASE2_VALIDATION_RESPONSE.md +136 -0
  128. package/PERPLEXITY_PRIORITY2_VALIDATION.md +321 -0
  129. package/PERPLEXITY_TELEMETRY_EXPLANATION.md +174 -0
  130. package/PERPLEXITY_TELEMETRY_VALIDATION.md +118 -0
  131. package/PERPLEXITY_TELEMETRY_VALIDATION_RESPONSE.md +154 -0
  132. package/PERPLEXITY_USER_GUIDE_VALIDATION.md +236 -0
  133. package/PERPLEXITY_VALIDATION_REQUEST.md +427 -0
  134. package/PERPLEXITY_VALIDATION_REQUEST_v1.5.1.md +190 -0
  135. package/PHASE_2_COMPLETE.md +149 -0
  136. package/PRE_LAUNCH_SECURITY_AUDIT.md +155 -0
  137. package/PRE_LAUNCH_TEST_CYCLE.md +326 -0
  138. package/PRE_LAUNCH_TEST_RESULTS.md +148 -0
  139. package/PROJECT_STRUCTURE_PLAN.md +104 -0
  140. package/PUBLIC_DOCS.md +90 -0
  141. package/PUBLISH_CHECKLIST.md +134 -0
  142. package/PUSH_INSTRUCTIONS.md +120 -0
  143. package/QUICK_START_TEST_CYCLE.md +76 -0
  144. package/README.md +557 -0
  145. package/README_TEST_INSTRUCTIONS.md +65 -0
  146. package/README_v1.5.1.md +137 -0
  147. package/REALISTIC_ASSESSMENT.md +186 -0
  148. package/REAL_WORLD_VALIDATION_COMPLETE.md +98 -0
  149. package/RED_TEAM_TESTING_GUIDE.md +302 -0
  150. package/RELEASE_NOTES_v1.0.0.md +125 -0
  151. package/RELEASE_NOTES_v1.5.1.md +105 -0
  152. package/REQUEST_COUNTERS.md +22 -0
  153. package/ROADMAP_v1.6.md +335 -0
  154. package/ROUND3_RANDOM_TEST_RESULTS.md +135 -0
  155. package/SECURITY_MODEL.md +577 -0
  156. package/SESSION_SUMMARY_CURRENT_STATE.md +206 -0
  157. package/SESSION_SUMMARY_REVIEW.md +203 -0
  158. package/SINGLE_RUN_ALL_SCENARIOS_TEST.sh +129 -0
  159. package/STRATEGIC_QUESTIONS_FOR_AI_VALIDATION.md +277 -0
  160. package/STRESS_TEST_CHECK_RESULTS.md +154 -0
  161. package/STRESS_TEST_EXECUTION_GUIDE.md +284 -0
  162. package/STRESS_TEST_IMPLEMENTATION_SUMMARY.md +221 -0
  163. package/TELEMETRY.md +370 -0
  164. package/TELEMETRY_COMPLETE_SUMMARY.md +231 -0
  165. package/TELEMETRY_CONTROL_POLICY.md +135 -0
  166. package/TELEMETRY_DESIGN_SUMMARY.md +210 -0
  167. package/TELEMETRY_FINAL_STATUS.md +178 -0
  168. package/TELEMETRY_NEXT_STEPS.md +258 -0
  169. package/TELEMETRY_TESTING_NOTES.md +217 -0
  170. package/TELEMETRY_WORK_COMPLETE.md +237 -0
  171. package/TEST_PLAN_v1.0.1.md +194 -0
  172. package/TEST_RESULTS_SUMMARY.md +128 -0
  173. package/TREE_SITTER_EXPLANATION.md +303 -0
  174. package/TROUBLESHOOTING.md +62 -0
  175. package/ULTIMATE_SCENARIOS_TEST_RESULTS.md +366 -0
  176. package/USER_FEEDBACK_TEMPLATE.md +104 -0
  177. package/USER_GUIDE.md +809 -0
  178. package/V1.1_DEVELOPMENT_COMPLETE.md +299 -0
  179. package/V1.1_SCENARIOS_ADDED.md +161 -0
  180. package/V1.2_CODE_STRUCTURE_IMPLEMENTATION.md +243 -0
  181. package/V1.3_COMPETITIVE_LAUNCH_COMPLETE.md +253 -0
  182. package/V1.3_COMPETITIVE_LAUNCH_IMPLEMENTATION_PLAN.md +385 -0
  183. package/V1.3_TEAM_PATTERNS_IMPLEMENTATION.md +183 -0
  184. package/V1.4_BUILD_PLAN_IMPLEMENTATION.md +698 -0
  185. package/V1.4_COMPLETE_SUMMARY_FOR_AI_REVIEW.md +516 -0
  186. package/V1.4_COMPLETE_VALIDATION_DOCUMENT.md +601 -0
  187. package/V1.4_DEVELOPMENT_PROGRESS.md +117 -0
  188. package/V1.4_FINAL_STATUS.md +147 -0
  189. package/V1.4_INTEGRATION_COMPLETE.md +207 -0
  190. package/V1.4_INTEGRATION_TEST_RESULTS.md +181 -0
  191. package/V1.4_OBSERVABILITY_AND_OVERRIDE_COMPLETE.md +180 -0
  192. package/V1.4_PHASE_3_COMPLETE.md +135 -0
  193. package/V1.4_RUNTIME_TESTING_GUIDE.md +364 -0
  194. package/V1.4_VERIFICATION_REPORT.md +199 -0
  195. package/V1.5.1_COMPLETE_SUMMARY.md +234 -0
  196. package/V1.5.1_RELEASE_NOTES.md +206 -0
  197. package/V1.5.1_RELEASE_READY.md +198 -0
  198. package/V1.5_COMPLETE_SUMMARY.md +264 -0
  199. package/V1.5_COMPLETE_VERIFICATION.md +183 -0
  200. package/V1.5_DESIGN_NOTES.md +272 -0
  201. package/V1.5_FINAL_STATUS.md +224 -0
  202. package/V1.5_IMPLEMENTATION_SUMMARY.md +113 -0
  203. package/V1.5_IMPROVEMENTS_COMPLETE.md +205 -0
  204. package/V1.5_PHASE1_COMPLETE.md +183 -0
  205. package/V1.5_PHASE1_PROGRESS.md +102 -0
  206. package/V1.5_PHASE2_COMPLETE.md +133 -0
  207. package/V1.5_PHASE2_PLAN.md +185 -0
  208. package/V1.5_PRIORITIZATION.md +313 -0
  209. package/V1.5_PRIORITY2_COMPLETE.md +150 -0
  210. package/V1.5_TESTING_COMPLETE.md +69 -0
  211. package/V1.5_TEST_RESULTS.md +178 -0
  212. package/V1.5_VALIDATION_RESULTS.md +209 -0
  213. package/V1.6_GAP_TRACKING.md +118 -0
  214. package/VALIDATION_SUMMARY_FOR_PERPLEXITY.md +83 -0
  215. package/VERIFICATION_REPORT.md +220 -0
  216. package/VERSION_UPDATE_VERIFICATION.md +76 -0
  217. package/config/tsconfig.json +21 -0
  218. package/dist/cli.d.ts +9 -0
  219. package/dist/cli.d.ts.map +1 -0
  220. package/dist/cli.js +1114 -0
  221. package/dist/cli.js.map +1 -0
  222. package/dist/commands/archive.d.ts +20 -0
  223. package/dist/commands/archive.d.ts.map +1 -0
  224. package/dist/commands/archive.js +231 -0
  225. package/dist/commands/archive.js.map +1 -0
  226. package/dist/commands/auto-context.d.ts +22 -0
  227. package/dist/commands/auto-context.d.ts.map +1 -0
  228. package/dist/commands/auto-context.js +172 -0
  229. package/dist/commands/auto-context.js.map +1 -0
  230. package/dist/commands/auto-log.d.ts +30 -0
  231. package/dist/commands/auto-log.d.ts.map +1 -0
  232. package/dist/commands/auto-log.js +500 -0
  233. package/dist/commands/auto-log.js.map +1 -0
  234. package/dist/commands/change.d.ts +13 -0
  235. package/dist/commands/change.d.ts.map +1 -0
  236. package/dist/commands/change.js +254 -0
  237. package/dist/commands/change.js.map +1 -0
  238. package/dist/commands/checkpoint.d.ts +26 -0
  239. package/dist/commands/checkpoint.d.ts.map +1 -0
  240. package/dist/commands/checkpoint.js +326 -0
  241. package/dist/commands/checkpoint.js.map +1 -0
  242. package/dist/commands/configure.d.ts +21 -0
  243. package/dist/commands/configure.d.ts.map +1 -0
  244. package/dist/commands/configure.js +283 -0
  245. package/dist/commands/configure.js.map +1 -0
  246. package/dist/commands/consolidate.d.ts +19 -0
  247. package/dist/commands/consolidate.d.ts.map +1 -0
  248. package/dist/commands/consolidate.js +236 -0
  249. package/dist/commands/consolidate.js.map +1 -0
  250. package/dist/commands/context.d.ts +10 -0
  251. package/dist/commands/context.d.ts.map +1 -0
  252. package/dist/commands/context.js +571 -0
  253. package/dist/commands/context.js.map +1 -0
  254. package/dist/commands/detect.d.ts +13 -0
  255. package/dist/commands/detect.d.ts.map +1 -0
  256. package/dist/commands/detect.js +187 -0
  257. package/dist/commands/detect.js.map +1 -0
  258. package/dist/commands/doctor.d.ts +19 -0
  259. package/dist/commands/doctor.d.ts.map +1 -0
  260. package/dist/commands/doctor.js +1272 -0
  261. package/dist/commands/doctor.js.map +1 -0
  262. package/dist/commands/export.d.ts +3 -0
  263. package/dist/commands/export.d.ts.map +1 -0
  264. package/dist/commands/export.js +95 -0
  265. package/dist/commands/export.js.map +1 -0
  266. package/dist/commands/graph.d.ts +25 -0
  267. package/dist/commands/graph.d.ts.map +1 -0
  268. package/dist/commands/graph.js +208 -0
  269. package/dist/commands/graph.js.map +1 -0
  270. package/dist/commands/hooks.d.ts +9 -0
  271. package/dist/commands/hooks.d.ts.map +1 -0
  272. package/dist/commands/hooks.js +240 -0
  273. package/dist/commands/hooks.js.map +1 -0
  274. package/dist/commands/impact.d.ts +18 -0
  275. package/dist/commands/impact.d.ts.map +1 -0
  276. package/dist/commands/impact.js +163 -0
  277. package/dist/commands/impact.js.map +1 -0
  278. package/dist/commands/index-vector.d.ts +13 -0
  279. package/dist/commands/index-vector.d.ts.map +1 -0
  280. package/dist/commands/index-vector.js +103 -0
  281. package/dist/commands/index-vector.js.map +1 -0
  282. package/dist/commands/index.d.ts +37 -0
  283. package/dist/commands/index.d.ts.map +1 -0
  284. package/dist/commands/index.js +105 -0
  285. package/dist/commands/index.js.map +1 -0
  286. package/dist/commands/init.d.ts +8 -0
  287. package/dist/commands/init.d.ts.map +1 -0
  288. package/dist/commands/init.js +200 -0
  289. package/dist/commands/init.js.map +1 -0
  290. package/dist/commands/inject.d.ts +22 -0
  291. package/dist/commands/inject.d.ts.map +1 -0
  292. package/dist/commands/inject.js +394 -0
  293. package/dist/commands/inject.js.map +1 -0
  294. package/dist/commands/learn.d.ts +13 -0
  295. package/dist/commands/learn.d.ts.map +1 -0
  296. package/dist/commands/learn.js +282 -0
  297. package/dist/commands/learn.js.map +1 -0
  298. package/dist/commands/lock.d.ts +35 -0
  299. package/dist/commands/lock.d.ts.map +1 -0
  300. package/dist/commands/lock.js +308 -0
  301. package/dist/commands/lock.js.map +1 -0
  302. package/dist/commands/memory.d.ts +15 -0
  303. package/dist/commands/memory.d.ts.map +1 -0
  304. package/dist/commands/memory.js +366 -0
  305. package/dist/commands/memory.js.map +1 -0
  306. package/dist/commands/migrate.d.ts +22 -0
  307. package/dist/commands/migrate.d.ts.map +1 -0
  308. package/dist/commands/migrate.js +458 -0
  309. package/dist/commands/migrate.js.map +1 -0
  310. package/dist/commands/patterns.d.ts +18 -0
  311. package/dist/commands/patterns.d.ts.map +1 -0
  312. package/dist/commands/patterns.js +120 -0
  313. package/dist/commands/patterns.js.map +1 -0
  314. package/dist/commands/protect.d.ts +12 -0
  315. package/dist/commands/protect.d.ts.map +1 -0
  316. package/dist/commands/protect.js +181 -0
  317. package/dist/commands/protect.js.map +1 -0
  318. package/dist/commands/quickstart.d.ts +11 -0
  319. package/dist/commands/quickstart.d.ts.map +1 -0
  320. package/dist/commands/quickstart.js +256 -0
  321. package/dist/commands/quickstart.js.map +1 -0
  322. package/dist/commands/repair.d.ts +13 -0
  323. package/dist/commands/repair.d.ts.map +1 -0
  324. package/dist/commands/repair.js +157 -0
  325. package/dist/commands/repair.js.map +1 -0
  326. package/dist/commands/resolve.d.ts +19 -0
  327. package/dist/commands/resolve.d.ts.map +1 -0
  328. package/dist/commands/resolve.js +355 -0
  329. package/dist/commands/resolve.js.map +1 -0
  330. package/dist/commands/roadmap.d.ts +5 -0
  331. package/dist/commands/roadmap.d.ts.map +1 -0
  332. package/dist/commands/roadmap.js +23 -0
  333. package/dist/commands/roadmap.js.map +1 -0
  334. package/dist/commands/scopes.d.ts +10 -0
  335. package/dist/commands/scopes.d.ts.map +1 -0
  336. package/dist/commands/scopes.js +80 -0
  337. package/dist/commands/scopes.js.map +1 -0
  338. package/dist/commands/search.d.ts +9 -0
  339. package/dist/commands/search.d.ts.map +1 -0
  340. package/dist/commands/search.js +313 -0
  341. package/dist/commands/search.js.map +1 -0
  342. package/dist/commands/setup.d.ts +13 -0
  343. package/dist/commands/setup.d.ts.map +1 -0
  344. package/dist/commands/setup.js +405 -0
  345. package/dist/commands/setup.js.map +1 -0
  346. package/dist/commands/snippet.d.ts +23 -0
  347. package/dist/commands/snippet.d.ts.map +1 -0
  348. package/dist/commands/snippet.js +235 -0
  349. package/dist/commands/snippet.js.map +1 -0
  350. package/dist/commands/stats.d.ts +15 -0
  351. package/dist/commands/stats.d.ts.map +1 -0
  352. package/dist/commands/stats.js +502 -0
  353. package/dist/commands/stats.js.map +1 -0
  354. package/dist/commands/status.d.ts +8 -0
  355. package/dist/commands/status.d.ts.map +1 -0
  356. package/dist/commands/status.js +134 -0
  357. package/dist/commands/status.js.map +1 -0
  358. package/dist/commands/suggest-tags.d.ts +9 -0
  359. package/dist/commands/suggest-tags.d.ts.map +1 -0
  360. package/dist/commands/suggest-tags.js +95 -0
  361. package/dist/commands/suggest-tags.js.map +1 -0
  362. package/dist/commands/sync-rules.d.ts +14 -0
  363. package/dist/commands/sync-rules.d.ts.map +1 -0
  364. package/dist/commands/sync-rules.js +211 -0
  365. package/dist/commands/sync-rules.js.map +1 -0
  366. package/dist/commands/sync.d.ts +24 -0
  367. package/dist/commands/sync.d.ts.map +1 -0
  368. package/dist/commands/sync.js +330 -0
  369. package/dist/commands/sync.js.map +1 -0
  370. package/dist/commands/telemetry-test.d.ts +24 -0
  371. package/dist/commands/telemetry-test.d.ts.map +1 -0
  372. package/dist/commands/telemetry-test.js +84 -0
  373. package/dist/commands/telemetry-test.js.map +1 -0
  374. package/dist/commands/template.d.ts +16 -0
  375. package/dist/commands/template.d.ts.map +1 -0
  376. package/dist/commands/template.js +122 -0
  377. package/dist/commands/template.js.map +1 -0
  378. package/dist/commands/validate.d.ts +11 -0
  379. package/dist/commands/validate.d.ts.map +1 -0
  380. package/dist/commands/validate.js +144 -0
  381. package/dist/commands/validate.js.map +1 -0
  382. package/dist/commands/watch-preferences.d.ts +17 -0
  383. package/dist/commands/watch-preferences.d.ts.map +1 -0
  384. package/dist/commands/watch-preferences.js +172 -0
  385. package/dist/commands/watch-preferences.js.map +1 -0
  386. package/dist/commands/watch.d.ts +11 -0
  387. package/dist/commands/watch.d.ts.map +1 -0
  388. package/dist/commands/watch.js +223 -0
  389. package/dist/commands/watch.js.map +1 -0
  390. package/dist/config/thresholds.d.ts +8 -0
  391. package/dist/config/thresholds.d.ts.map +1 -0
  392. package/dist/config/thresholds.js +10 -0
  393. package/dist/config/thresholds.js.map +1 -0
  394. package/dist/index.d.ts +9 -0
  395. package/dist/index.d.ts.map +1 -0
  396. package/dist/index.js +31 -0
  397. package/dist/index.js.map +1 -0
  398. package/dist/memorylink.d.ts +91 -0
  399. package/dist/memorylink.d.ts.map +1 -0
  400. package/dist/memorylink.js +208 -0
  401. package/dist/memorylink.js.map +1 -0
  402. package/dist/search/local-embeddings.d.ts +21 -0
  403. package/dist/search/local-embeddings.d.ts.map +1 -0
  404. package/dist/search/local-embeddings.js +87 -0
  405. package/dist/search/local-embeddings.js.map +1 -0
  406. package/dist/search/vector-search.d.ts +58 -0
  407. package/dist/search/vector-search.d.ts.map +1 -0
  408. package/dist/search/vector-search.js +535 -0
  409. package/dist/search/vector-search.js.map +1 -0
  410. package/dist/server/mcp-server.d.ts +18 -0
  411. package/dist/server/mcp-server.d.ts.map +1 -0
  412. package/dist/server/mcp-server.js +293 -0
  413. package/dist/server/mcp-server.js.map +1 -0
  414. package/dist/telemetry.d.ts +92 -0
  415. package/dist/telemetry.d.ts.map +1 -0
  416. package/dist/telemetry.js +339 -0
  417. package/dist/telemetry.js.map +1 -0
  418. package/dist/telemetry.test.d.ts +13 -0
  419. package/dist/telemetry.test.d.ts.map +1 -0
  420. package/dist/telemetry.test.js +324 -0
  421. package/dist/telemetry.test.js.map +1 -0
  422. package/dist/test-runner/TestRunner.d.ts +68 -0
  423. package/dist/test-runner/TestRunner.d.ts.map +1 -0
  424. package/dist/test-runner/TestRunner.js +384 -0
  425. package/dist/test-runner/TestRunner.js.map +1 -0
  426. package/dist/test-runner/performance-test.d.ts +36 -0
  427. package/dist/test-runner/performance-test.d.ts.map +1 -0
  428. package/dist/test-runner/performance-test.js +163 -0
  429. package/dist/test-runner/performance-test.js.map +1 -0
  430. package/dist/test-runner/run-tests.d.ts +7 -0
  431. package/dist/test-runner/run-tests.d.ts.map +1 -0
  432. package/dist/test-runner/run-tests.js +167 -0
  433. package/dist/test-runner/run-tests.js.map +1 -0
  434. package/dist/types.d.ts +400 -0
  435. package/dist/types.d.ts.map +1 -0
  436. package/dist/types.js +81 -0
  437. package/dist/types.js.map +1 -0
  438. package/dist/utils/batch-commits.d.ts +48 -0
  439. package/dist/utils/batch-commits.d.ts.map +1 -0
  440. package/dist/utils/batch-commits.js +164 -0
  441. package/dist/utils/batch-commits.js.map +1 -0
  442. package/dist/utils/code-structure.d.ts +62 -0
  443. package/dist/utils/code-structure.d.ts.map +1 -0
  444. package/dist/utils/code-structure.js +582 -0
  445. package/dist/utils/code-structure.js.map +1 -0
  446. package/dist/utils/commit-patterns.d.ts +24 -0
  447. package/dist/utils/commit-patterns.d.ts.map +1 -0
  448. package/dist/utils/commit-patterns.js +78 -0
  449. package/dist/utils/commit-patterns.js.map +1 -0
  450. package/dist/utils/observability.d.ts +47 -0
  451. package/dist/utils/observability.d.ts.map +1 -0
  452. package/dist/utils/observability.js +137 -0
  453. package/dist/utils/observability.js.map +1 -0
  454. package/dist/utils/quality.d.ts +32 -0
  455. package/dist/utils/quality.d.ts.map +1 -0
  456. package/dist/utils/quality.js +207 -0
  457. package/dist/utils/quality.js.map +1 -0
  458. package/dist/utils/semantic-search.d.ts +29 -0
  459. package/dist/utils/semantic-search.d.ts.map +1 -0
  460. package/dist/utils/semantic-search.js +167 -0
  461. package/dist/utils/semantic-search.js.map +1 -0
  462. package/dist/utils/streaming.d.ts +24 -0
  463. package/dist/utils/streaming.d.ts.map +1 -0
  464. package/dist/utils/streaming.js +121 -0
  465. package/dist/utils/streaming.js.map +1 -0
  466. package/dist/utils/tag-suggestions.d.ts +18 -0
  467. package/dist/utils/tag-suggestions.d.ts.map +1 -0
  468. package/dist/utils/tag-suggestions.js +103 -0
  469. package/dist/utils/tag-suggestions.js.map +1 -0
  470. package/dist/utils/team-patterns.d.ts +48 -0
  471. package/dist/utils/team-patterns.d.ts.map +1 -0
  472. package/dist/utils/team-patterns.js +413 -0
  473. package/dist/utils/team-patterns.js.map +1 -0
  474. package/dist/utils/templates.d.ts +36 -0
  475. package/dist/utils/templates.d.ts.map +1 -0
  476. package/dist/utils/templates.js +200 -0
  477. package/dist/utils/templates.js.map +1 -0
  478. package/dist/utils/tree-sitter-parser.d.ts +20 -0
  479. package/dist/utils/tree-sitter-parser.d.ts.map +1 -0
  480. package/dist/utils/tree-sitter-parser.js +259 -0
  481. package/dist/utils/tree-sitter-parser.js.map +1 -0
  482. package/dist/utils/v1.6-patterns.d.ts +117 -0
  483. package/dist/utils/v1.6-patterns.d.ts.map +1 -0
  484. package/dist/utils/v1.6-patterns.js +201 -0
  485. package/dist/utils/v1.6-patterns.js.map +1 -0
  486. package/dist/utils.d.ts +176 -0
  487. package/dist/utils.d.ts.map +1 -0
  488. package/dist/utils.js +822 -0
  489. package/dist/utils.js.map +1 -0
  490. package/docs/1000_SCENARIOS_TEST_RESULTS.md +138 -0
  491. package/docs/1000_UNIQUE_SCENARIOS_TEST.md +171 -0
  492. package/docs/100_PERCENT_PASS_RATE_VERIFICATION.md +111 -0
  493. package/docs/5000_SCENARIOS_ISSUE_ANALYSIS.md +96 -0
  494. package/docs/5000_SCENARIOS_TEST_PLAN.md +281 -0
  495. package/docs/AGENT_CONTRACT.md +240 -0
  496. package/docs/AI_RESPONSE_ANALYZER.md +157 -0
  497. package/docs/AI_RESPONSE_TRACKER.md +923 -0
  498. package/docs/AI_TESTING_PROMPT.md +307 -0
  499. package/docs/AI_VALIDATION_PROMPTS.md +366 -0
  500. package/docs/ALL_AI_ANALYSES_CONSOLIDATED.md +354 -0
  501. package/docs/ALL_AI_CONSOLIDATION_FINAL.md +372 -0
  502. package/docs/ALL_AI_TEST_CONSOLIDATION.md +290 -0
  503. package/docs/ALL_AI_VALIDATION_SYNTHESIS.md +241 -0
  504. package/docs/BEST_TESTING_SOLUTION.md +227 -0
  505. package/docs/BLACKBOX_AI_ANALYSIS.md +288 -0
  506. package/docs/BLACKBOX_AI_CLARIFICATION.md +55 -0
  507. package/docs/BLACKBOX_AI_STRATEGIC_VALIDATION.md +283 -0
  508. package/docs/BLACKBOX_AI_VALIDATION_RESPONSE.md +251 -0
  509. package/docs/BLACKBOX_AI_VALIDATION_RESPONSE_v2.md +402 -0
  510. package/docs/BLACKBOX_LAUNCH_VALIDATION.md +25 -0
  511. package/docs/BLACKBOX_SUPERMEMORY_VALIDATION_AND_PLAN.md +50 -0
  512. package/docs/CAPACITY_AND_ALTERNATIVES_ANALYSIS.md +289 -0
  513. package/docs/CHATGPT_AI_CLARIFICATION.md +65 -0
  514. package/docs/CHATGPT_FINAL_VALIDATION.md +348 -0
  515. package/docs/CHATGPT_IMPLEMENTATION_GUIDE.md +325 -0
  516. package/docs/CHATGPT_LAUNCH_VALIDATION.md +47 -0
  517. package/docs/CHATGPT_MEMORY_QUALITY_AND_VSCODE_CHECK.md +43 -0
  518. package/docs/CHATGPT_SCOPE_REALITY_CHECK.md +35 -0
  519. package/docs/CHATGPT_STRATEGIC_VALIDATION.md +329 -0
  520. package/docs/CHATGPT_VALIDATION_RESPONSE.md +332 -0
  521. package/docs/CHATGPT_VALIDATION_RESPONSE_v2.md +294 -0
  522. package/docs/CHATGPT_VALIDATION_RESULTS.md +143 -0
  523. package/docs/CLAUDE_AI_ANALYSIS.md +692 -0
  524. package/docs/CLAUDE_AI_CLARIFICATION.md +67 -0
  525. package/docs/CLAUDE_AI_STRATEGIC_VALIDATION.md +578 -0
  526. package/docs/CLAUDE_AI_VALIDATION_RESPONSE.md +374 -0
  527. package/docs/CLAUDE_AI_VALIDATION_RESPONSE_v2.md +463 -0
  528. package/docs/CLAUDE_FINAL_VALIDATION.md +679 -0
  529. package/docs/CLAUDE_LAUNCH_VALIDATION.md +27 -0
  530. package/docs/CLAUDE_SUPERMEMORY_LAUNCH_PRIORITIES.md +44 -0
  531. package/docs/CLAUDE_UNIVERSAL_VISION.md +18 -0
  532. package/docs/COMPLETE_AI_VALIDATION_SYNTHESIS.md +229 -0
  533. package/docs/COMPLETE_MEMORY_ANALYSIS_SUMMARY.md +323 -0
  534. package/docs/COMPLETE_STRATEGIC_LAUNCH_PLAN.md +241 -0
  535. package/docs/COPILOT_LANGCHAIN_MEMORY_COMPARISON_AND_PLAN.md +43 -0
  536. package/docs/CRITICAL_FIXES_ACTION_PLAN.md +251 -0
  537. package/docs/CRITICAL_MEMORY_USAGE_PROMPTS.md +290 -0
  538. package/docs/CURSOR_AI_MEMORY_ANALYSIS.md +479 -0
  539. package/docs/CURSOR_AI_MEMORY_WORKFLOW_ANALYSIS.md +267 -0
  540. package/docs/CURSOR_AI_TEST_RESULTS.md +298 -0
  541. package/docs/DEEPSEEK_AI_CLARIFICATION.md +52 -0
  542. package/docs/DEEPSEEK_AI_IMPLEMENTATION_GUIDE.md +398 -0
  543. package/docs/DEEPSEEK_AI_STRATEGIC_VALIDATION.md +348 -0
  544. package/docs/DEEPSEEK_AI_VALIDATION_RESPONSE.md +276 -0
  545. package/docs/DEEPSEEK_AI_VALIDATION_RESPONSE_v2.md +325 -0
  546. package/docs/DEEPSEEK_FINAL_VALIDATION.md +337 -0
  547. package/docs/DEEPSEEK_LAUNCH_VALIDATION.md +55 -0
  548. package/docs/DEEPSEEK_SCOPE_REALITY_CHECK.md +30 -0
  549. package/docs/DEEPSEEK_SUPERMEMORY_ADOPTION_AND_VSCODE_PIVOT.md +47 -0
  550. package/docs/DEEPSEEK_VALIDATION_RESULTS.md +165 -0
  551. package/docs/DEVELOPMENT_TESTING_PROTOCOL.md +378 -0
  552. package/docs/E2E_TEST_RESULTS.md +102 -0
  553. package/docs/END_TO_END_MEMORY_ISSUE_ANALYSIS.md +442 -0
  554. package/docs/FEATURE_1_GIT_SYNC_PLAN.md +228 -0
  555. package/docs/FEATURE_2_AUTO_LOGGING_PLAN.md +239 -0
  556. package/docs/FEATURE_3_CODE_SNIPPET_PLAN.md +249 -0
  557. package/docs/FEATURE_4_TAG_NORMALIZATION_PLAN.md +211 -0
  558. package/docs/FEATURE_5_WINDOWS_PATH_HANDLING_PLAN.md +199 -0
  559. package/docs/FEATURE_6_CONFLICT_DETECTION_PLAN.md +126 -0
  560. package/docs/FEATURE_IMPLEMENTATION_REPORT.md +203 -0
  561. package/docs/FINAL_COMPLETE_LAUNCH_DECISION.md +255 -0
  562. package/docs/FINAL_LAUNCH_DECISION.md +235 -0
  563. package/docs/FINAL_LAUNCH_DECISION_ALL_AIS.md +226 -0
  564. package/docs/FINAL_SCENARIO_VERIFICATION.md +363 -0
  565. package/docs/FIX_100_PERCENT_ANALYSIS.md +133 -0
  566. package/docs/FRAMEWORK_STRUCTURE.md +94 -0
  567. package/docs/GEMINI_AI_ANALYSIS.md +156 -0
  568. package/docs/GEMINI_AI_CLARIFICATION.md +47 -0
  569. package/docs/GEMINI_AI_STRATEGIC_VALIDATION.md +235 -0
  570. package/docs/GEMINI_AI_VALIDATION_RESPONSE.md +238 -0
  571. package/docs/GEMINI_AI_VALIDATION_RESPONSE_v2.md +168 -0
  572. package/docs/GEMINI_FINAL_VALIDATION.md +204 -0
  573. package/docs/GEMINI_LAUNCH_VALIDATION.md +30 -0
  574. package/docs/GEMINI_SCOPE_AND_UNIVERSALITY_DEBATE.md +25 -0
  575. package/docs/GEMINI_SUPERMEMORY_TREE_SITTER_MANDATE.md +43 -0
  576. package/docs/GEMINI_VALIDATION_RESULTS.md +183 -0
  577. package/docs/GROK_AI_ANALYSIS.md +278 -0
  578. package/docs/GROK_AI_CLARIFICATION.md +52 -0
  579. package/docs/GROK_AI_STRATEGIC_VALIDATION.md +306 -0
  580. package/docs/GROK_AI_VALIDATION_RESPONSE.md +252 -0
  581. package/docs/GROK_AI_VALIDATION_RESPONSE_v2.md +264 -0
  582. package/docs/GROK_FINAL_VALIDATION.md +251 -0
  583. package/docs/GROK_LAUNCH_VALIDATION.md +24 -0
  584. package/docs/GROK_SCOPE_REALITY_CHECK.md +28 -0
  585. package/docs/GROK_SUPERMEMORY_LAUNCH_ANALYSIS.md +44 -0
  586. package/docs/GROK_VALIDATION_RESULTS.md +180 -0
  587. package/docs/IMPLEMENTATION_PLAN_16_CRITICAL_FIXES.md +641 -0
  588. package/docs/LANGCHAIN_AND_LANGGRAPH_INTEGRATION_PLAN.md +51 -0
  589. package/docs/LAUNCH_DECISION_FINAL.md +243 -0
  590. package/docs/MANUS_AI_ANALYSIS.md +171 -0
  591. package/docs/MANUS_AI_CLARIFICATION.md +43 -0
  592. package/docs/MANUS_AI_VALIDATION_RESPONSE.md +335 -0
  593. package/docs/MANUS_AI_VALIDATION_RESPONSE_v2.md +226 -0
  594. package/docs/MANUS_FINAL_VALIDATION.md +257 -0
  595. package/docs/MANUS_VALIDATION_RESULTS.md +237 -0
  596. package/docs/MCP_SERVER_SETUP.md +167 -0
  597. package/docs/MEMORYLINK_7AI_FINAL_CONFIRMATION.md +210 -0
  598. package/docs/MEMORYLINK_CURSOR_AI_DEVELOPMENT_GUIDE.md +1092 -0
  599. package/docs/MEMORYLINK_DEVELOPMENT_PLAN_CURSOR_AI.md +629 -0
  600. package/docs/MEMORYLINK_FINAL_7AI_CLARIFICATION.md +184 -0
  601. package/docs/MEMORYLINK_MASTER_DOCUMENT_v4.md +1338 -0
  602. package/docs/MEMORYLINK_NAMING_ANALYSIS.md +427 -0
  603. package/docs/MEMORYLINK_REAL_WORLD_SCENARIOS.md +3517 -0
  604. package/docs/MEMORYLINK_STORAGE_COMPARISON.md +498 -0
  605. package/docs/MEMORYLINK_V1.0_FINAL_IMPLEMENTATION_PLAN.md +285 -0
  606. package/docs/MEMORYLINK_VALIDATION_COMPLETE_ANALYSIS.md +207 -0
  607. package/docs/MEMORYLINK_VS_MEMORY_APPS_ANALYSIS.md +667 -0
  608. package/docs/MEMORYLINK_v1.0_BUILD_DOCUMENT_FINAL.md +1928 -0
  609. package/docs/MEMORY_USAGE_FIX_IMPLEMENTATION.md +314 -0
  610. package/docs/MISTRAL_AI_ANALYSIS.md +189 -0
  611. package/docs/MISTRAL_AI_CLARIFICATION.md +57 -0
  612. package/docs/MISTRAL_AI_STRATEGIC_VALIDATION.md +334 -0
  613. package/docs/MISTRAL_AI_TESTING_REQUEST.md +261 -0
  614. package/docs/MISTRAL_AI_VALIDATION_RESPONSE.md +446 -0
  615. package/docs/MISTRAL_AI_VALIDATION_RESPONSE_v2.md +227 -0
  616. package/docs/MISTRAL_FINAL_VALIDATION.md +398 -0
  617. package/docs/MISTRAL_LAUNCH_VALIDATION.md +32 -0
  618. package/docs/MISTRAL_SCOPE_REALITY_CHECK.md +32 -0
  619. package/docs/MISTRAL_SUPERMEMORY_LAUNCH_ANALYSIS.md +43 -0
  620. package/docs/MISTRAL_VALIDATION_RESULTS.md +371 -0
  621. package/docs/NEXT_PLAN.md +300 -0
  622. package/docs/PERPLEXITY_AI_ANALYSIS.md +285 -0
  623. package/docs/PERPLEXITY_AI_CLARIFICATION.md +57 -0
  624. package/docs/PERPLEXITY_AI_STRATEGIC_VALIDATION.md +288 -0
  625. package/docs/PERPLEXITY_AI_VALIDATION_RESPONSE.md +350 -0
  626. package/docs/PERPLEXITY_AI_VALIDATION_RESPONSE_v2.md +260 -0
  627. package/docs/PERPLEXITY_FINAL_VALIDATION.md +320 -0
  628. package/docs/PERPLEXITY_LAUNCH_VALIDATION.md +42 -0
  629. package/docs/PERPLEXITY_MEMORY_QUALITY_AND_VSCODE_PLAN.md +56 -0
  630. package/docs/PERPLEXITY_SCOPE_REALITY_CHECK.md +31 -0
  631. package/docs/PERPLEXITY_VALIDATION_RESULTS.md +154 -0
  632. package/docs/PRE_LAUNCH_GAP_ANALYSIS.md +663 -0
  633. package/docs/PROJECT_STRUCTURE_PLAN.md +104 -0
  634. package/docs/QWEN_AI_ANALYSIS.md +176 -0
  635. package/docs/QWEN_AI_CLARIFICATION.md +60 -0
  636. package/docs/QWEN_AI_STRATEGIC_VALIDATION.md +241 -0
  637. package/docs/QWEN_AI_VALIDATION_RESPONSE.md +197 -0
  638. package/docs/QWEN_AI_VALIDATION_RESPONSE_v2.md +186 -0
  639. package/docs/QWEN_FINAL_VALIDATION.md +284 -0
  640. package/docs/QWEN_LAUNCH_VALIDATION.md +26 -0
  641. package/docs/QWEN_SCENARIOS_TEST_RESULTS.md +244 -0
  642. package/docs/QWEN_SCOPE_REALITY_CHECK.md +26 -0
  643. package/docs/QWEN_SUPERMEMORY_LAUNCH_AND_ENFORCEMENT_PLAN.md +56 -0
  644. package/docs/QWEN_VALIDATION_RESULTS.md +185 -0
  645. package/docs/README.md +479 -0
  646. package/docs/REAL_PRODUCT_LAUNCH_DECISION.md +185 -0
  647. package/docs/RECIPES.md +424 -0
  648. package/docs/RELEASE_NOTES_v1.0.0.md +193 -0
  649. package/docs/SCENARIO_INVENTORY_AND_VERIFICATION.md +284 -0
  650. package/docs/SINGLE_RUN_1018_SCENARIOS_RESULTS.md +142 -0
  651. package/docs/TESTING.md +256 -0
  652. package/docs/TESTING_STRATEGY.md +194 -0
  653. package/docs/TROUBLESHOOTING.md +188 -0
  654. package/docs/ULTIMATE_LAUNCH_DECISION.md +246 -0
  655. package/docs/WHAT_WE_BUILT.md +504 -0
  656. package/docs/v1.0_LAUNCH_CHECKLIST.md +104 -0
  657. package/examples/README.md +199 -0
  658. package/examples/chatgpt-context.js +161 -0
  659. package/examples/ci-integration.js +288 -0
  660. package/examples/sync-from-cursor.js +196 -0
  661. package/extensions/vscode/README.md +25 -0
  662. package/extensions/vscode/out/buddy-check.js +208 -0
  663. package/extensions/vscode/out/buddy-check.js.map +1 -0
  664. package/extensions/vscode/out/extension.js +413 -0
  665. package/extensions/vscode/out/extension.js.map +1 -0
  666. package/extensions/vscode/out/sidebar.js +409 -0
  667. package/extensions/vscode/out/sidebar.js.map +1 -0
  668. package/extensions/vscode/package.json +92 -0
  669. package/extensions/vscode/src/buddy-check.ts +220 -0
  670. package/extensions/vscode/src/extension.ts +425 -0
  671. package/extensions/vscode/src/shims-vscode.d.ts +2 -0
  672. package/extensions/vscode/src/sidebar.ts +431 -0
  673. package/extensions/vscode/tsconfig.json +14 -0
  674. package/k6-load-test.js +86 -0
  675. package/package.json +68 -0
  676. package/run-professional-tests.sh +72 -0
  677. package/scripts/monitor-continuous-test.sh +17 -0
  678. package/scripts/reorganize-project.sh +164 -0
  679. package/scripts/run-tests-parallel.sh +111 -0
  680. package/scripts/run-tests.sh +30 -0
  681. package/scripts/setup-framework.sh +139 -0
  682. package/scripts/setup-testing.sh +96 -0
  683. package/scripts/stress-test/README.md +86 -0
  684. package/scripts/stress-test/create-all-scenarios.sh +17 -0
  685. package/scripts/stress-test/create-remaining-scenarios.sh +3 -0
  686. package/scripts/stress-test/dev-test.sh +21 -0
  687. package/scripts/stress-test/monitor-continuous.sh +149 -0
  688. package/scripts/stress-test/overnight-test.sh +30 -0
  689. package/scripts/stress-test/quick-test.sh +21 -0
  690. package/scripts/stress-test/run-all-tests.sh +157 -0
  691. package/scripts/stress-test/run-continuous.sh +300 -0
  692. package/scripts/stress-test/run-stress-test.sh +153 -0
  693. package/scripts/stress-test/set1/1_1_mass_refactoring.sh +117 -0
  694. package/scripts/stress-test/set1/1_1_mass_refactoring_simple.sh +117 -0
  695. package/scripts/stress-test/set1/1_2_function_rename.sh +95 -0
  696. package/scripts/stress-test/set1/1_3_feature_flags.sh +93 -0
  697. package/scripts/stress-test/set1/1_4_feature_removal.sh +57 -0
  698. package/scripts/stress-test/set1/1_5_schema_changes.sh +42 -0
  699. package/scripts/stress-test/set1/1_6_dependency_update.sh +47 -0
  700. package/scripts/stress-test/set1/1_7_config_modification.sh +53 -0
  701. package/scripts/stress-test/set2/2_1_payment_logging.sh +49 -0
  702. package/scripts/stress-test/set2/2_2_test_data_generation.sh +43 -0
  703. package/scripts/stress-test/set2/2_3_documentation_leak.sh +45 -0
  704. package/scripts/stress-test/set2/2_4_api_key_rotation.sh +45 -0
  705. package/scripts/stress-test/set2/2_5_hardcoded_secrets.sh +45 -0
  706. package/scripts/stress-test/set2/2_6_debug_output.sh +49 -0
  707. package/scripts/stress-test/set3/3_1_billing_modification.sh +47 -0
  708. package/scripts/stress-test/set3/3_2_migration_deletion.sh +43 -0
  709. package/scripts/stress-test/set3/3_3_auth_middleware.sh +52 -0
  710. package/scripts/stress-test/set3/3_4_permission_bypass.sh +48 -0
  711. package/scripts/stress-test/set3/3_5_config_modification.sh +43 -0
  712. package/scripts/stress-test/set3/3_6_core_library.sh +51 -0
  713. package/scripts/stress-test/set3/3_7_test_infrastructure.sh +49 -0
  714. package/scripts/stress-test/set4/4_1_concurrent_features.sh +49 -0
  715. package/scripts/stress-test/set4/4_2_lock_acquisition.sh +32 -0
  716. package/scripts/stress-test/set4/4_3_migration_hotfix.sh +43 -0
  717. package/scripts/stress-test/set4/4_4_overlapping_scopes.sh +50 -0
  718. package/scripts/stress-test/set4/4_5_lock_timeout.sh +34 -0
  719. package/scripts/stress-test/set4/4_6_concurrent_stats.sh +33 -0
  720. package/scripts/stress-test/set5/5_1_wrong_decision.sh +41 -0
  721. package/scripts/stress-test/set5/5_2_outdated_docs.sh +40 -0
  722. package/scripts/stress-test/set5/5_3_conflicting_memories.sh +34 -0
  723. package/scripts/stress-test/set5/5_4_deleted_file_references.sh +38 -0
  724. package/scripts/stress-test/set5/5_5_old_pattern.sh +41 -0
  725. package/scripts/stress-test/set5/5_6_wrong_architecture.sh +42 -0
  726. package/scripts/stress-test/set5/5_7_high_trust_stale.sh +46 -0
  727. package/scripts/stress-test/set5/5_8_observability_stale.sh +36 -0
  728. package/scripts/stress-test/setup-test-repo-simple.sh +144 -0
  729. package/scripts/stress-test/setup-test-repo.sh +154 -0
  730. package/scripts/stress-test/start-continuous.sh +48 -0
  731. package/scripts/stress-test/stop-continuous.sh +42 -0
  732. package/scripts/stress-test/template-scenario.sh +115 -0
  733. package/scripts/test-advanced-scenarios.sh +411 -0
  734. package/scripts/test-continuous-30min.sh +307 -0
  735. package/scripts/test-continuous-enhanced.sh +250 -0
  736. package/scripts/test-e2e-comprehensive.sh +114 -0
  737. package/scripts/test-e2e-random.sh +359 -0
  738. package/scripts/test-fresh-scenarios.sh +412 -0
  739. package/scripts/test-new-scenarios.sh +374 -0
  740. package/scripts/test-quick-random.sh +97 -0
  741. package/scripts/test-runtime.sh +129 -0
  742. package/scripts/test-telemetry-local.sh +193 -0
  743. package/scripts/test-ultimate-scenarios.sh +428 -0
  744. package/scripts/test-v1.5-complete.sh +225 -0
  745. package/scripts/test-v1.5-phase1.sh +222 -0
  746. package/src/cli.ts +1259 -0
  747. package/src/commands/archive.ts +252 -0
  748. package/src/commands/auto-context.ts +159 -0
  749. package/src/commands/auto-log.ts +531 -0
  750. package/src/commands/change.ts +298 -0
  751. package/src/commands/checkpoint.ts +390 -0
  752. package/src/commands/configure.ts +297 -0
  753. package/src/commands/consolidate.ts +263 -0
  754. package/src/commands/context.ts +618 -0
  755. package/src/commands/detect.ts +181 -0
  756. package/src/commands/doctor.ts +1468 -0
  757. package/src/commands/export.ts +77 -0
  758. package/src/commands/graph.ts +214 -0
  759. package/src/commands/hooks.ts +245 -0
  760. package/src/commands/impact.ts +163 -0
  761. package/src/commands/index-vector.ts +126 -0
  762. package/src/commands/index.ts +57 -0
  763. package/src/commands/init.ts +194 -0
  764. package/src/commands/inject.ts +440 -0
  765. package/src/commands/learn.ts +328 -0
  766. package/src/commands/lock.ts +345 -0
  767. package/src/commands/memory.ts +415 -0
  768. package/src/commands/migrate.ts +540 -0
  769. package/src/commands/patterns.ts +158 -0
  770. package/src/commands/protect.ts +199 -0
  771. package/src/commands/quickstart.ts +259 -0
  772. package/src/commands/resolve.ts +373 -0
  773. package/src/commands/roadmap.ts +25 -0
  774. package/src/commands/scopes.ts +113 -0
  775. package/src/commands/search.ts +365 -0
  776. package/src/commands/setup.ts +430 -0
  777. package/src/commands/snippet.ts +271 -0
  778. package/src/commands/stats.ts +591 -0
  779. package/src/commands/status.ts +127 -0
  780. package/src/commands/suggest-tags.ts +122 -0
  781. package/src/commands/sync-rules.ts +218 -0
  782. package/src/commands/sync.ts +363 -0
  783. package/src/commands/telemetry-test.ts +97 -0
  784. package/src/commands/template.ts +166 -0
  785. package/src/commands/validate.ts +191 -0
  786. package/src/commands/watch-preferences.ts +162 -0
  787. package/src/commands/watch.ts +239 -0
  788. package/src/config/thresholds.ts +14 -0
  789. package/src/index.ts +12 -0
  790. package/src/memorylink.ts +308 -0
  791. package/src/search/local-embeddings.ts +94 -0
  792. package/src/search/vector-search.ts +608 -0
  793. package/src/server/mcp-server.ts +355 -0
  794. package/src/telemetry.ts +391 -0
  795. package/src/test-runner/TestRunner.ts +421 -0
  796. package/src/test-runner/performance-test.ts +161 -0
  797. package/src/test-runner/run-tests.ts +152 -0
  798. package/src/types.ts +533 -0
  799. package/src/utils/batch-commits.ts +162 -0
  800. package/src/utils/code-structure.ts +686 -0
  801. package/src/utils/commit-patterns.ts +87 -0
  802. package/src/utils/observability.ts +149 -0
  803. package/src/utils/quality.ts +230 -0
  804. package/src/utils/semantic-search.ts +222 -0
  805. package/src/utils/streaming.ts +109 -0
  806. package/src/utils/tag-suggestions.ts +117 -0
  807. package/src/utils/team-patterns.ts +499 -0
  808. package/src/utils/templates.ts +181 -0
  809. package/src/utils/tree-sitter-parser.ts +246 -0
  810. package/src/utils/v1.6-patterns.ts +227 -0
  811. package/src/utils.ts +885 -0
  812. package/test-all-features.sh +102 -0
  813. package/test-all-implemented-features.sh +209 -0
  814. package/test-all-new-features.sh +171 -0
  815. package/test-auto-log.txt +1 -0
  816. package/test-batch-commits.sh +47 -0
  817. package/test-conflict-resolution.sh +47 -0
  818. package/test-e2e.sh +22 -0
  819. package/test-end-to-end.sh +151 -0
  820. package/test-enhanced-autocapture.sh +164 -0
  821. package/test-inject.sh +44 -0
  822. package/test-mcp-server.sh +67 -0
  823. package/test-pagination.sh +37 -0
  824. package/test-python-go-structure.sh +164 -0
  825. package/test-quality-validation.sh +167 -0
  826. package/test-results-quick-smoke.json +13 -0
  827. package/test-results-targeted-perf.json +23 -0
  828. package/test-results.json +2272 -0
  829. package/test-scenarios/payment-logging.ts +17 -0
  830. package/test-scenarios/test-config.ts +13 -0
  831. package/test-semantic-search.sh +161 -0
  832. package/test-tag-intelligence.sh +49 -0
  833. package/test-vector-search.sh +64 -0
  834. package/test-vscode-extension.sh +144 -0
  835. package/test-watcher-file.txt +2 -0
  836. package/test-watcher-file2.txt +1 -0
  837. package/test-watcher.sh +103 -0
  838. package/test_qwen_scenarios.sh +285 -0
  839. package/tests/scenarios/4000_HARD_SCENARIOS.sh +4137 -0
  840. package/tests/scenarios/ADD_V1.1_SCENARIOS.sh +93 -0
  841. package/tests/scenarios/AGGRESSIVE_RANDOM_E2E_TEST.sh +474 -0
  842. package/tests/scenarios/COMPLETE_PRODUCT_VALIDATION.sh +227 -0
  843. package/tests/scenarios/COMPREHENSIVE_E2E_TEST.sh +426 -0
  844. package/tests/scenarios/CONTINUOUS_RANDOM_STRESS_TEST.sh +240 -0
  845. package/tests/scenarios/EXECUTE_10000_SCENARIOS.sh +61 -0
  846. package/tests/scenarios/EXECUTE_1000_UNIQUE_SCENARIOS.sh +190 -0
  847. package/tests/scenarios/EXECUTE_5000_SCENARIOS_SPLIT.sh +192 -0
  848. package/tests/scenarios/EXECUTE_5000_TOTAL_SCENARIOS.sh +162 -0
  849. package/tests/scenarios/EXECUTE_5040_SCENARIOS_WITH_V1.1.sh +251 -0
  850. package/tests/scenarios/EXECUTE_8_BATCHES_500.sh +51 -0
  851. package/tests/scenarios/EXECUTE_QUICK_SMOKE.sh +9 -0
  852. package/tests/scenarios/EXECUTE_SINGLE_BATCH.sh +117 -0
  853. package/tests/scenarios/EXECUTE_TARGETED_PERF.sh +19 -0
  854. package/tests/scenarios/GENERATE_1000_SCENARIOS.sh +235 -0
  855. package/tests/scenarios/GENERATE_4000_HARD_SCENARIOS.sh +266 -0
  856. package/tests/scenarios/GENERATE_4000_HARD_SCENARIOS_FIXED.sh +267 -0
  857. package/tests/scenarios/GENERATE_4000_HARD_SCENARIOS_FIXED_V2.sh +267 -0
  858. package/tests/scenarios/NEW_RANDOM_E2E_TEST.sh +422 -0
  859. package/tests/scenarios/QUICK_SMOKE_200.sh +38 -0
  860. package/tests/scenarios/QUICK_SMOKE_MINI.sh +3 -0
  861. package/tests/scenarios/RANDOM_REAL_WORLD_SCENARIOS.sh +372 -0
  862. package/tests/scenarios/ROUND3_RANDOM_E2E_TEST.sh +446 -0
  863. package/tests/scenarios/RUN_AGGRESSIVE_AND_SUMMARY.sh +51 -0
  864. package/tests/scenarios/RUN_ALL_1018_SCENARIOS.sh +161 -0
  865. package/tests/scenarios/TARGETED_PERF.sh +75 -0
  866. package/tests/scenarios/V1.1_FEATURES_SCENARIOS.sh +145 -0
  867. package/tests/unit/utils.test.ts +52 -0
  868. package/tests/v1.1-features-scenarios.sh +276 -0
  869. package/tsconfig.json +21 -0
  870. package/v1.6_FEATURE_REQUESTS.md +79 -0
@@ -0,0 +1,1272 @@
1
+ "use strict";
2
+ /**
3
+ * MemoryLink - Doctor Command
4
+ * System health check and troubleshooting
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.doctorCommand = doctorCommand;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const child_process_1 = require("child_process");
44
+ const utils_js_1 = require("../utils.js");
45
+ const types_js_1 = require("../types.js");
46
+ const observability_js_1 = require("../utils/observability.js");
47
+ const lock_js_1 = require("./lock.js");
48
+ // Secret patterns to detect (HIGH PRIORITY - All 7 AIs require this)
49
+ const SECRET_PATTERNS = [
50
+ // API Keys
51
+ { name: 'OpenAI API Key', pattern: /sk-[a-zA-Z0-9]{20,}/g },
52
+ { name: 'Anthropic API Key', pattern: /sk-ant-[a-zA-Z0-9-]{20,}/g },
53
+ { name: 'Stripe Secret Key', pattern: /sk_live_[a-zA-Z0-9]{20,}/g },
54
+ { name: 'Stripe Test Key', pattern: /sk_test_[a-zA-Z0-9]{20,}/g },
55
+ { name: 'AWS Access Key', pattern: /AKIA[0-9A-Z]{16}/g },
56
+ { name: 'AWS Secret Key', pattern: /[a-zA-Z0-9/+=]{40}/g },
57
+ { name: 'GitHub Token', pattern: /ghp_[a-zA-Z0-9]{36}/g },
58
+ { name: 'GitHub Token (old)', pattern: /github_pat_[a-zA-Z0-9_]{22,}/g },
59
+ { name: 'Google API Key', pattern: /AIza[0-9A-Za-z-_]{35}/g },
60
+ { name: 'Slack Token', pattern: /xox[baprs]-[0-9]{10,13}-[a-zA-Z0-9-]+/g },
61
+ { name: 'Discord Token', pattern: /[MN][A-Za-z\d]{23,}\.[\w-]{6}\.[\w-]{27}/g },
62
+ // Generic patterns
63
+ { name: 'Generic API Key', pattern: /api[_-]?key["\s]*[:=]["\s]*[a-zA-Z0-9_-]{16,}/gi },
64
+ { name: 'Generic Secret', pattern: /secret["\s]*[:=]["\s]*[a-zA-Z0-9_-]{16,}/gi },
65
+ { name: 'Generic Token', pattern: /token["\s]*[:=]["\s]*[a-zA-Z0-9_-]{16,}/gi },
66
+ { name: 'Password', pattern: /password["\s]*[:=]["\s]*[^\s"]{8,}/gi },
67
+ { name: 'Private Key', pattern: /-----BEGIN (RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/g },
68
+ { name: 'Bearer Token', pattern: /bearer\s+[a-zA-Z0-9_-]{20,}/gi },
69
+ ];
70
+ /**
71
+ * Detect Git merge conflict markers in log files
72
+ */
73
+ function detectGitConflicts(root) {
74
+ const conflicts = [];
75
+ const filesToScan = ['MEMORY', 'LEARNINGS', 'CHANGES'];
76
+ for (const fileKey of filesToScan) {
77
+ const filePath = (0, utils_js_1.getFilePath)(fileKey, root);
78
+ if (!fs.existsSync(filePath))
79
+ continue;
80
+ const content = fs.readFileSync(filePath, 'utf-8');
81
+ const lines = content.split('\n');
82
+ for (let i = 0; i < lines.length; i++) {
83
+ const line = lines[i];
84
+ // Check for Git merge conflict markers
85
+ if (line.trim().startsWith('<<<<<<<') ||
86
+ line.trim().startsWith('=======') ||
87
+ line.trim().startsWith('>>>>>>>')) {
88
+ conflicts.push({
89
+ file: types_js_1.FILES[fileKey],
90
+ line: i + 1,
91
+ });
92
+ }
93
+ }
94
+ }
95
+ return conflicts;
96
+ }
97
+ function scanForSecrets(root) {
98
+ const matches = [];
99
+ const filesToScan = ['MEMORY', 'LEARNINGS', 'CHANGES'];
100
+ for (const fileKey of filesToScan) {
101
+ const filePath = (0, utils_js_1.getFilePath)(fileKey, root);
102
+ if (!fs.existsSync(filePath))
103
+ continue;
104
+ const content = fs.readFileSync(filePath, 'utf-8');
105
+ const lines = content.split('\n');
106
+ for (let i = 0; i < lines.length; i++) {
107
+ const line = lines[i];
108
+ for (const secretPattern of SECRET_PATTERNS) {
109
+ const regex = new RegExp(secretPattern.pattern);
110
+ if (regex.test(line)) {
111
+ // Create a safe preview (mask most of the secret)
112
+ const preview = line.length > 60
113
+ ? line.substring(0, 30) + '...' + line.substring(line.length - 10)
114
+ : line;
115
+ matches.push({
116
+ file: types_js_1.FILES[fileKey],
117
+ line: i + 1,
118
+ pattern: secretPattern.name,
119
+ preview: preview.replace(/([a-zA-Z0-9_-]{8})[a-zA-Z0-9_-]{8,}([a-zA-Z0-9_-]{4})/g, '$1****$2'),
120
+ });
121
+ break; // Only report once per line
122
+ }
123
+ }
124
+ }
125
+ }
126
+ return matches;
127
+ }
128
+ /**
129
+ * Normalize text for comparison (lowercase, trim, remove extra spaces)
130
+ */
131
+ function normalizeText(text) {
132
+ return text.toLowerCase().trim().replace(/\s+/g, ' ');
133
+ }
134
+ /**
135
+ * Detect duplicate and conflicting memories
136
+ */
137
+ function detectMemoryConflicts(root) {
138
+ const conflicts = [];
139
+ const memoryPath = (0, utils_js_1.getFilePath)('MEMORY', root);
140
+ if (!fs.existsSync(memoryPath) || !(0, utils_js_1.isJsonlFormat)(memoryPath)) {
141
+ return conflicts;
142
+ }
143
+ const memories = (0, utils_js_1.readJsonlEntries)(memoryPath)
144
+ .filter(e => e.status === 'ACTIVE');
145
+ // Group by normalized details (exact duplicates)
146
+ const detailsMap = new Map();
147
+ for (const mem of memories) {
148
+ const normalized = normalizeText(mem.details);
149
+ if (!detailsMap.has(normalized)) {
150
+ detailsMap.set(normalized, []);
151
+ }
152
+ detailsMap.get(normalized).push(mem);
153
+ }
154
+ // Find duplicates
155
+ for (const [normalized, entries] of detailsMap) {
156
+ if (entries.length > 1) {
157
+ const preview = entries[0].details.length > 60
158
+ ? entries[0].details.substring(0, 60) + '...'
159
+ : entries[0].details;
160
+ conflicts.push({
161
+ type: 'duplicate',
162
+ entries: entries.map(e => e.id),
163
+ message: `Duplicate memory: "${preview}"`,
164
+ suggestion: `Consider deprecating older entries or merging them`,
165
+ });
166
+ }
167
+ }
168
+ // Find conflicting rules/decisions (same topic, contradictory)
169
+ const rules = memories.filter(m => m.type === 'rule' || m.type === 'decision');
170
+ const rulesByTopic = new Map();
171
+ for (const rule of rules) {
172
+ // Extract topic from details (first few words)
173
+ const topic = normalizeText(rule.details).split(' ').slice(0, 3).join(' ');
174
+ if (!rulesByTopic.has(topic)) {
175
+ rulesByTopic.set(topic, []);
176
+ }
177
+ rulesByTopic.get(topic).push(rule);
178
+ }
179
+ // Check for potential conflicts (same topic, different details)
180
+ for (const [topic, entries] of rulesByTopic) {
181
+ if (entries.length > 1) {
182
+ const uniqueDetails = new Set(entries.map(e => normalizeText(e.details)));
183
+ if (uniqueDetails.size > 1) {
184
+ conflicts.push({
185
+ type: 'conflict',
186
+ entries: entries.map(e => e.id),
187
+ message: `Conflicting ${entries[0].type}s about: "${topic}..."`,
188
+ suggestion: `Review and resolve contradictions`,
189
+ });
190
+ }
191
+ }
192
+ }
193
+ return conflicts;
194
+ }
195
+ /**
196
+ * Detect duplicate learnings
197
+ */
198
+ function detectLearningConflicts(root) {
199
+ const conflicts = [];
200
+ const learningsPath = (0, utils_js_1.getFilePath)('LEARNINGS', root);
201
+ if (!fs.existsSync(learningsPath) || !(0, utils_js_1.isJsonlFormat)(learningsPath)) {
202
+ return conflicts;
203
+ }
204
+ const learnings = (0, utils_js_1.readJsonlEntries)(learningsPath)
205
+ .filter(e => e.status === 'ACTIVE');
206
+ // Group by normalized problem + solution (exact duplicates)
207
+ const problemSolutionMap = new Map();
208
+ for (const learning of learnings) {
209
+ const key = `${normalizeText(learning.problem)}|${normalizeText(learning.solution)}`;
210
+ if (!problemSolutionMap.has(key)) {
211
+ problemSolutionMap.set(key, []);
212
+ }
213
+ problemSolutionMap.get(key).push(learning);
214
+ }
215
+ // Find duplicates
216
+ for (const [key, entries] of problemSolutionMap) {
217
+ if (entries.length > 1) {
218
+ const preview = entries[0].problem.length > 50
219
+ ? entries[0].problem.substring(0, 50) + '...'
220
+ : entries[0].problem;
221
+ conflicts.push({
222
+ type: 'duplicate',
223
+ entries: entries.map(e => e.id),
224
+ message: `Duplicate learning: "${preview}"`,
225
+ suggestion: `Keep the most recent entry, deprecate others`,
226
+ });
227
+ }
228
+ }
229
+ return conflicts;
230
+ }
231
+ async function doctorCommand(options = {}) {
232
+ const { verbose, scanSecrets, autoFix = false, preflight = false, postflight = false, changed = false, fix = false, json = false, for: agentId, pr: prNumber, branch: branchName, } = options;
233
+ // TODO v1.6: Record telemetry event (command start)
234
+ // await recordEvent({
235
+ // command: 'doctor',
236
+ // result: 'success', // Will be updated to 'error' if command fails
237
+ // flags: { preflight, postflight, json, scanSecrets },
238
+ // isGitRepo: checkIsGitRepo(),
239
+ // hasConfig: checkHasConfig(),
240
+ // });
241
+ // v1.4: Handle preflight/postflight
242
+ if (preflight) {
243
+ const root = (0, utils_js_1.findRoot)();
244
+ let report = await runPreflightCheck(options);
245
+ // Handle override if RED status
246
+ if (report.status === 'RED' && !json) {
247
+ report = await handleOverride(report, root, options);
248
+ }
249
+ // Log to observability
250
+ if (root) {
251
+ (0, observability_js_1.logBuddyCheckRun)(report, root);
252
+ }
253
+ if (json) {
254
+ // For JSON output, use safeLog to handle EPIPE
255
+ (0, utils_js_1.safeLog)(JSON.stringify(report, null, 2));
256
+ }
257
+ else {
258
+ printBuddyReport(report);
259
+ }
260
+ // Write to file
261
+ if (root) {
262
+ const reportPath = path.join(root, types_js_1.MEMORYLINK_DIR, 'preflight.json');
263
+ fs.writeFileSync(reportPath, JSON.stringify(report, null, 2));
264
+ if (!json) {
265
+ (0, utils_js_1.info)(`Report saved to: ${reportPath}`);
266
+ }
267
+ // Log override to overrides.log if present
268
+ if (report.override) {
269
+ logOverride(report.override, 'preflight', root);
270
+ }
271
+ }
272
+ // Exit with error code only if RED and not overridden
273
+ if (report.status === 'RED' && !report.override) {
274
+ process.exit(1);
275
+ }
276
+ return;
277
+ }
278
+ if (postflight) {
279
+ const root = (0, utils_js_1.findRoot)();
280
+ let report = await runPostflightCheck(options);
281
+ // Handle override if RED status
282
+ if (report.status === 'RED' && !json) {
283
+ report = await handleOverride(report, root, options);
284
+ }
285
+ // Log to observability
286
+ if (root) {
287
+ (0, observability_js_1.logBuddyCheckRun)(report, root);
288
+ }
289
+ if (json) {
290
+ // For JSON output, use safeLog to handle EPIPE
291
+ (0, utils_js_1.safeLog)(JSON.stringify(report, null, 2));
292
+ }
293
+ else {
294
+ printBuddyReport(report);
295
+ }
296
+ // Write to file
297
+ if (root) {
298
+ const reportPath = path.join(root, types_js_1.MEMORYLINK_DIR, 'postflight.json');
299
+ fs.writeFileSync(reportPath, JSON.stringify(report, null, 2));
300
+ if (!json) {
301
+ (0, utils_js_1.info)(`Report saved to: ${reportPath}`);
302
+ }
303
+ // Log override to overrides.log if present
304
+ if (report.override) {
305
+ logOverride(report.override, 'postflight', root);
306
+ }
307
+ }
308
+ // Exit with error code only if RED and not overridden
309
+ if (report.status === 'RED' && !report.override) {
310
+ process.exit(1);
311
+ }
312
+ return;
313
+ }
314
+ // Original doctor command (v1.3)
315
+ (0, utils_js_1.log)('Running health checks', verbose);
316
+ console.log('');
317
+ console.log('\x1b[1m🩺 MemoryLink Doctor\x1b[0m');
318
+ console.log('');
319
+ const checks = [];
320
+ // Check 1: MemoryLink initialized
321
+ const root = (0, utils_js_1.findRoot)();
322
+ const initialized = root && (0, utils_js_1.isInitialized)(root);
323
+ checks.push({
324
+ name: 'MemoryLink initialized',
325
+ status: initialized ? 'pass' : 'fail',
326
+ message: initialized
327
+ ? `Found .memorylink/ in ${root}`
328
+ : 'Run: memorylink init',
329
+ suggestion: initialized ? undefined : 'Run: memorylink init',
330
+ });
331
+ if (!initialized) {
332
+ printChecks(checks);
333
+ return;
334
+ }
335
+ // Check 2: All required files exist
336
+ const requiredFiles = ['PROTECTED', 'MEMORY', 'CHANGES', 'LEARNINGS', 'CONFIG'];
337
+ let allFilesExist = true;
338
+ const missingFiles = [];
339
+ for (const fileKey of requiredFiles) {
340
+ const filePath = (0, utils_js_1.getFilePath)(fileKey, root);
341
+ if (!fs.existsSync(filePath)) {
342
+ allFilesExist = false;
343
+ missingFiles.push(types_js_1.FILES[fileKey]);
344
+ }
345
+ }
346
+ checks.push({
347
+ name: 'Required files exist',
348
+ status: allFilesExist ? 'pass' : 'fail',
349
+ message: allFilesExist
350
+ ? 'All 5 files present'
351
+ : `Missing: ${missingFiles.join(', ')}`,
352
+ });
353
+ // Check 3: Config file valid
354
+ const config = (0, utils_js_1.readConfig)(root);
355
+ checks.push({
356
+ name: 'Config file valid',
357
+ status: config ? 'pass' : 'fail',
358
+ message: config
359
+ ? `Version ${config.version}, initialized ${new Date(config.initialized).toLocaleDateString()}`
360
+ : 'Config file is corrupted or invalid',
361
+ suggestion: config ? undefined : 'Run: memorylink init (will recreate config)',
362
+ });
363
+ // Check 4: Files are readable/writable
364
+ let filesWritable = true;
365
+ try {
366
+ const testFile = path.join(root, types_js_1.MEMORYLINK_DIR, '.doctor-test');
367
+ fs.writeFileSync(testFile, 'test');
368
+ fs.unlinkSync(testFile);
369
+ }
370
+ catch {
371
+ filesWritable = false;
372
+ }
373
+ checks.push({
374
+ name: 'Files are writable',
375
+ status: filesWritable ? 'pass' : 'fail',
376
+ message: filesWritable
377
+ ? 'Read/write access confirmed'
378
+ : 'Permission denied - check file permissions',
379
+ });
380
+ // Check 5: Git repository
381
+ let isGitRepo = false;
382
+ let gitTracked = false;
383
+ try {
384
+ (0, child_process_1.execSync)('git rev-parse --git-dir', { cwd: root, stdio: 'pipe' });
385
+ isGitRepo = true;
386
+ // Check if .memorylink is tracked
387
+ try {
388
+ const gitStatus = (0, child_process_1.execSync)(`git ls-files ${types_js_1.MEMORYLINK_DIR}`, { cwd: root, stdio: 'pipe' }).toString();
389
+ gitTracked = gitStatus.trim().length > 0;
390
+ }
391
+ catch {
392
+ gitTracked = false;
393
+ }
394
+ }
395
+ catch {
396
+ isGitRepo = false;
397
+ }
398
+ checks.push({
399
+ name: 'Git repository',
400
+ status: isGitRepo ? 'pass' : 'warn',
401
+ message: isGitRepo
402
+ ? gitTracked
403
+ ? '.memorylink/ is tracked in Git (team sharing enabled)'
404
+ : '.memorylink/ exists but not tracked in Git'
405
+ : 'Not a Git repository - team sharing disabled',
406
+ });
407
+ // Check 6: Git hooks
408
+ let hooksInstalled = false;
409
+ if (isGitRepo && root) {
410
+ const preCommitPath = path.join(root, '.git', 'hooks', 'pre-commit');
411
+ if (fs.existsSync(preCommitPath)) {
412
+ const hookContent = fs.readFileSync(preCommitPath, 'utf-8');
413
+ hooksInstalled = hookContent.includes('memorylink');
414
+ }
415
+ }
416
+ checks.push({
417
+ name: 'Git hooks installed',
418
+ status: hooksInstalled ? 'pass' : 'warn',
419
+ message: hooksInstalled
420
+ ? 'Pre-commit hook protects files'
421
+ : 'Run: memorylink hooks install',
422
+ });
423
+ // Check 7: Node.js version
424
+ const nodeVersion = process.version;
425
+ const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0], 10);
426
+ checks.push({
427
+ name: 'Node.js version',
428
+ status: majorVersion >= 18 ? 'pass' : 'warn',
429
+ message: `${nodeVersion} ${majorVersion >= 18 ? '(supported)' : '(recommend v18+)'}`,
430
+ });
431
+ // Check 8: Protected files exist
432
+ const protectedPath = (0, utils_js_1.getFilePath)('PROTECTED', root);
433
+ const protectedFiles = fs.readFileSync(protectedPath, 'utf-8')
434
+ .split('\n')
435
+ .filter(l => l.trim() && !l.startsWith('#'))
436
+ .map(l => l.split('#')[0].trim());
437
+ let allProtectedExist = true;
438
+ const missingProtected = [];
439
+ for (const file of protectedFiles) {
440
+ const fullPath = path.join(root, file);
441
+ if (!fs.existsSync(fullPath)) {
442
+ allProtectedExist = false;
443
+ missingProtected.push(file);
444
+ }
445
+ }
446
+ if (protectedFiles.length > 0) {
447
+ checks.push({
448
+ name: 'Protected files exist',
449
+ status: allProtectedExist ? 'pass' : 'warn',
450
+ message: allProtectedExist
451
+ ? `All ${protectedFiles.length} protected files found`
452
+ : `Missing: ${missingProtected.slice(0, 3).join(', ')}${missingProtected.length > 3 ? '...' : ''}`,
453
+ });
454
+ }
455
+ // Check 9: SECRET SCANNING (Critical - All 7 AIs require this)
456
+ const secretMatches = scanForSecrets(root);
457
+ checks.push({
458
+ name: 'Secret scanning',
459
+ status: secretMatches.length === 0 ? 'pass' : 'fail',
460
+ message: secretMatches.length === 0
461
+ ? 'No potential secrets detected in logs'
462
+ : `⚠️ ${secretMatches.length} potential secret(s) detected!`,
463
+ suggestion: secretMatches.length === 0 ? undefined : 'Review detected secrets and remove them from logs',
464
+ });
465
+ // Check 10: Common sensitive files protection
466
+ const sensitiveFiles = ['.env', '.env.local', '.env.production', 'secrets.json', '*.pem', 'id_rsa'];
467
+ const unprotectedSensitive = [];
468
+ for (const sensitive of sensitiveFiles) {
469
+ // Check if file exists and is not protected
470
+ if (sensitive.includes('*'))
471
+ continue; // Skip glob patterns for now
472
+ const sensitivePath = path.join(root, sensitive);
473
+ if (fs.existsSync(sensitivePath) && !protectedFiles.includes(sensitive)) {
474
+ unprotectedSensitive.push(sensitive);
475
+ }
476
+ }
477
+ if (unprotectedSensitive.length > 0) {
478
+ checks.push({
479
+ name: 'Sensitive files protected',
480
+ status: 'warn',
481
+ message: `Unprotected: ${unprotectedSensitive.join(', ')} - Run: memorylink protect <file>`,
482
+ suggestion: `Run: memorylink protect ${unprotectedSensitive[0]}`,
483
+ });
484
+ }
485
+ // Check 11: Git merge conflict detection
486
+ const gitConflicts = detectGitConflicts(root);
487
+ checks.push({
488
+ name: 'Git merge conflicts',
489
+ status: gitConflicts.length === 0 ? 'pass' : 'fail',
490
+ message: gitConflicts.length === 0
491
+ ? 'No Git merge conflicts found'
492
+ : `${gitConflicts.length} Git merge conflict(s) detected in log files`,
493
+ });
494
+ // Check 12: Conflict/duplicate detection
495
+ const memoryConflicts = detectMemoryConflicts(root);
496
+ const learningConflicts = detectLearningConflicts(root);
497
+ const allConflicts = [...memoryConflicts, ...learningConflicts];
498
+ checks.push({
499
+ name: 'Conflict/duplicate detection',
500
+ status: allConflicts.length === 0 ? 'pass' : 'warn',
501
+ message: allConflicts.length === 0
502
+ ? 'No duplicates or conflicts found'
503
+ : `${allConflicts.length} conflict(s) detected (see details below)`,
504
+ });
505
+ // Check 13: Code structure graph freshness (v1.2)
506
+ const graphFile = path.join(root, '.memorylink', 'code-graph.json');
507
+ if (fs.existsSync(graphFile)) {
508
+ const stats = fs.statSync(graphFile);
509
+ const age = Date.now() - stats.mtimeMs;
510
+ const oneWeek = 7 * 24 * 60 * 60 * 1000;
511
+ checks.push({
512
+ name: 'Code structure graph',
513
+ status: age < oneWeek ? 'pass' : 'warn',
514
+ message: age < oneWeek
515
+ ? `Graph is ${Math.floor(age / (24 * 60 * 60 * 1000))} day(s) old`
516
+ : 'Graph is older than 7 days - Run: memorylink graph build --rebuild',
517
+ suggestion: age >= oneWeek ? 'Run: memorylink graph build --rebuild' : undefined,
518
+ });
519
+ }
520
+ else {
521
+ checks.push({
522
+ name: 'Code structure graph',
523
+ status: 'warn',
524
+ message: 'No code structure graph found',
525
+ suggestion: 'Run: memorylink graph build to enable code structure memory',
526
+ });
527
+ }
528
+ printChecks(checks);
529
+ // If secrets were found, print detailed report
530
+ if (secretMatches.length > 0) {
531
+ console.log('');
532
+ console.log('\x1b[31m\x1b[1m🚨 SECURITY WARNING: Potential Secrets Detected!\x1b[0m');
533
+ console.log('');
534
+ console.log('\x1b[33mThe following entries may contain sensitive data:\x1b[0m');
535
+ console.log('');
536
+ for (const match of secretMatches) {
537
+ console.log(` \x1b[31m•\x1b[0m ${match.file}:${match.line}`);
538
+ console.log(` \x1b[90mType: ${match.pattern}\x1b[0m`);
539
+ console.log(` \x1b[90mPreview: ${match.preview}\x1b[0m`);
540
+ console.log('');
541
+ }
542
+ console.log('\x1b[33m⚠️ ACTION REQUIRED:\x1b[0m');
543
+ console.log(' 1. Remove secrets from MemoryLink logs immediately');
544
+ console.log(' 2. Rotate any exposed credentials');
545
+ console.log(' 3. Use environment variables instead of storing secrets');
546
+ console.log(' 4. Add sensitive files to protected.txt');
547
+ console.log('');
548
+ console.log('\x1b[90mTip: Never store API keys, passwords, or tokens in MemoryLink logs.\x1b[0m');
549
+ console.log('\x1b[90mUse: memorylink protect .env\x1b[0m');
550
+ console.log('');
551
+ }
552
+ // Auto-fix suggestions
553
+ const failCount = checks.filter(c => c.status === 'fail').length;
554
+ if (autoFix && failCount > 0) {
555
+ const fixableChecks = checks.filter(c => c.status === 'fail' && c.suggestion);
556
+ if (fixableChecks.length > 0) {
557
+ console.log('');
558
+ (0, utils_js_1.info)('🔧 Auto-fix suggestions:');
559
+ console.log('');
560
+ for (const check of fixableChecks) {
561
+ if (check.suggestion) {
562
+ console.log(` ${check.name}:`);
563
+ console.log(` → ${check.suggestion}`);
564
+ console.log('');
565
+ }
566
+ }
567
+ }
568
+ }
569
+ // If conflicts were found, print detailed report
570
+ if (allConflicts.length > 0) {
571
+ console.log('');
572
+ console.log('\x1b[33m\x1b[1m⚠️ CONFLICTS & DUPLICATES DETECTED\x1b[0m');
573
+ console.log('');
574
+ console.log('\x1b[33mThe following entries may need attention:\x1b[0m');
575
+ console.log('');
576
+ for (const conflict of allConflicts) {
577
+ const icon = conflict.type === 'duplicate' ? '📋' : '⚠️';
578
+ const color = conflict.type === 'duplicate' ? '\x1b[33m' : '\x1b[31m';
579
+ console.log(` ${icon} ${color}${conflict.message}\x1b[0m`);
580
+ console.log(` \x1b[90mEntry IDs: ${conflict.entries.slice(0, 3).join(', ')}${conflict.entries.length > 3 ? ` (+${conflict.entries.length - 3} more)` : ''}\x1b[0m`);
581
+ if (conflict.suggestion) {
582
+ console.log(` \x1b[90mSuggestion: ${conflict.suggestion}\x1b[0m`);
583
+ }
584
+ console.log('');
585
+ }
586
+ console.log('\x1b[33m💡 TIPS:\x1b[0m');
587
+ console.log(' • Review duplicate entries and keep the most relevant');
588
+ console.log(' • Resolve conflicting rules/decisions');
589
+ console.log(' • Use memorylink search to find entries by ID');
590
+ console.log(' • Consider deprecating outdated entries');
591
+ console.log('');
592
+ }
593
+ // Print all checks
594
+ printChecks(checks);
595
+ // Summary
596
+ console.log('');
597
+ const passCount = checks.filter(c => c.status === 'pass').length;
598
+ const warnCount = checks.filter(c => c.status === 'warn').length;
599
+ if (failCount > 0) {
600
+ (0, utils_js_1.error)(`${failCount} issue(s) need attention`);
601
+ if (!autoFix) {
602
+ (0, utils_js_1.info)(' Run with --auto-fix to see fix suggestions');
603
+ }
604
+ }
605
+ else if (warnCount > 0) {
606
+ (0, utils_js_1.warn)(`${warnCount} warning(s), ${passCount} passed`);
607
+ }
608
+ else {
609
+ (0, utils_js_1.success)(`All ${passCount} checks passed! MemoryLink is healthy.`);
610
+ }
611
+ console.log('');
612
+ }
613
+ function printChecks(checks) {
614
+ for (const check of checks) {
615
+ let icon;
616
+ let color;
617
+ switch (check.status) {
618
+ case 'pass':
619
+ icon = '✓';
620
+ color = '\x1b[32m';
621
+ break;
622
+ case 'warn':
623
+ icon = '⚠';
624
+ color = '\x1b[33m';
625
+ break;
626
+ case 'fail':
627
+ icon = '✗';
628
+ color = '\x1b[31m';
629
+ break;
630
+ }
631
+ console.log(` ${color}${icon}\x1b[0m ${check.name}`);
632
+ console.log(` \x1b[90m${check.message}\x1b[0m`);
633
+ }
634
+ }
635
+ // ============================================
636
+ // V1.4 BUDDY-CHECK: PREFLIGHT & POSTFLIGHT
637
+ // ============================================
638
+ /**
639
+ * Run preflight check before AI agent operations
640
+ */
641
+ async function runPreflightCheck(options) {
642
+ const startTime = Date.now();
643
+ const root = (0, utils_js_1.findRoot)();
644
+ if (!root || !(0, utils_js_1.isInitialized)(root)) {
645
+ return {
646
+ status: 'RED',
647
+ summary: 'MemoryLink not initialized',
648
+ issues: [{
649
+ type: 'INIT',
650
+ severity: 'error',
651
+ message: 'MemoryLink is not initialized. Run: memorylink init',
652
+ }],
653
+ timestamp: new Date().toISOString(),
654
+ runType: 'preflight',
655
+ durationMs: Date.now() - startTime,
656
+ };
657
+ }
658
+ const issues = [];
659
+ // Check 0: Agent locking (v1.5)
660
+ const lockStatus = (0, lock_js_1.checkLock)(root);
661
+ if (lockStatus.locked) {
662
+ issues.push({
663
+ type: 'LOCK',
664
+ severity: 'warning',
665
+ message: `Agent lock active: ${lockStatus.agentId} (expires ${lockStatus.expiresAt?.toLocaleString()})`,
666
+ projectPath: root,
667
+ suggestion: 'Wait for lock to expire or release with: memorylink lock release',
668
+ });
669
+ }
670
+ const memoryEntries = (0, utils_js_1.readJsonlEntries)((0, utils_js_1.getFilePath)('MEMORY', root));
671
+ // Check 1: Schema validation
672
+ const schemaIssues = validateSchema(memoryEntries, root);
673
+ issues.push(...schemaIssues);
674
+ // Check 2: Referential integrity
675
+ const refIssues = validateReferentialIntegrity(memoryEntries, root);
676
+ issues.push(...refIssues);
677
+ // Check 3: Security checks (secrets, PII)
678
+ const securityIssues = validateSecurity(memoryEntries, root);
679
+ issues.push(...securityIssues);
680
+ // Check 4: Staleness detection
681
+ const stalenessIssues = detectStaleness(memoryEntries, root);
682
+ issues.push(...stalenessIssues);
683
+ // Check 5: Policy validation
684
+ const policyIssues = validatePolicies(memoryEntries, root);
685
+ issues.push(...policyIssues);
686
+ // Calculate status
687
+ const status = calculateBuddyStatus(issues);
688
+ // Count trust levels
689
+ const trustCounts = countTrustLevels(memoryEntries);
690
+ const duration = Date.now() - startTime;
691
+ return {
692
+ status,
693
+ summary: generateSummary(status, issues.length, memoryEntries.length),
694
+ issues,
695
+ timestamp: new Date().toISOString(),
696
+ runType: 'preflight',
697
+ agentId: options.for,
698
+ branch: options.branch,
699
+ recordsUsed: memoryEntries.length,
700
+ highTrust: trustCounts.high,
701
+ mediumTrust: trustCounts.medium,
702
+ lowTrust: trustCounts.low,
703
+ staleCount: stalenessIssues.length,
704
+ durationMs: duration,
705
+ };
706
+ }
707
+ /**
708
+ * Run postflight check after AI agent operations
709
+ */
710
+ async function runPostflightCheck(options) {
711
+ const startTime = Date.now();
712
+ const root = (0, utils_js_1.findRoot)();
713
+ if (!root || !(0, utils_js_1.isInitialized)(root)) {
714
+ return {
715
+ status: 'RED',
716
+ summary: 'MemoryLink not initialized',
717
+ issues: [{
718
+ type: 'INIT',
719
+ severity: 'error',
720
+ message: 'MemoryLink is not initialized. Run: memorylink init',
721
+ }],
722
+ timestamp: new Date().toISOString(),
723
+ runType: 'postflight',
724
+ durationMs: Date.now() - startTime,
725
+ };
726
+ }
727
+ const issues = [];
728
+ // Get changed files if --changed flag is set
729
+ // TODO v1.6: Use `git diff` to detect changed files instead of file watching
730
+ // This will enable detection of:
731
+ // - Protected file modifications (via git diff --name-only + protected.txt check)
732
+ // - File deletions (via git diff --diff-filter=D)
733
+ // - Large-scale changes (via git diff --stat line count)
734
+ const changedFiles = options.changed ? getChangedFiles(root) : [];
735
+ // Read memory entries (filter to changed if needed)
736
+ let memoryEntries = (0, utils_js_1.readJsonlEntries)((0, utils_js_1.getFilePath)('MEMORY', root));
737
+ if (options.changed && changedFiles.length > 0) {
738
+ // Filter entries related to changed files
739
+ memoryEntries = memoryEntries.filter(entry => {
740
+ if (entry.file && changedFiles.includes(entry.file))
741
+ return true;
742
+ if (entry.path && changedFiles.includes(entry.path))
743
+ return true;
744
+ // Check if entry was created/updated recently (last 5 minutes)
745
+ const entryTime = new Date(entry.ts).getTime();
746
+ const fiveMinutesAgo = Date.now() - 5 * 60 * 1000;
747
+ return entryTime > fiveMinutesAgo;
748
+ });
749
+ }
750
+ // Run same checks as preflight
751
+ const schemaIssues = validateSchema(memoryEntries, root);
752
+ issues.push(...schemaIssues);
753
+ const refIssues = validateReferentialIntegrity(memoryEntries, root);
754
+ issues.push(...refIssues);
755
+ const securityIssues = validateSecurity(memoryEntries, root);
756
+ issues.push(...securityIssues);
757
+ const stalenessIssues = detectStaleness(memoryEntries, root);
758
+ issues.push(...stalenessIssues);
759
+ const policyIssues = validatePolicies(memoryEntries, root);
760
+ issues.push(...policyIssues);
761
+ // Additional postflight checks
762
+ const consistencyIssues = validateConsistency(memoryEntries, root, changedFiles);
763
+ issues.push(...consistencyIssues);
764
+ // Mark new agent records as DRAFT
765
+ if (options.fix) {
766
+ await markAgentRecordsAsDraft(memoryEntries, root);
767
+ }
768
+ // Calculate status
769
+ const status = calculateBuddyStatus(issues);
770
+ const trustCounts = countTrustLevels(memoryEntries);
771
+ const duration = Date.now() - startTime;
772
+ return {
773
+ status,
774
+ summary: generateSummary(status, issues.length, memoryEntries.length),
775
+ issues,
776
+ timestamp: new Date().toISOString(),
777
+ runType: 'postflight',
778
+ recordsUsed: memoryEntries.length,
779
+ highTrust: trustCounts.high,
780
+ mediumTrust: trustCounts.medium,
781
+ lowTrust: trustCounts.low,
782
+ staleCount: stalenessIssues.length,
783
+ durationMs: duration,
784
+ };
785
+ }
786
+ /**
787
+ * Validate schema and required fields
788
+ */
789
+ function validateSchema(entries, root) {
790
+ const issues = [];
791
+ for (const entry of entries) {
792
+ // Check required fields
793
+ if (!entry.id) {
794
+ issues.push({
795
+ id: entry.id,
796
+ type: 'SCHEMA',
797
+ severity: 'error',
798
+ message: 'Missing required field: id',
799
+ projectPath: root,
800
+ });
801
+ }
802
+ if (!entry.ts) {
803
+ issues.push({
804
+ id: entry.id,
805
+ type: 'SCHEMA',
806
+ severity: 'error',
807
+ message: 'Missing required field: ts (timestamp)',
808
+ projectPath: root,
809
+ });
810
+ }
811
+ if (!entry.type) {
812
+ issues.push({
813
+ id: entry.id,
814
+ type: 'SCHEMA',
815
+ severity: 'error',
816
+ message: 'Missing required field: type',
817
+ projectPath: root,
818
+ });
819
+ }
820
+ // v1.4: Check schema version if present
821
+ if (entry.schemaVersion && entry.schemaVersion !== '1.4.0' && entry.schemaVersion !== '1.3.0') {
822
+ issues.push({
823
+ id: entry.id,
824
+ type: 'SCHEMA',
825
+ severity: 'warning',
826
+ message: `Unknown schema version: ${entry.schemaVersion}`,
827
+ projectPath: root,
828
+ });
829
+ }
830
+ }
831
+ return issues;
832
+ }
833
+ /**
834
+ * Validate referential integrity (files exist, lines in range, commits exist)
835
+ */
836
+ function validateReferentialIntegrity(entries, root) {
837
+ const issues = [];
838
+ for (const entry of entries) {
839
+ // Check file references
840
+ if (entry.file) {
841
+ const filePath = path.join(root, entry.file);
842
+ if (!fs.existsSync(filePath)) {
843
+ issues.push({
844
+ id: entry.id,
845
+ type: 'BROKEN_REF',
846
+ severity: 'warning',
847
+ message: `Referenced file does not exist: ${entry.file}`,
848
+ projectPath: root,
849
+ });
850
+ }
851
+ else if (entry.lines) {
852
+ // Check line numbers are in range
853
+ const lineRange = parseLineRange(entry.lines);
854
+ if (lineRange) {
855
+ const fileContent = fs.readFileSync(filePath, 'utf-8');
856
+ const totalLines = fileContent.split('\n').length;
857
+ if (lineRange.end > totalLines) {
858
+ issues.push({
859
+ id: entry.id,
860
+ type: 'BROKEN_REF',
861
+ severity: 'warning',
862
+ message: `Line range ${entry.lines} exceeds file length (${totalLines} lines)`,
863
+ projectPath: root,
864
+ });
865
+ }
866
+ }
867
+ }
868
+ }
869
+ // Check commit OID if location.commit is present (v1.4)
870
+ if (entry.location?.commit) {
871
+ try {
872
+ (0, child_process_1.execSync)(`git cat-file -e ${entry.location.commit}`, {
873
+ cwd: root,
874
+ stdio: 'ignore'
875
+ });
876
+ }
877
+ catch {
878
+ issues.push({
879
+ id: entry.id,
880
+ type: 'BROKEN_REF',
881
+ severity: 'warning',
882
+ message: `Referenced commit does not exist: ${entry.location.commit}`,
883
+ projectPath: root,
884
+ });
885
+ }
886
+ }
887
+ }
888
+ return issues;
889
+ }
890
+ /**
891
+ * Validate security (secrets, PII)
892
+ *
893
+ * TODO v1.6: Enhanced pattern matching
894
+ * - Add credit card patterns (Luhn algorithm validation)
895
+ * - Add CVV patterns (3-4 digits)
896
+ * - Add SSN patterns (XXX-XX-XXXX)
897
+ * - Add API key patterns (common formats)
898
+ * - Add file-based logging detection (console.log with sensitive data)
899
+ * - See: src/utils/v1.6-patterns.ts (commented out for v1.6)
900
+ */
901
+ function validateSecurity(entries, root) {
902
+ const issues = [];
903
+ for (const entry of entries) {
904
+ const content = entry.details || entry.code || '';
905
+ // Check for secrets
906
+ for (const pattern of SECRET_PATTERNS) {
907
+ const matches = content.match(pattern.pattern);
908
+ if (matches) {
909
+ // RED if agent-origin, YELLOW if human
910
+ const severity = entry.sourceType === 'agent' ? 'error' : 'warning';
911
+ issues.push({
912
+ id: entry.id,
913
+ type: 'SECRET',
914
+ severity,
915
+ message: `Potential secret detected (${pattern.name}): ${matches[0].substring(0, 20)}...`,
916
+ projectPath: root,
917
+ suggestion: 'Remove secret from memory entry',
918
+ });
919
+ }
920
+ }
921
+ // Check for PII (emails, IDs)
922
+ const emailPattern = /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g;
923
+ const emailMatches = content.match(emailPattern);
924
+ if (emailMatches && entry.sourceType === 'agent') {
925
+ issues.push({
926
+ id: entry.id,
927
+ type: 'PII',
928
+ severity: 'error',
929
+ message: `PII detected (email): ${emailMatches[0]}`,
930
+ projectPath: root,
931
+ suggestion: 'Remove PII from memory entry',
932
+ });
933
+ }
934
+ // TODO v1.6: Enhanced patterns (see src/utils/v1.6-patterns.ts)
935
+ // - Credit card: /(?:\d{4}[-\s]?){3}\d{4}/g + Luhn validation
936
+ // - CVV: /\b\d{3,4}\b/g (context-dependent)
937
+ // - SSN: /\b\d{3}-\d{2}-\d{4}\b/g
938
+ // - API keys: Common formats (AWS, Google, etc.)
939
+ // - File logging: console.log/logger.* with sensitive patterns
940
+ }
941
+ return issues;
942
+ }
943
+ /**
944
+ * Detect stale records (file changed since commit)
945
+ */
946
+ function detectStaleness(entries, root) {
947
+ const issues = [];
948
+ for (const entry of entries) {
949
+ if (entry.location?.commit && entry.file) {
950
+ try {
951
+ // Check if file has changed since commit
952
+ const filePath = path.join(root, entry.file);
953
+ if (fs.existsSync(filePath)) {
954
+ const currentCommit = (0, child_process_1.execSync)('git rev-parse HEAD', {
955
+ cwd: root,
956
+ encoding: 'utf-8'
957
+ }).trim();
958
+ if (currentCommit !== entry.location.commit) {
959
+ // File has changed - mark as stale
960
+ issues.push({
961
+ id: entry.id,
962
+ type: 'STALE',
963
+ severity: 'warning',
964
+ message: `File changed since commit ${entry.location.commit.substring(0, 8)}`,
965
+ projectPath: root,
966
+ suggestion: 'Update memory entry or rebuild graph',
967
+ });
968
+ }
969
+ }
970
+ }
971
+ catch {
972
+ // Git not available or file doesn't exist - skip
973
+ }
974
+ }
975
+ }
976
+ return issues;
977
+ }
978
+ /**
979
+ * Validate policy rules
980
+ *
981
+ * TODO v1.6: Add Git-based protected file detection
982
+ * - Use `git diff --name-only HEAD` to get changed files
983
+ * - Cross-reference with protected.txt
984
+ * - Detect protected file modifications (RED status)
985
+ * - Detect file deletions (via `git diff --diff-filter=D`)
986
+ * - Detect large-scale changes (via `git diff --stat` line count > threshold)
987
+ */
988
+ function validatePolicies(entries, root) {
989
+ const issues = [];
990
+ // Policy: "Prefer fresh code over memory"
991
+ // Policy: "No secrets in memory"
992
+ // (Already checked in validateSecurity)
993
+ // TODO v1.6: Protected file detection via Git diff
994
+ // const protectedFiles = readLines(getFilePath('PROTECTED', root));
995
+ // const changedFiles = getChangedFiles(root);
996
+ // for (const file of changedFiles) {
997
+ // if (protectedFiles.includes(file)) {
998
+ // issues.push({
999
+ // type: 'PROTECTED_FILE',
1000
+ // severity: 'error',
1001
+ // message: `Protected file modified: ${file}`,
1002
+ // projectPath: root,
1003
+ // suggestion: 'Review changes or remove from protected.txt',
1004
+ // });
1005
+ // }
1006
+ // }
1007
+ // Policy: "Agent records should be DRAFT until verified"
1008
+ for (const entry of entries) {
1009
+ if (entry.sourceType === 'agent' && entry.memoryStatus !== 'DRAFT') {
1010
+ issues.push({
1011
+ id: entry.id,
1012
+ type: 'POLICY',
1013
+ severity: 'info',
1014
+ message: 'Agent-origin record should be DRAFT until verified',
1015
+ projectPath: root,
1016
+ suggestion: 'Mark as DRAFT or promote to VERIFIED after review',
1017
+ });
1018
+ }
1019
+ }
1020
+ return issues;
1021
+ }
1022
+ /**
1023
+ * Validate consistency (code + memory changes)
1024
+ */
1025
+ function validateConsistency(entries, root, changedFiles) {
1026
+ const issues = [];
1027
+ // Check if memory entries match changed files
1028
+ for (const entry of entries) {
1029
+ if (entry.file && changedFiles.length > 0 && !changedFiles.includes(entry.file)) {
1030
+ // Entry references file that wasn't changed - might be inconsistent
1031
+ issues.push({
1032
+ id: entry.id,
1033
+ type: 'CONFLICT',
1034
+ severity: 'info',
1035
+ message: `Memory entry references unchanged file: ${entry.file}`,
1036
+ projectPath: root,
1037
+ });
1038
+ }
1039
+ }
1040
+ return issues;
1041
+ }
1042
+ /**
1043
+ * Calculate Buddy-Check status from issues
1044
+ */
1045
+ function calculateBuddyStatus(issues) {
1046
+ // RED: Any error-level issues
1047
+ if (issues.some(i => i.severity === 'error')) {
1048
+ return 'RED';
1049
+ }
1050
+ // YELLOW: Any warnings
1051
+ if (issues.some(i => i.severity === 'warning')) {
1052
+ return 'YELLOW';
1053
+ }
1054
+ // GREEN: No errors or warnings
1055
+ return 'GREEN';
1056
+ }
1057
+ /**
1058
+ * Generate summary text
1059
+ */
1060
+ function generateSummary(status, issueCount, recordCount) {
1061
+ if (status === 'RED') {
1062
+ return `RED: ${issueCount} critical issue(s) found in ${recordCount} records`;
1063
+ }
1064
+ else if (status === 'YELLOW') {
1065
+ return `YELLOW: ${issueCount} warning(s) found in ${recordCount} records`;
1066
+ }
1067
+ else {
1068
+ return `GREEN: All checks passed for ${recordCount} records`;
1069
+ }
1070
+ }
1071
+ /**
1072
+ * Count trust levels in entries
1073
+ */
1074
+ function countTrustLevels(entries) {
1075
+ let high = 0;
1076
+ let medium = 0;
1077
+ let low = 0;
1078
+ for (const entry of entries) {
1079
+ const trust = entry.trustLevel || 'medium';
1080
+ if (trust === 'high')
1081
+ high++;
1082
+ else if (trust === 'low')
1083
+ low++;
1084
+ else
1085
+ medium++;
1086
+ }
1087
+ return { high, medium, low };
1088
+ }
1089
+ /**
1090
+ * Get changed files from Git
1091
+ */
1092
+ function getChangedFiles(root) {
1093
+ try {
1094
+ const output = (0, child_process_1.execSync)('git diff --name-only HEAD', {
1095
+ cwd: root,
1096
+ encoding: 'utf-8'
1097
+ });
1098
+ return output.split('\n').filter(f => f.trim()).map(f => f.trim());
1099
+ }
1100
+ catch {
1101
+ return [];
1102
+ }
1103
+ }
1104
+ /**
1105
+ * Parse line range (e.g., "42-50" or "42")
1106
+ */
1107
+ function parseLineRange(lines) {
1108
+ if (lines.includes('-')) {
1109
+ const [start, end] = lines.split('-').map(n => parseInt(n, 10));
1110
+ if (!isNaN(start) && !isNaN(end)) {
1111
+ return { start, end };
1112
+ }
1113
+ }
1114
+ else {
1115
+ const line = parseInt(lines, 10);
1116
+ if (!isNaN(line)) {
1117
+ return { start: line, end: line };
1118
+ }
1119
+ }
1120
+ return null;
1121
+ }
1122
+ /**
1123
+ * Mark agent records as DRAFT (for postflight --fix)
1124
+ */
1125
+ async function markAgentRecordsAsDraft(entries, root) {
1126
+ const memoryPath = (0, utils_js_1.getFilePath)('MEMORY', root);
1127
+ const updatedEntries = [];
1128
+ let updated = false;
1129
+ for (const entry of entries) {
1130
+ if (entry.sourceType === 'agent' && entry.memoryStatus !== 'DRAFT') {
1131
+ updatedEntries.push({
1132
+ ...entry,
1133
+ memoryStatus: 'DRAFT',
1134
+ recordVersion: (entry.recordVersion || 1) + 1,
1135
+ });
1136
+ updated = true;
1137
+ }
1138
+ else {
1139
+ updatedEntries.push(entry);
1140
+ }
1141
+ }
1142
+ if (updated) {
1143
+ // Write updated entries back
1144
+ const jsonl = updatedEntries.map(e => JSON.stringify(e)).join('\n') + '\n';
1145
+ fs.writeFileSync(memoryPath, jsonl);
1146
+ (0, utils_js_1.info)('Marked agent records as DRAFT');
1147
+ }
1148
+ }
1149
+ /**
1150
+ * Handle human override for RED status
1151
+ */
1152
+ async function handleOverride(report, root, options) {
1153
+ if (!root) {
1154
+ return report;
1155
+ }
1156
+ // Check if in strict mode (would require override)
1157
+ const config = (0, utils_js_1.readConfig)(root);
1158
+ const isStrict = config?.strict === true || config?.mode === 'enterprise';
1159
+ if (!isStrict) {
1160
+ // Developer mode: allow override but don't require it
1161
+ return report;
1162
+ }
1163
+ // In strict mode, prompt for override
1164
+ console.log('');
1165
+ (0, utils_js_1.warn)('⚠️ RED status detected - override required in strict mode');
1166
+ console.log('');
1167
+ // For now, we'll just return the report without override
1168
+ // In a full implementation, this would prompt for:
1169
+ // - approvedBy (user name/ID)
1170
+ // - reason (why override is needed)
1171
+ // For CLI, we can use environment variables or flags
1172
+ const overrideBy = process.env.MEMORYLINK_OVERRIDE_BY || options.for || 'unknown';
1173
+ const overrideReason = process.env.MEMORYLINK_OVERRIDE_REASON || 'Manual override via CLI';
1174
+ if (overrideBy !== 'unknown' || overrideReason !== 'Manual override via CLI') {
1175
+ const override = {
1176
+ approvedBy: overrideBy,
1177
+ reason: overrideReason,
1178
+ timestamp: new Date().toISOString(),
1179
+ };
1180
+ return {
1181
+ ...report,
1182
+ override,
1183
+ };
1184
+ }
1185
+ return report;
1186
+ }
1187
+ /**
1188
+ * Log override to overrides.log (JSONL)
1189
+ *
1190
+ * TODO v1.6: Enhanced override logging
1191
+ * - Add report ID reference
1192
+ * - Add issue IDs that were overridden
1193
+ * - Add context (branch, PR, agent)
1194
+ * - Add audit trail fields (who, when, why, what)
1195
+ * - Format: { approvedBy, reason, timestamp, runType, reportId, issueIds[], context: { branch, pr, agent } }
1196
+ */
1197
+ function logOverride(override, runType, root) {
1198
+ try {
1199
+ const overridesPath = path.join(root, types_js_1.MEMORYLINK_DIR, 'overrides.log');
1200
+ const entry = {
1201
+ ...override,
1202
+ runType,
1203
+ // TODO v1.6: Add reportId, issueIds[], context
1204
+ };
1205
+ const jsonlLine = JSON.stringify(entry) + '\n';
1206
+ fs.appendFileSync(overridesPath, jsonlLine, 'utf-8');
1207
+ }
1208
+ catch (err) {
1209
+ // Silently fail - override logging should not break the main flow
1210
+ }
1211
+ }
1212
+ /**
1213
+ * Print Buddy-Check report
1214
+ */
1215
+ function printBuddyReport(report) {
1216
+ // Check if stdout is writable before printing
1217
+ if (!(0, utils_js_1.isStdoutWritable)()) {
1218
+ return; // Silently return if stdout is closed
1219
+ }
1220
+ (0, utils_js_1.safeLog)('');
1221
+ (0, utils_js_1.safeLog)('\x1b[1m🔍 Buddy-Check Report\x1b[0m');
1222
+ (0, utils_js_1.safeLog)('');
1223
+ // Status indicator
1224
+ let statusColor = '\x1b[32m'; // GREEN
1225
+ let statusIcon = '●';
1226
+ if (report.status === 'YELLOW') {
1227
+ statusColor = '\x1b[33m'; // YELLOW
1228
+ }
1229
+ else if (report.status === 'RED') {
1230
+ statusColor = '\x1b[31m'; // RED
1231
+ }
1232
+ (0, utils_js_1.safeLog)(` Status: ${statusColor}${statusIcon} ${report.status}\x1b[0m`);
1233
+ (0, utils_js_1.safeLog)(` ${report.summary}`);
1234
+ (0, utils_js_1.safeLog)('');
1235
+ if (report.issues.length > 0) {
1236
+ (0, utils_js_1.safeLog)(` Issues (${report.issues.length}):`);
1237
+ for (const issue of report.issues.slice(0, 10)) {
1238
+ const severityColor = issue.severity === 'error' ? '\x1b[31m' :
1239
+ issue.severity === 'warning' ? '\x1b[33m' : '\x1b[36m';
1240
+ (0, utils_js_1.safeLog)(` ${severityColor}${issue.severity.toUpperCase()}\x1b[0m [${issue.type}] ${issue.message}`);
1241
+ if (issue.suggestion) {
1242
+ (0, utils_js_1.safeLog)(` 💡 ${issue.suggestion}`);
1243
+ }
1244
+ }
1245
+ if (report.issues.length > 10) {
1246
+ (0, utils_js_1.safeLog)(` ... and ${report.issues.length - 10} more`);
1247
+ }
1248
+ }
1249
+ else {
1250
+ (0, utils_js_1.safeLog)(' ✓ No issues found');
1251
+ }
1252
+ if (report.recordsUsed !== undefined) {
1253
+ (0, utils_js_1.safeLog)('');
1254
+ (0, utils_js_1.safeLog)(` Records: ${report.recordsUsed} checked`);
1255
+ if (report.highTrust !== undefined) {
1256
+ (0, utils_js_1.safeLog)(` Trust: ${report.highTrust} high, ${report.mediumTrust} medium, ${report.lowTrust} low`);
1257
+ }
1258
+ if (report.staleCount !== undefined && report.staleCount > 0) {
1259
+ (0, utils_js_1.safeLog)(` Stale: ${report.staleCount}`);
1260
+ }
1261
+ }
1262
+ if (report.durationMs !== undefined) {
1263
+ (0, utils_js_1.safeLog)(` Duration: ${report.durationMs}ms`);
1264
+ }
1265
+ if (report.override) {
1266
+ (0, utils_js_1.safeLog)('');
1267
+ (0, utils_js_1.warn)(`⚠️ Override: Approved by ${report.override.approvedBy}`);
1268
+ (0, utils_js_1.safeLog)(` Reason: ${report.override.reason}`);
1269
+ }
1270
+ (0, utils_js_1.safeLog)('');
1271
+ }
1272
+ //# sourceMappingURL=doctor.js.map