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.
- package/.cursorrules +0 -0
- package/.github/workflows/buddy-check.yml +105 -0
- package/.github/workflows/memorylink-preflight.yml +63 -0
- package/.github/workflows/release-on-tag.yml +58 -0
- package/.github/workflows/stress-tests.yml +79 -0
- package/.memorylinkignore +24 -0
- package/5000_SCENARIOS_TEST_RESULTS.md +174 -0
- package/ADVANCED_SCENARIOS_TEST_RESULTS.md +377 -0
- package/AGGRESSIVE_RANDOM_TEST_RESULTS.md +134 -0
- package/AI_CONSENSUS_ANALYSIS.md +138 -0
- package/AI_CONSENSUS_ANALYSIS_FINAL.md +345 -0
- package/AI_CONSENSUS_ANALYSIS_v2.md +188 -0
- package/AI_CONSENSUS_ANALYSIS_v3.md +246 -0
- package/AI_CONSENSUS_ANALYSIS_v4.md +309 -0
- package/AI_CONSENSUS_ANALYSIS_v5.md +311 -0
- package/AI_CONSENSUS_ANALYSIS_v6.md +432 -0
- package/AI_PANEL_CLARIFICATION_REQUEST.md +37 -0
- package/AI_RESPONSES_BLACKBOX.md +338 -0
- package/AI_RESPONSES_CHATGPT.md +379 -0
- package/AI_RESPONSES_CLAUDE.md +464 -0
- package/AI_RESPONSES_CONSOLIDATED.md +560 -0
- package/AI_RESPONSES_DEEPSEEK.md +341 -0
- package/AI_RESPONSES_GEMINI.md +262 -0
- package/AI_RESPONSES_GROK.md +335 -0
- package/AI_RESPONSES_MANUS.md +246 -0
- package/AI_RESPONSES_PERPLEXITY.md +295 -0
- package/AI_RESPONSES_QWEN.md +335 -0
- package/AI_REVIEW_REQUEST.md +333 -0
- package/AI_STRATEGIC_CONSENSUS_COMPARISON.md +507 -0
- package/AI_VALIDATION_AND_GAP_ANALYSIS.md +410 -0
- package/ALL_10_AI_RESPONSES_FINAL.md +435 -0
- package/ALL_3_AI_RESPONSES_FINAL.md +305 -0
- package/ALL_4_AI_RESPONSES_FINAL.md +335 -0
- package/ALL_5_AI_RESPONSES_FINAL.md +349 -0
- package/ALL_6_AI_RESPONSES_FINAL.md +354 -0
- package/ALL_7_AI_RESPONSES_FINAL.md +369 -0
- package/ALL_8_AI_RESPONSES_FINAL.md +381 -0
- package/ALL_9_AI_RESPONSES_FINAL.md +398 -0
- package/ALL_AI_RESPONSES_TRACKER.md +152 -0
- package/ALL_AI_RESPONSES_VALIDATED.md +261 -0
- package/ALL_FEATURES_COMPLETE.md +198 -0
- package/BREAK_IT_TEST_RESULTS.md +273 -0
- package/BUDDY_CHECK_STRESS_TEST_PLAN.md +1089 -0
- package/CHANGELOG.md +135 -0
- package/CHATGPT_GAP_ANALYSIS.md +286 -0
- package/CHATGPT_V2_ANALYSIS.md +109 -0
- package/CHECK_MISSING_FEATURES.md +192 -0
- package/CI_CD_INTEGRATION.md +421 -0
- package/COMPETITIVE_LAUNCH_STRATEGY.md +257 -0
- package/COMPLETE_COMPETITIVE_ANALYSIS_ALL_AIS.md +339 -0
- package/COMPLETE_DEVELOPMENT_PLAN_ALL_AIS.md +622 -0
- package/COMPREHENSIVE_FEATURE_ANALYSIS_100_PERCENT.md +423 -0
- package/COMPREHENSIVE_TEST_SUMMARY.md +314 -0
- package/CONTINUOUS_TESTING_COMPLETE.md +268 -0
- package/CONTINUOUS_TESTING_GUIDE.md +328 -0
- package/CONTINUOUS_TEST_FINAL_RESULTS.md +148 -0
- package/CONTINUOUS_TEST_INSTRUCTIONS.md +173 -0
- package/CONTINUOUS_TEST_RESULTS.md +194 -0
- package/CONTINUOUS_TEST_STATUS.md +68 -0
- package/CURSOR_AI_BUDDY_CHECK_GUIDE.md +439 -0
- package/CURSOR_AI_INTEGRATION_GUIDE.md +775 -0
- package/CURSOR_AI_V1.4_NEXT_STEPS.md +314 -0
- package/CURSOR_BREAK_IT_TEST.md +389 -0
- package/CURSOR_DOCUMENTATION_RULES.md +259 -0
- package/CURSOR_HOSTILE_TEST_DOCUMENT.md +343 -0
- package/CURSOR_PROMPTS_FOR_TESTING.md +252 -0
- package/DEPLOYMENT_GUIDE.md +493 -0
- package/DEVELOPMENT_AND_OVERNIGHT_TESTING.md +304 -0
- package/DEVELOPMENT_PROGRESS.md +185 -0
- package/DOCS_CLEANUP_SUMMARY.md +192 -0
- package/DOC_CONFIDENTIALITY_RULES.md +259 -0
- package/E2E_TEST_REPORT_v1.3.0.md +196 -0
- package/E2E_TEST_RESULTS.md +250 -0
- package/E2E_TEST_SCENARIOS.md +357 -0
- package/END_TO_END_TEST_REPORT.md +217 -0
- package/ENHANCEMENT_RECOMMENDATIONS.md +368 -0
- package/EPIPE_FIX_SUMMARY.md +177 -0
- package/FEEDBACK_TEMPLATE.md +173 -0
- package/FINAL_100_PERCENT_CONFIRMATION.md +319 -0
- package/FINAL_8_AI_CONSENSUS_SUMMARY.md +355 -0
- package/FINAL_CONFIRMATION.md +143 -0
- package/FINAL_E2E_TEST_REPORT.md +248 -0
- package/FINAL_E2E_TEST_RESULTS.md +212 -0
- package/FINAL_LAUNCH_CLARIFICATION_SUMMARY.md +101 -0
- package/FINAL_LAUNCH_PLAN_BASED_ON_AI_CONSENSUS.md +410 -0
- package/FINAL_LAUNCH_SUMMARY.md +176 -0
- package/FINAL_PRODUCT_TEST.md +316 -0
- package/FINAL_PROJECT_STATUS.md +407 -0
- package/FINAL_STATUS_REPORT.md +244 -0
- package/FINAL_STRATEGIC_PLAN_9_AIS.md +576 -0
- package/FINAL_TEST_EXECUTION_REPORT.md +252 -0
- package/FINAL_VALIDATION_DOCUMENT.md +238 -0
- package/FINAL_VALIDATION_SUMMARY.md +230 -0
- package/FIX_SPECIAL_CHARS.sh +13 -0
- package/FRESH_SCENARIOS_TEST_RESULTS.md +358 -0
- package/GAP_EVALUATION_TEMPLATE.md +146 -0
- package/GITHUB_SETUP_GUIDE.md +193 -0
- package/HOSTILE_TEST_RESULTS.md +221 -0
- package/HOW_MEMORYLINK_HELPS_AI.md +401 -0
- package/IMPLEMENTATION_PLANS_DETAILED.md +516 -0
- package/LAUNCH_CHECKLIST.md +247 -0
- package/LAUNCH_DOCS_FRAMEWORK.md +378 -0
- package/LAUNCH_READINESS.md +148 -0
- package/LAUNCH_SEQUENCE.md +137 -0
- package/LICENSE +67 -0
- package/MARKET_ANALYSIS_AND_STRATEGY.md +280 -0
- package/MASTER_AI_VERIFICATION_DOCUMENT.md +1085 -0
- package/MASTER_VALIDATION_DOCUMENT.md +818 -0
- package/MINORITY_OPINION_ANALYSIS.md +464 -0
- package/NEW_RANDOM_TEST_RESULTS.md +127 -0
- package/NEW_SCENARIOS_TEST_RESULTS.md +272 -0
- package/NEXT_ACTIONS_COMPLETE.md +137 -0
- package/NEXT_PLAN_BASED_ON_AI_ANALYSES.md +413 -0
- package/NEXT_PLAN_BASED_ON_ALL_AI_RESPONSES.md +558 -0
- package/NEXT_STEPS.md +120 -0
- package/NEXT_STEPS_ACTION_PLAN.md +369 -0
- package/NPM_2FA_FIX.md +113 -0
- package/NPM_PUBLISH_TROUBLESHOOTING.md +230 -0
- package/PERPLEXITY_AI_VALIDATION_REQUEST.md +318 -0
- package/PERPLEXITY_AI_VALIDATION_RESPONSE.md +172 -0
- package/PERPLEXITY_BREAK_IT_VALIDATION.md +262 -0
- package/PERPLEXITY_DOCS_VALIDATION.md +237 -0
- package/PERPLEXITY_FEEDBACK_ACTION_PLAN.md +271 -0
- package/PERPLEXITY_FINAL_E2E_VALIDATION.md +210 -0
- package/PERPLEXITY_FINAL_SUMMARY.md +211 -0
- package/PERPLEXITY_PHASE2_VALIDATION.md +270 -0
- package/PERPLEXITY_PHASE2_VALIDATION_RESPONSE.md +136 -0
- package/PERPLEXITY_PRIORITY2_VALIDATION.md +321 -0
- package/PERPLEXITY_TELEMETRY_EXPLANATION.md +174 -0
- package/PERPLEXITY_TELEMETRY_VALIDATION.md +118 -0
- package/PERPLEXITY_TELEMETRY_VALIDATION_RESPONSE.md +154 -0
- package/PERPLEXITY_USER_GUIDE_VALIDATION.md +236 -0
- package/PERPLEXITY_VALIDATION_REQUEST.md +427 -0
- package/PERPLEXITY_VALIDATION_REQUEST_v1.5.1.md +190 -0
- package/PHASE_2_COMPLETE.md +149 -0
- package/PRE_LAUNCH_SECURITY_AUDIT.md +155 -0
- package/PRE_LAUNCH_TEST_CYCLE.md +326 -0
- package/PRE_LAUNCH_TEST_RESULTS.md +148 -0
- package/PROJECT_STRUCTURE_PLAN.md +104 -0
- package/PUBLIC_DOCS.md +90 -0
- package/PUBLISH_CHECKLIST.md +134 -0
- package/PUSH_INSTRUCTIONS.md +120 -0
- package/QUICK_START_TEST_CYCLE.md +76 -0
- package/README.md +557 -0
- package/README_TEST_INSTRUCTIONS.md +65 -0
- package/README_v1.5.1.md +137 -0
- package/REALISTIC_ASSESSMENT.md +186 -0
- package/REAL_WORLD_VALIDATION_COMPLETE.md +98 -0
- package/RED_TEAM_TESTING_GUIDE.md +302 -0
- package/RELEASE_NOTES_v1.0.0.md +125 -0
- package/RELEASE_NOTES_v1.5.1.md +105 -0
- package/REQUEST_COUNTERS.md +22 -0
- package/ROADMAP_v1.6.md +335 -0
- package/ROUND3_RANDOM_TEST_RESULTS.md +135 -0
- package/SECURITY_MODEL.md +577 -0
- package/SESSION_SUMMARY_CURRENT_STATE.md +206 -0
- package/SESSION_SUMMARY_REVIEW.md +203 -0
- package/SINGLE_RUN_ALL_SCENARIOS_TEST.sh +129 -0
- package/STRATEGIC_QUESTIONS_FOR_AI_VALIDATION.md +277 -0
- package/STRESS_TEST_CHECK_RESULTS.md +154 -0
- package/STRESS_TEST_EXECUTION_GUIDE.md +284 -0
- package/STRESS_TEST_IMPLEMENTATION_SUMMARY.md +221 -0
- package/TELEMETRY.md +370 -0
- package/TELEMETRY_COMPLETE_SUMMARY.md +231 -0
- package/TELEMETRY_CONTROL_POLICY.md +135 -0
- package/TELEMETRY_DESIGN_SUMMARY.md +210 -0
- package/TELEMETRY_FINAL_STATUS.md +178 -0
- package/TELEMETRY_NEXT_STEPS.md +258 -0
- package/TELEMETRY_TESTING_NOTES.md +217 -0
- package/TELEMETRY_WORK_COMPLETE.md +237 -0
- package/TEST_PLAN_v1.0.1.md +194 -0
- package/TEST_RESULTS_SUMMARY.md +128 -0
- package/TREE_SITTER_EXPLANATION.md +303 -0
- package/TROUBLESHOOTING.md +62 -0
- package/ULTIMATE_SCENARIOS_TEST_RESULTS.md +366 -0
- package/USER_FEEDBACK_TEMPLATE.md +104 -0
- package/USER_GUIDE.md +809 -0
- package/V1.1_DEVELOPMENT_COMPLETE.md +299 -0
- package/V1.1_SCENARIOS_ADDED.md +161 -0
- package/V1.2_CODE_STRUCTURE_IMPLEMENTATION.md +243 -0
- package/V1.3_COMPETITIVE_LAUNCH_COMPLETE.md +253 -0
- package/V1.3_COMPETITIVE_LAUNCH_IMPLEMENTATION_PLAN.md +385 -0
- package/V1.3_TEAM_PATTERNS_IMPLEMENTATION.md +183 -0
- package/V1.4_BUILD_PLAN_IMPLEMENTATION.md +698 -0
- package/V1.4_COMPLETE_SUMMARY_FOR_AI_REVIEW.md +516 -0
- package/V1.4_COMPLETE_VALIDATION_DOCUMENT.md +601 -0
- package/V1.4_DEVELOPMENT_PROGRESS.md +117 -0
- package/V1.4_FINAL_STATUS.md +147 -0
- package/V1.4_INTEGRATION_COMPLETE.md +207 -0
- package/V1.4_INTEGRATION_TEST_RESULTS.md +181 -0
- package/V1.4_OBSERVABILITY_AND_OVERRIDE_COMPLETE.md +180 -0
- package/V1.4_PHASE_3_COMPLETE.md +135 -0
- package/V1.4_RUNTIME_TESTING_GUIDE.md +364 -0
- package/V1.4_VERIFICATION_REPORT.md +199 -0
- package/V1.5.1_COMPLETE_SUMMARY.md +234 -0
- package/V1.5.1_RELEASE_NOTES.md +206 -0
- package/V1.5.1_RELEASE_READY.md +198 -0
- package/V1.5_COMPLETE_SUMMARY.md +264 -0
- package/V1.5_COMPLETE_VERIFICATION.md +183 -0
- package/V1.5_DESIGN_NOTES.md +272 -0
- package/V1.5_FINAL_STATUS.md +224 -0
- package/V1.5_IMPLEMENTATION_SUMMARY.md +113 -0
- package/V1.5_IMPROVEMENTS_COMPLETE.md +205 -0
- package/V1.5_PHASE1_COMPLETE.md +183 -0
- package/V1.5_PHASE1_PROGRESS.md +102 -0
- package/V1.5_PHASE2_COMPLETE.md +133 -0
- package/V1.5_PHASE2_PLAN.md +185 -0
- package/V1.5_PRIORITIZATION.md +313 -0
- package/V1.5_PRIORITY2_COMPLETE.md +150 -0
- package/V1.5_TESTING_COMPLETE.md +69 -0
- package/V1.5_TEST_RESULTS.md +178 -0
- package/V1.5_VALIDATION_RESULTS.md +209 -0
- package/V1.6_GAP_TRACKING.md +118 -0
- package/VALIDATION_SUMMARY_FOR_PERPLEXITY.md +83 -0
- package/VERIFICATION_REPORT.md +220 -0
- package/VERSION_UPDATE_VERIFICATION.md +76 -0
- package/config/tsconfig.json +21 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1114 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/archive.d.ts +20 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +231 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/auto-context.d.ts +22 -0
- package/dist/commands/auto-context.d.ts.map +1 -0
- package/dist/commands/auto-context.js +172 -0
- package/dist/commands/auto-context.js.map +1 -0
- package/dist/commands/auto-log.d.ts +30 -0
- package/dist/commands/auto-log.d.ts.map +1 -0
- package/dist/commands/auto-log.js +500 -0
- package/dist/commands/auto-log.js.map +1 -0
- package/dist/commands/change.d.ts +13 -0
- package/dist/commands/change.d.ts.map +1 -0
- package/dist/commands/change.js +254 -0
- package/dist/commands/change.js.map +1 -0
- package/dist/commands/checkpoint.d.ts +26 -0
- package/dist/commands/checkpoint.d.ts.map +1 -0
- package/dist/commands/checkpoint.js +326 -0
- package/dist/commands/checkpoint.js.map +1 -0
- package/dist/commands/configure.d.ts +21 -0
- package/dist/commands/configure.d.ts.map +1 -0
- package/dist/commands/configure.js +283 -0
- package/dist/commands/configure.js.map +1 -0
- package/dist/commands/consolidate.d.ts +19 -0
- package/dist/commands/consolidate.d.ts.map +1 -0
- package/dist/commands/consolidate.js +236 -0
- package/dist/commands/consolidate.js.map +1 -0
- package/dist/commands/context.d.ts +10 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +571 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/detect.d.ts +13 -0
- package/dist/commands/detect.d.ts.map +1 -0
- package/dist/commands/detect.js +187 -0
- package/dist/commands/detect.js.map +1 -0
- package/dist/commands/doctor.d.ts +19 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +1272 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +95 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/graph.d.ts +25 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +208 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/hooks.d.ts +9 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +240 -0
- package/dist/commands/hooks.js.map +1 -0
- package/dist/commands/impact.d.ts +18 -0
- package/dist/commands/impact.d.ts.map +1 -0
- package/dist/commands/impact.js +163 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/index-vector.d.ts +13 -0
- package/dist/commands/index-vector.d.ts.map +1 -0
- package/dist/commands/index-vector.js +103 -0
- package/dist/commands/index-vector.js.map +1 -0
- package/dist/commands/index.d.ts +37 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +105 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +200 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inject.d.ts +22 -0
- package/dist/commands/inject.d.ts.map +1 -0
- package/dist/commands/inject.js +394 -0
- package/dist/commands/inject.js.map +1 -0
- package/dist/commands/learn.d.ts +13 -0
- package/dist/commands/learn.d.ts.map +1 -0
- package/dist/commands/learn.js +282 -0
- package/dist/commands/learn.js.map +1 -0
- package/dist/commands/lock.d.ts +35 -0
- package/dist/commands/lock.d.ts.map +1 -0
- package/dist/commands/lock.js +308 -0
- package/dist/commands/lock.js.map +1 -0
- package/dist/commands/memory.d.ts +15 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +366 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/migrate.d.ts +22 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +458 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/patterns.d.ts +18 -0
- package/dist/commands/patterns.d.ts.map +1 -0
- package/dist/commands/patterns.js +120 -0
- package/dist/commands/patterns.js.map +1 -0
- package/dist/commands/protect.d.ts +12 -0
- package/dist/commands/protect.d.ts.map +1 -0
- package/dist/commands/protect.js +181 -0
- package/dist/commands/protect.js.map +1 -0
- package/dist/commands/quickstart.d.ts +11 -0
- package/dist/commands/quickstart.d.ts.map +1 -0
- package/dist/commands/quickstart.js +256 -0
- package/dist/commands/quickstart.js.map +1 -0
- package/dist/commands/repair.d.ts +13 -0
- package/dist/commands/repair.d.ts.map +1 -0
- package/dist/commands/repair.js +157 -0
- package/dist/commands/repair.js.map +1 -0
- package/dist/commands/resolve.d.ts +19 -0
- package/dist/commands/resolve.d.ts.map +1 -0
- package/dist/commands/resolve.js +355 -0
- package/dist/commands/resolve.js.map +1 -0
- package/dist/commands/roadmap.d.ts +5 -0
- package/dist/commands/roadmap.d.ts.map +1 -0
- package/dist/commands/roadmap.js +23 -0
- package/dist/commands/roadmap.js.map +1 -0
- package/dist/commands/scopes.d.ts +10 -0
- package/dist/commands/scopes.d.ts.map +1 -0
- package/dist/commands/scopes.js +80 -0
- package/dist/commands/scopes.js.map +1 -0
- package/dist/commands/search.d.ts +9 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +313 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/setup.d.ts +13 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +405 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/snippet.d.ts +23 -0
- package/dist/commands/snippet.d.ts.map +1 -0
- package/dist/commands/snippet.js +235 -0
- package/dist/commands/snippet.js.map +1 -0
- package/dist/commands/stats.d.ts +15 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +502 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +134 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/suggest-tags.d.ts +9 -0
- package/dist/commands/suggest-tags.d.ts.map +1 -0
- package/dist/commands/suggest-tags.js +95 -0
- package/dist/commands/suggest-tags.js.map +1 -0
- package/dist/commands/sync-rules.d.ts +14 -0
- package/dist/commands/sync-rules.d.ts.map +1 -0
- package/dist/commands/sync-rules.js +211 -0
- package/dist/commands/sync-rules.js.map +1 -0
- package/dist/commands/sync.d.ts +24 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +330 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/telemetry-test.d.ts +24 -0
- package/dist/commands/telemetry-test.d.ts.map +1 -0
- package/dist/commands/telemetry-test.js +84 -0
- package/dist/commands/telemetry-test.js.map +1 -0
- package/dist/commands/template.d.ts +16 -0
- package/dist/commands/template.d.ts.map +1 -0
- package/dist/commands/template.js +122 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/commands/validate.d.ts +11 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +144 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/watch-preferences.d.ts +17 -0
- package/dist/commands/watch-preferences.d.ts.map +1 -0
- package/dist/commands/watch-preferences.js +172 -0
- package/dist/commands/watch-preferences.js.map +1 -0
- package/dist/commands/watch.d.ts +11 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +223 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config/thresholds.d.ts +8 -0
- package/dist/config/thresholds.d.ts.map +1 -0
- package/dist/config/thresholds.js +10 -0
- package/dist/config/thresholds.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/memorylink.d.ts +91 -0
- package/dist/memorylink.d.ts.map +1 -0
- package/dist/memorylink.js +208 -0
- package/dist/memorylink.js.map +1 -0
- package/dist/search/local-embeddings.d.ts +21 -0
- package/dist/search/local-embeddings.d.ts.map +1 -0
- package/dist/search/local-embeddings.js +87 -0
- package/dist/search/local-embeddings.js.map +1 -0
- package/dist/search/vector-search.d.ts +58 -0
- package/dist/search/vector-search.d.ts.map +1 -0
- package/dist/search/vector-search.js +535 -0
- package/dist/search/vector-search.js.map +1 -0
- package/dist/server/mcp-server.d.ts +18 -0
- package/dist/server/mcp-server.d.ts.map +1 -0
- package/dist/server/mcp-server.js +293 -0
- package/dist/server/mcp-server.js.map +1 -0
- package/dist/telemetry.d.ts +92 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +339 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/telemetry.test.d.ts +13 -0
- package/dist/telemetry.test.d.ts.map +1 -0
- package/dist/telemetry.test.js +324 -0
- package/dist/telemetry.test.js.map +1 -0
- package/dist/test-runner/TestRunner.d.ts +68 -0
- package/dist/test-runner/TestRunner.d.ts.map +1 -0
- package/dist/test-runner/TestRunner.js +384 -0
- package/dist/test-runner/TestRunner.js.map +1 -0
- package/dist/test-runner/performance-test.d.ts +36 -0
- package/dist/test-runner/performance-test.d.ts.map +1 -0
- package/dist/test-runner/performance-test.js +163 -0
- package/dist/test-runner/performance-test.js.map +1 -0
- package/dist/test-runner/run-tests.d.ts +7 -0
- package/dist/test-runner/run-tests.d.ts.map +1 -0
- package/dist/test-runner/run-tests.js +167 -0
- package/dist/test-runner/run-tests.js.map +1 -0
- package/dist/types.d.ts +400 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +81 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/batch-commits.d.ts +48 -0
- package/dist/utils/batch-commits.d.ts.map +1 -0
- package/dist/utils/batch-commits.js +164 -0
- package/dist/utils/batch-commits.js.map +1 -0
- package/dist/utils/code-structure.d.ts +62 -0
- package/dist/utils/code-structure.d.ts.map +1 -0
- package/dist/utils/code-structure.js +582 -0
- package/dist/utils/code-structure.js.map +1 -0
- package/dist/utils/commit-patterns.d.ts +24 -0
- package/dist/utils/commit-patterns.d.ts.map +1 -0
- package/dist/utils/commit-patterns.js +78 -0
- package/dist/utils/commit-patterns.js.map +1 -0
- package/dist/utils/observability.d.ts +47 -0
- package/dist/utils/observability.d.ts.map +1 -0
- package/dist/utils/observability.js +137 -0
- package/dist/utils/observability.js.map +1 -0
- package/dist/utils/quality.d.ts +32 -0
- package/dist/utils/quality.d.ts.map +1 -0
- package/dist/utils/quality.js +207 -0
- package/dist/utils/quality.js.map +1 -0
- package/dist/utils/semantic-search.d.ts +29 -0
- package/dist/utils/semantic-search.d.ts.map +1 -0
- package/dist/utils/semantic-search.js +167 -0
- package/dist/utils/semantic-search.js.map +1 -0
- package/dist/utils/streaming.d.ts +24 -0
- package/dist/utils/streaming.d.ts.map +1 -0
- package/dist/utils/streaming.js +121 -0
- package/dist/utils/streaming.js.map +1 -0
- package/dist/utils/tag-suggestions.d.ts +18 -0
- package/dist/utils/tag-suggestions.d.ts.map +1 -0
- package/dist/utils/tag-suggestions.js +103 -0
- package/dist/utils/tag-suggestions.js.map +1 -0
- package/dist/utils/team-patterns.d.ts +48 -0
- package/dist/utils/team-patterns.d.ts.map +1 -0
- package/dist/utils/team-patterns.js +413 -0
- package/dist/utils/team-patterns.js.map +1 -0
- package/dist/utils/templates.d.ts +36 -0
- package/dist/utils/templates.d.ts.map +1 -0
- package/dist/utils/templates.js +200 -0
- package/dist/utils/templates.js.map +1 -0
- package/dist/utils/tree-sitter-parser.d.ts +20 -0
- package/dist/utils/tree-sitter-parser.d.ts.map +1 -0
- package/dist/utils/tree-sitter-parser.js +259 -0
- package/dist/utils/tree-sitter-parser.js.map +1 -0
- package/dist/utils/v1.6-patterns.d.ts +117 -0
- package/dist/utils/v1.6-patterns.d.ts.map +1 -0
- package/dist/utils/v1.6-patterns.js +201 -0
- package/dist/utils/v1.6-patterns.js.map +1 -0
- package/dist/utils.d.ts +176 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +822 -0
- package/dist/utils.js.map +1 -0
- package/docs/1000_SCENARIOS_TEST_RESULTS.md +138 -0
- package/docs/1000_UNIQUE_SCENARIOS_TEST.md +171 -0
- package/docs/100_PERCENT_PASS_RATE_VERIFICATION.md +111 -0
- package/docs/5000_SCENARIOS_ISSUE_ANALYSIS.md +96 -0
- package/docs/5000_SCENARIOS_TEST_PLAN.md +281 -0
- package/docs/AGENT_CONTRACT.md +240 -0
- package/docs/AI_RESPONSE_ANALYZER.md +157 -0
- package/docs/AI_RESPONSE_TRACKER.md +923 -0
- package/docs/AI_TESTING_PROMPT.md +307 -0
- package/docs/AI_VALIDATION_PROMPTS.md +366 -0
- package/docs/ALL_AI_ANALYSES_CONSOLIDATED.md +354 -0
- package/docs/ALL_AI_CONSOLIDATION_FINAL.md +372 -0
- package/docs/ALL_AI_TEST_CONSOLIDATION.md +290 -0
- package/docs/ALL_AI_VALIDATION_SYNTHESIS.md +241 -0
- package/docs/BEST_TESTING_SOLUTION.md +227 -0
- package/docs/BLACKBOX_AI_ANALYSIS.md +288 -0
- package/docs/BLACKBOX_AI_CLARIFICATION.md +55 -0
- package/docs/BLACKBOX_AI_STRATEGIC_VALIDATION.md +283 -0
- package/docs/BLACKBOX_AI_VALIDATION_RESPONSE.md +251 -0
- package/docs/BLACKBOX_AI_VALIDATION_RESPONSE_v2.md +402 -0
- package/docs/BLACKBOX_LAUNCH_VALIDATION.md +25 -0
- package/docs/BLACKBOX_SUPERMEMORY_VALIDATION_AND_PLAN.md +50 -0
- package/docs/CAPACITY_AND_ALTERNATIVES_ANALYSIS.md +289 -0
- package/docs/CHATGPT_AI_CLARIFICATION.md +65 -0
- package/docs/CHATGPT_FINAL_VALIDATION.md +348 -0
- package/docs/CHATGPT_IMPLEMENTATION_GUIDE.md +325 -0
- package/docs/CHATGPT_LAUNCH_VALIDATION.md +47 -0
- package/docs/CHATGPT_MEMORY_QUALITY_AND_VSCODE_CHECK.md +43 -0
- package/docs/CHATGPT_SCOPE_REALITY_CHECK.md +35 -0
- package/docs/CHATGPT_STRATEGIC_VALIDATION.md +329 -0
- package/docs/CHATGPT_VALIDATION_RESPONSE.md +332 -0
- package/docs/CHATGPT_VALIDATION_RESPONSE_v2.md +294 -0
- package/docs/CHATGPT_VALIDATION_RESULTS.md +143 -0
- package/docs/CLAUDE_AI_ANALYSIS.md +692 -0
- package/docs/CLAUDE_AI_CLARIFICATION.md +67 -0
- package/docs/CLAUDE_AI_STRATEGIC_VALIDATION.md +578 -0
- package/docs/CLAUDE_AI_VALIDATION_RESPONSE.md +374 -0
- package/docs/CLAUDE_AI_VALIDATION_RESPONSE_v2.md +463 -0
- package/docs/CLAUDE_FINAL_VALIDATION.md +679 -0
- package/docs/CLAUDE_LAUNCH_VALIDATION.md +27 -0
- package/docs/CLAUDE_SUPERMEMORY_LAUNCH_PRIORITIES.md +44 -0
- package/docs/CLAUDE_UNIVERSAL_VISION.md +18 -0
- package/docs/COMPLETE_AI_VALIDATION_SYNTHESIS.md +229 -0
- package/docs/COMPLETE_MEMORY_ANALYSIS_SUMMARY.md +323 -0
- package/docs/COMPLETE_STRATEGIC_LAUNCH_PLAN.md +241 -0
- package/docs/COPILOT_LANGCHAIN_MEMORY_COMPARISON_AND_PLAN.md +43 -0
- package/docs/CRITICAL_FIXES_ACTION_PLAN.md +251 -0
- package/docs/CRITICAL_MEMORY_USAGE_PROMPTS.md +290 -0
- package/docs/CURSOR_AI_MEMORY_ANALYSIS.md +479 -0
- package/docs/CURSOR_AI_MEMORY_WORKFLOW_ANALYSIS.md +267 -0
- package/docs/CURSOR_AI_TEST_RESULTS.md +298 -0
- package/docs/DEEPSEEK_AI_CLARIFICATION.md +52 -0
- package/docs/DEEPSEEK_AI_IMPLEMENTATION_GUIDE.md +398 -0
- package/docs/DEEPSEEK_AI_STRATEGIC_VALIDATION.md +348 -0
- package/docs/DEEPSEEK_AI_VALIDATION_RESPONSE.md +276 -0
- package/docs/DEEPSEEK_AI_VALIDATION_RESPONSE_v2.md +325 -0
- package/docs/DEEPSEEK_FINAL_VALIDATION.md +337 -0
- package/docs/DEEPSEEK_LAUNCH_VALIDATION.md +55 -0
- package/docs/DEEPSEEK_SCOPE_REALITY_CHECK.md +30 -0
- package/docs/DEEPSEEK_SUPERMEMORY_ADOPTION_AND_VSCODE_PIVOT.md +47 -0
- package/docs/DEEPSEEK_VALIDATION_RESULTS.md +165 -0
- package/docs/DEVELOPMENT_TESTING_PROTOCOL.md +378 -0
- package/docs/E2E_TEST_RESULTS.md +102 -0
- package/docs/END_TO_END_MEMORY_ISSUE_ANALYSIS.md +442 -0
- package/docs/FEATURE_1_GIT_SYNC_PLAN.md +228 -0
- package/docs/FEATURE_2_AUTO_LOGGING_PLAN.md +239 -0
- package/docs/FEATURE_3_CODE_SNIPPET_PLAN.md +249 -0
- package/docs/FEATURE_4_TAG_NORMALIZATION_PLAN.md +211 -0
- package/docs/FEATURE_5_WINDOWS_PATH_HANDLING_PLAN.md +199 -0
- package/docs/FEATURE_6_CONFLICT_DETECTION_PLAN.md +126 -0
- package/docs/FEATURE_IMPLEMENTATION_REPORT.md +203 -0
- package/docs/FINAL_COMPLETE_LAUNCH_DECISION.md +255 -0
- package/docs/FINAL_LAUNCH_DECISION.md +235 -0
- package/docs/FINAL_LAUNCH_DECISION_ALL_AIS.md +226 -0
- package/docs/FINAL_SCENARIO_VERIFICATION.md +363 -0
- package/docs/FIX_100_PERCENT_ANALYSIS.md +133 -0
- package/docs/FRAMEWORK_STRUCTURE.md +94 -0
- package/docs/GEMINI_AI_ANALYSIS.md +156 -0
- package/docs/GEMINI_AI_CLARIFICATION.md +47 -0
- package/docs/GEMINI_AI_STRATEGIC_VALIDATION.md +235 -0
- package/docs/GEMINI_AI_VALIDATION_RESPONSE.md +238 -0
- package/docs/GEMINI_AI_VALIDATION_RESPONSE_v2.md +168 -0
- package/docs/GEMINI_FINAL_VALIDATION.md +204 -0
- package/docs/GEMINI_LAUNCH_VALIDATION.md +30 -0
- package/docs/GEMINI_SCOPE_AND_UNIVERSALITY_DEBATE.md +25 -0
- package/docs/GEMINI_SUPERMEMORY_TREE_SITTER_MANDATE.md +43 -0
- package/docs/GEMINI_VALIDATION_RESULTS.md +183 -0
- package/docs/GROK_AI_ANALYSIS.md +278 -0
- package/docs/GROK_AI_CLARIFICATION.md +52 -0
- package/docs/GROK_AI_STRATEGIC_VALIDATION.md +306 -0
- package/docs/GROK_AI_VALIDATION_RESPONSE.md +252 -0
- package/docs/GROK_AI_VALIDATION_RESPONSE_v2.md +264 -0
- package/docs/GROK_FINAL_VALIDATION.md +251 -0
- package/docs/GROK_LAUNCH_VALIDATION.md +24 -0
- package/docs/GROK_SCOPE_REALITY_CHECK.md +28 -0
- package/docs/GROK_SUPERMEMORY_LAUNCH_ANALYSIS.md +44 -0
- package/docs/GROK_VALIDATION_RESULTS.md +180 -0
- package/docs/IMPLEMENTATION_PLAN_16_CRITICAL_FIXES.md +641 -0
- package/docs/LANGCHAIN_AND_LANGGRAPH_INTEGRATION_PLAN.md +51 -0
- package/docs/LAUNCH_DECISION_FINAL.md +243 -0
- package/docs/MANUS_AI_ANALYSIS.md +171 -0
- package/docs/MANUS_AI_CLARIFICATION.md +43 -0
- package/docs/MANUS_AI_VALIDATION_RESPONSE.md +335 -0
- package/docs/MANUS_AI_VALIDATION_RESPONSE_v2.md +226 -0
- package/docs/MANUS_FINAL_VALIDATION.md +257 -0
- package/docs/MANUS_VALIDATION_RESULTS.md +237 -0
- package/docs/MCP_SERVER_SETUP.md +167 -0
- package/docs/MEMORYLINK_7AI_FINAL_CONFIRMATION.md +210 -0
- package/docs/MEMORYLINK_CURSOR_AI_DEVELOPMENT_GUIDE.md +1092 -0
- package/docs/MEMORYLINK_DEVELOPMENT_PLAN_CURSOR_AI.md +629 -0
- package/docs/MEMORYLINK_FINAL_7AI_CLARIFICATION.md +184 -0
- package/docs/MEMORYLINK_MASTER_DOCUMENT_v4.md +1338 -0
- package/docs/MEMORYLINK_NAMING_ANALYSIS.md +427 -0
- package/docs/MEMORYLINK_REAL_WORLD_SCENARIOS.md +3517 -0
- package/docs/MEMORYLINK_STORAGE_COMPARISON.md +498 -0
- package/docs/MEMORYLINK_V1.0_FINAL_IMPLEMENTATION_PLAN.md +285 -0
- package/docs/MEMORYLINK_VALIDATION_COMPLETE_ANALYSIS.md +207 -0
- package/docs/MEMORYLINK_VS_MEMORY_APPS_ANALYSIS.md +667 -0
- package/docs/MEMORYLINK_v1.0_BUILD_DOCUMENT_FINAL.md +1928 -0
- package/docs/MEMORY_USAGE_FIX_IMPLEMENTATION.md +314 -0
- package/docs/MISTRAL_AI_ANALYSIS.md +189 -0
- package/docs/MISTRAL_AI_CLARIFICATION.md +57 -0
- package/docs/MISTRAL_AI_STRATEGIC_VALIDATION.md +334 -0
- package/docs/MISTRAL_AI_TESTING_REQUEST.md +261 -0
- package/docs/MISTRAL_AI_VALIDATION_RESPONSE.md +446 -0
- package/docs/MISTRAL_AI_VALIDATION_RESPONSE_v2.md +227 -0
- package/docs/MISTRAL_FINAL_VALIDATION.md +398 -0
- package/docs/MISTRAL_LAUNCH_VALIDATION.md +32 -0
- package/docs/MISTRAL_SCOPE_REALITY_CHECK.md +32 -0
- package/docs/MISTRAL_SUPERMEMORY_LAUNCH_ANALYSIS.md +43 -0
- package/docs/MISTRAL_VALIDATION_RESULTS.md +371 -0
- package/docs/NEXT_PLAN.md +300 -0
- package/docs/PERPLEXITY_AI_ANALYSIS.md +285 -0
- package/docs/PERPLEXITY_AI_CLARIFICATION.md +57 -0
- package/docs/PERPLEXITY_AI_STRATEGIC_VALIDATION.md +288 -0
- package/docs/PERPLEXITY_AI_VALIDATION_RESPONSE.md +350 -0
- package/docs/PERPLEXITY_AI_VALIDATION_RESPONSE_v2.md +260 -0
- package/docs/PERPLEXITY_FINAL_VALIDATION.md +320 -0
- package/docs/PERPLEXITY_LAUNCH_VALIDATION.md +42 -0
- package/docs/PERPLEXITY_MEMORY_QUALITY_AND_VSCODE_PLAN.md +56 -0
- package/docs/PERPLEXITY_SCOPE_REALITY_CHECK.md +31 -0
- package/docs/PERPLEXITY_VALIDATION_RESULTS.md +154 -0
- package/docs/PRE_LAUNCH_GAP_ANALYSIS.md +663 -0
- package/docs/PROJECT_STRUCTURE_PLAN.md +104 -0
- package/docs/QWEN_AI_ANALYSIS.md +176 -0
- package/docs/QWEN_AI_CLARIFICATION.md +60 -0
- package/docs/QWEN_AI_STRATEGIC_VALIDATION.md +241 -0
- package/docs/QWEN_AI_VALIDATION_RESPONSE.md +197 -0
- package/docs/QWEN_AI_VALIDATION_RESPONSE_v2.md +186 -0
- package/docs/QWEN_FINAL_VALIDATION.md +284 -0
- package/docs/QWEN_LAUNCH_VALIDATION.md +26 -0
- package/docs/QWEN_SCENARIOS_TEST_RESULTS.md +244 -0
- package/docs/QWEN_SCOPE_REALITY_CHECK.md +26 -0
- package/docs/QWEN_SUPERMEMORY_LAUNCH_AND_ENFORCEMENT_PLAN.md +56 -0
- package/docs/QWEN_VALIDATION_RESULTS.md +185 -0
- package/docs/README.md +479 -0
- package/docs/REAL_PRODUCT_LAUNCH_DECISION.md +185 -0
- package/docs/RECIPES.md +424 -0
- package/docs/RELEASE_NOTES_v1.0.0.md +193 -0
- package/docs/SCENARIO_INVENTORY_AND_VERIFICATION.md +284 -0
- package/docs/SINGLE_RUN_1018_SCENARIOS_RESULTS.md +142 -0
- package/docs/TESTING.md +256 -0
- package/docs/TESTING_STRATEGY.md +194 -0
- package/docs/TROUBLESHOOTING.md +188 -0
- package/docs/ULTIMATE_LAUNCH_DECISION.md +246 -0
- package/docs/WHAT_WE_BUILT.md +504 -0
- package/docs/v1.0_LAUNCH_CHECKLIST.md +104 -0
- package/examples/README.md +199 -0
- package/examples/chatgpt-context.js +161 -0
- package/examples/ci-integration.js +288 -0
- package/examples/sync-from-cursor.js +196 -0
- package/extensions/vscode/README.md +25 -0
- package/extensions/vscode/out/buddy-check.js +208 -0
- package/extensions/vscode/out/buddy-check.js.map +1 -0
- package/extensions/vscode/out/extension.js +413 -0
- package/extensions/vscode/out/extension.js.map +1 -0
- package/extensions/vscode/out/sidebar.js +409 -0
- package/extensions/vscode/out/sidebar.js.map +1 -0
- package/extensions/vscode/package.json +92 -0
- package/extensions/vscode/src/buddy-check.ts +220 -0
- package/extensions/vscode/src/extension.ts +425 -0
- package/extensions/vscode/src/shims-vscode.d.ts +2 -0
- package/extensions/vscode/src/sidebar.ts +431 -0
- package/extensions/vscode/tsconfig.json +14 -0
- package/k6-load-test.js +86 -0
- package/package.json +68 -0
- package/run-professional-tests.sh +72 -0
- package/scripts/monitor-continuous-test.sh +17 -0
- package/scripts/reorganize-project.sh +164 -0
- package/scripts/run-tests-parallel.sh +111 -0
- package/scripts/run-tests.sh +30 -0
- package/scripts/setup-framework.sh +139 -0
- package/scripts/setup-testing.sh +96 -0
- package/scripts/stress-test/README.md +86 -0
- package/scripts/stress-test/create-all-scenarios.sh +17 -0
- package/scripts/stress-test/create-remaining-scenarios.sh +3 -0
- package/scripts/stress-test/dev-test.sh +21 -0
- package/scripts/stress-test/monitor-continuous.sh +149 -0
- package/scripts/stress-test/overnight-test.sh +30 -0
- package/scripts/stress-test/quick-test.sh +21 -0
- package/scripts/stress-test/run-all-tests.sh +157 -0
- package/scripts/stress-test/run-continuous.sh +300 -0
- package/scripts/stress-test/run-stress-test.sh +153 -0
- package/scripts/stress-test/set1/1_1_mass_refactoring.sh +117 -0
- package/scripts/stress-test/set1/1_1_mass_refactoring_simple.sh +117 -0
- package/scripts/stress-test/set1/1_2_function_rename.sh +95 -0
- package/scripts/stress-test/set1/1_3_feature_flags.sh +93 -0
- package/scripts/stress-test/set1/1_4_feature_removal.sh +57 -0
- package/scripts/stress-test/set1/1_5_schema_changes.sh +42 -0
- package/scripts/stress-test/set1/1_6_dependency_update.sh +47 -0
- package/scripts/stress-test/set1/1_7_config_modification.sh +53 -0
- package/scripts/stress-test/set2/2_1_payment_logging.sh +49 -0
- package/scripts/stress-test/set2/2_2_test_data_generation.sh +43 -0
- package/scripts/stress-test/set2/2_3_documentation_leak.sh +45 -0
- package/scripts/stress-test/set2/2_4_api_key_rotation.sh +45 -0
- package/scripts/stress-test/set2/2_5_hardcoded_secrets.sh +45 -0
- package/scripts/stress-test/set2/2_6_debug_output.sh +49 -0
- package/scripts/stress-test/set3/3_1_billing_modification.sh +47 -0
- package/scripts/stress-test/set3/3_2_migration_deletion.sh +43 -0
- package/scripts/stress-test/set3/3_3_auth_middleware.sh +52 -0
- package/scripts/stress-test/set3/3_4_permission_bypass.sh +48 -0
- package/scripts/stress-test/set3/3_5_config_modification.sh +43 -0
- package/scripts/stress-test/set3/3_6_core_library.sh +51 -0
- package/scripts/stress-test/set3/3_7_test_infrastructure.sh +49 -0
- package/scripts/stress-test/set4/4_1_concurrent_features.sh +49 -0
- package/scripts/stress-test/set4/4_2_lock_acquisition.sh +32 -0
- package/scripts/stress-test/set4/4_3_migration_hotfix.sh +43 -0
- package/scripts/stress-test/set4/4_4_overlapping_scopes.sh +50 -0
- package/scripts/stress-test/set4/4_5_lock_timeout.sh +34 -0
- package/scripts/stress-test/set4/4_6_concurrent_stats.sh +33 -0
- package/scripts/stress-test/set5/5_1_wrong_decision.sh +41 -0
- package/scripts/stress-test/set5/5_2_outdated_docs.sh +40 -0
- package/scripts/stress-test/set5/5_3_conflicting_memories.sh +34 -0
- package/scripts/stress-test/set5/5_4_deleted_file_references.sh +38 -0
- package/scripts/stress-test/set5/5_5_old_pattern.sh +41 -0
- package/scripts/stress-test/set5/5_6_wrong_architecture.sh +42 -0
- package/scripts/stress-test/set5/5_7_high_trust_stale.sh +46 -0
- package/scripts/stress-test/set5/5_8_observability_stale.sh +36 -0
- package/scripts/stress-test/setup-test-repo-simple.sh +144 -0
- package/scripts/stress-test/setup-test-repo.sh +154 -0
- package/scripts/stress-test/start-continuous.sh +48 -0
- package/scripts/stress-test/stop-continuous.sh +42 -0
- package/scripts/stress-test/template-scenario.sh +115 -0
- package/scripts/test-advanced-scenarios.sh +411 -0
- package/scripts/test-continuous-30min.sh +307 -0
- package/scripts/test-continuous-enhanced.sh +250 -0
- package/scripts/test-e2e-comprehensive.sh +114 -0
- package/scripts/test-e2e-random.sh +359 -0
- package/scripts/test-fresh-scenarios.sh +412 -0
- package/scripts/test-new-scenarios.sh +374 -0
- package/scripts/test-quick-random.sh +97 -0
- package/scripts/test-runtime.sh +129 -0
- package/scripts/test-telemetry-local.sh +193 -0
- package/scripts/test-ultimate-scenarios.sh +428 -0
- package/scripts/test-v1.5-complete.sh +225 -0
- package/scripts/test-v1.5-phase1.sh +222 -0
- package/src/cli.ts +1259 -0
- package/src/commands/archive.ts +252 -0
- package/src/commands/auto-context.ts +159 -0
- package/src/commands/auto-log.ts +531 -0
- package/src/commands/change.ts +298 -0
- package/src/commands/checkpoint.ts +390 -0
- package/src/commands/configure.ts +297 -0
- package/src/commands/consolidate.ts +263 -0
- package/src/commands/context.ts +618 -0
- package/src/commands/detect.ts +181 -0
- package/src/commands/doctor.ts +1468 -0
- package/src/commands/export.ts +77 -0
- package/src/commands/graph.ts +214 -0
- package/src/commands/hooks.ts +245 -0
- package/src/commands/impact.ts +163 -0
- package/src/commands/index-vector.ts +126 -0
- package/src/commands/index.ts +57 -0
- package/src/commands/init.ts +194 -0
- package/src/commands/inject.ts +440 -0
- package/src/commands/learn.ts +328 -0
- package/src/commands/lock.ts +345 -0
- package/src/commands/memory.ts +415 -0
- package/src/commands/migrate.ts +540 -0
- package/src/commands/patterns.ts +158 -0
- package/src/commands/protect.ts +199 -0
- package/src/commands/quickstart.ts +259 -0
- package/src/commands/resolve.ts +373 -0
- package/src/commands/roadmap.ts +25 -0
- package/src/commands/scopes.ts +113 -0
- package/src/commands/search.ts +365 -0
- package/src/commands/setup.ts +430 -0
- package/src/commands/snippet.ts +271 -0
- package/src/commands/stats.ts +591 -0
- package/src/commands/status.ts +127 -0
- package/src/commands/suggest-tags.ts +122 -0
- package/src/commands/sync-rules.ts +218 -0
- package/src/commands/sync.ts +363 -0
- package/src/commands/telemetry-test.ts +97 -0
- package/src/commands/template.ts +166 -0
- package/src/commands/validate.ts +191 -0
- package/src/commands/watch-preferences.ts +162 -0
- package/src/commands/watch.ts +239 -0
- package/src/config/thresholds.ts +14 -0
- package/src/index.ts +12 -0
- package/src/memorylink.ts +308 -0
- package/src/search/local-embeddings.ts +94 -0
- package/src/search/vector-search.ts +608 -0
- package/src/server/mcp-server.ts +355 -0
- package/src/telemetry.ts +391 -0
- package/src/test-runner/TestRunner.ts +421 -0
- package/src/test-runner/performance-test.ts +161 -0
- package/src/test-runner/run-tests.ts +152 -0
- package/src/types.ts +533 -0
- package/src/utils/batch-commits.ts +162 -0
- package/src/utils/code-structure.ts +686 -0
- package/src/utils/commit-patterns.ts +87 -0
- package/src/utils/observability.ts +149 -0
- package/src/utils/quality.ts +230 -0
- package/src/utils/semantic-search.ts +222 -0
- package/src/utils/streaming.ts +109 -0
- package/src/utils/tag-suggestions.ts +117 -0
- package/src/utils/team-patterns.ts +499 -0
- package/src/utils/templates.ts +181 -0
- package/src/utils/tree-sitter-parser.ts +246 -0
- package/src/utils/v1.6-patterns.ts +227 -0
- package/src/utils.ts +885 -0
- package/test-all-features.sh +102 -0
- package/test-all-implemented-features.sh +209 -0
- package/test-all-new-features.sh +171 -0
- package/test-auto-log.txt +1 -0
- package/test-batch-commits.sh +47 -0
- package/test-conflict-resolution.sh +47 -0
- package/test-e2e.sh +22 -0
- package/test-end-to-end.sh +151 -0
- package/test-enhanced-autocapture.sh +164 -0
- package/test-inject.sh +44 -0
- package/test-mcp-server.sh +67 -0
- package/test-pagination.sh +37 -0
- package/test-python-go-structure.sh +164 -0
- package/test-quality-validation.sh +167 -0
- package/test-results-quick-smoke.json +13 -0
- package/test-results-targeted-perf.json +23 -0
- package/test-results.json +2272 -0
- package/test-scenarios/payment-logging.ts +17 -0
- package/test-scenarios/test-config.ts +13 -0
- package/test-semantic-search.sh +161 -0
- package/test-tag-intelligence.sh +49 -0
- package/test-vector-search.sh +64 -0
- package/test-vscode-extension.sh +144 -0
- package/test-watcher-file.txt +2 -0
- package/test-watcher-file2.txt +1 -0
- package/test-watcher.sh +103 -0
- package/test_qwen_scenarios.sh +285 -0
- package/tests/scenarios/4000_HARD_SCENARIOS.sh +4137 -0
- package/tests/scenarios/ADD_V1.1_SCENARIOS.sh +93 -0
- package/tests/scenarios/AGGRESSIVE_RANDOM_E2E_TEST.sh +474 -0
- package/tests/scenarios/COMPLETE_PRODUCT_VALIDATION.sh +227 -0
- package/tests/scenarios/COMPREHENSIVE_E2E_TEST.sh +426 -0
- package/tests/scenarios/CONTINUOUS_RANDOM_STRESS_TEST.sh +240 -0
- package/tests/scenarios/EXECUTE_10000_SCENARIOS.sh +61 -0
- package/tests/scenarios/EXECUTE_1000_UNIQUE_SCENARIOS.sh +190 -0
- package/tests/scenarios/EXECUTE_5000_SCENARIOS_SPLIT.sh +192 -0
- package/tests/scenarios/EXECUTE_5000_TOTAL_SCENARIOS.sh +162 -0
- package/tests/scenarios/EXECUTE_5040_SCENARIOS_WITH_V1.1.sh +251 -0
- package/tests/scenarios/EXECUTE_8_BATCHES_500.sh +51 -0
- package/tests/scenarios/EXECUTE_QUICK_SMOKE.sh +9 -0
- package/tests/scenarios/EXECUTE_SINGLE_BATCH.sh +117 -0
- package/tests/scenarios/EXECUTE_TARGETED_PERF.sh +19 -0
- package/tests/scenarios/GENERATE_1000_SCENARIOS.sh +235 -0
- package/tests/scenarios/GENERATE_4000_HARD_SCENARIOS.sh +266 -0
- package/tests/scenarios/GENERATE_4000_HARD_SCENARIOS_FIXED.sh +267 -0
- package/tests/scenarios/GENERATE_4000_HARD_SCENARIOS_FIXED_V2.sh +267 -0
- package/tests/scenarios/NEW_RANDOM_E2E_TEST.sh +422 -0
- package/tests/scenarios/QUICK_SMOKE_200.sh +38 -0
- package/tests/scenarios/QUICK_SMOKE_MINI.sh +3 -0
- package/tests/scenarios/RANDOM_REAL_WORLD_SCENARIOS.sh +372 -0
- package/tests/scenarios/ROUND3_RANDOM_E2E_TEST.sh +446 -0
- package/tests/scenarios/RUN_AGGRESSIVE_AND_SUMMARY.sh +51 -0
- package/tests/scenarios/RUN_ALL_1018_SCENARIOS.sh +161 -0
- package/tests/scenarios/TARGETED_PERF.sh +75 -0
- package/tests/scenarios/V1.1_FEATURES_SCENARIOS.sh +145 -0
- package/tests/unit/utils.test.ts +52 -0
- package/tests/v1.1-features-scenarios.sh +276 -0
- package/tsconfig.json +21 -0
- package/v1.6_FEATURE_REQUESTS.md +79 -0
|
@@ -0,0 +1,1092 @@
|
|
|
1
|
+
# 🎯 FINAL DEVELOPMENT PLAN FOR CURSOR AI
|
|
2
|
+
|
|
3
|
+
**Buddy, I understand! You want me to explain to Cursor AI:**
|
|
4
|
+
1. What we're building (MemoryLink v1.0)
|
|
5
|
+
2. What changed from original plan
|
|
6
|
+
3. Why these changes matter
|
|
7
|
+
4. What Cursor should do next (step-by-step)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# 📋 MEMORYLINK v1.0 - CURSOR AI DEVELOPMENT GUIDE
|
|
12
|
+
|
|
13
|
+
**Developer:** Cursor AI
|
|
14
|
+
**Chief Engineer:** Claude (providing guidance)
|
|
15
|
+
**Timeline:** 6 days
|
|
16
|
+
**Status:** Ready to build
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 🎯 WHAT YOU'RE BUILDING
|
|
21
|
+
|
|
22
|
+
**MemoryLink v1.0** is a local, Git-native memory system for AI coding assistants (like you, Cursor!).
|
|
23
|
+
|
|
24
|
+
### The Problem It Solves
|
|
25
|
+
|
|
26
|
+
**Without MemoryLink:**
|
|
27
|
+
```
|
|
28
|
+
❌ You forget context between sessions
|
|
29
|
+
❌ You can't share memory with Claude/ChatGPT
|
|
30
|
+
❌ You repeat failed solutions
|
|
31
|
+
❌ You accidentally edit protected files
|
|
32
|
+
❌ No audit trail of your changes
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**With MemoryLink:**
|
|
36
|
+
```
|
|
37
|
+
✅ Persistent memory across sessions
|
|
38
|
+
✅ Universal memory (works with all AIs)
|
|
39
|
+
✅ Learn from mistakes (SUCCESS/FAILED tracking)
|
|
40
|
+
✅ Protected files (can't touch .env, auth.ts, etc)
|
|
41
|
+
✅ Complete audit trail (who changed what, when, why)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 📦 WHAT YOU'LL CREATE
|
|
47
|
+
|
|
48
|
+
### Repository Structure
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
my-project/
|
|
52
|
+
├── src/
|
|
53
|
+
├── docs/
|
|
54
|
+
│ ├── architecture.md
|
|
55
|
+
│ └── api-spec.md
|
|
56
|
+
├── .memorylink/
|
|
57
|
+
│ ├── protected.txt # Files AI cannot touch
|
|
58
|
+
│ ├── memory.log # JSONL: Project knowledge
|
|
59
|
+
│ ├── changes.log # JSONL: Audit trail
|
|
60
|
+
│ ├── learnings.log # JSONL: What works/fails
|
|
61
|
+
│ └── config.json # Project settings
|
|
62
|
+
└── package.json
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### The 4 Core Files
|
|
66
|
+
|
|
67
|
+
1. **protected.txt** (Plain text)
|
|
68
|
+
```
|
|
69
|
+
.env
|
|
70
|
+
config/production.json
|
|
71
|
+
src/auth/**
|
|
72
|
+
*.pem
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
2. **memory.log** (JSONL)
|
|
76
|
+
```json
|
|
77
|
+
{"id":"mem_001","ts":"2025-12-12T10:00:00Z","agent":"cursor","type":"decision","details":"Use JWT for auth","tags":["auth","api"],"status":"ACTIVE"}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
3. **changes.log** (JSONL)
|
|
81
|
+
```json
|
|
82
|
+
{"id":"chg_001","ts":"2025-12-12T10:00:00Z","agent":"cursor","user":"alice","file":"src/api.ts","action":"edited","reason":"Added null check"}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
4. **learnings.log** (JSONL)
|
|
86
|
+
```json
|
|
87
|
+
{"id":"lrn_001","ts":"2025-12-12T10:00:00Z","agent":"cursor","problem":"API timeout","solution":"Add DB index","outcome":"SUCCESS","reason":"Latency 5s→100ms"}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 🔄 WHAT CHANGED FROM ORIGINAL PLAN
|
|
93
|
+
|
|
94
|
+
### CHANGE 1: Pipe Format → JSONL Format
|
|
95
|
+
|
|
96
|
+
**BEFORE (Original Plan):**
|
|
97
|
+
```
|
|
98
|
+
# memory.log (pipe-delimited)
|
|
99
|
+
2025-12-12T10:00:00Z|cursor|decision|Use JWT for auth|auth,api
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**AFTER (New Plan):**
|
|
103
|
+
```json
|
|
104
|
+
{"id":"mem_001","ts":"2025-12-12T10:00:00Z","agent":"cursor","type":"decision","details":"Use JWT for auth","tags":["auth","api"],"status":"ACTIVE"}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**WHY THIS CHANGE:**
|
|
108
|
+
```
|
|
109
|
+
❌ Pipe format problems:
|
|
110
|
+
- Breaks when | appears in text
|
|
111
|
+
- Hard to add new fields (breaks old parsers)
|
|
112
|
+
- No validation
|
|
113
|
+
- Escaping nightmare
|
|
114
|
+
|
|
115
|
+
✅ JSONL benefits:
|
|
116
|
+
- Robust parsing (JSON.parse)
|
|
117
|
+
- Easy to add fields (backward compatible)
|
|
118
|
+
- Built-in validation
|
|
119
|
+
- No escaping issues
|
|
120
|
+
- Standard format
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**WHAT YOU DO:**
|
|
124
|
+
- Write JSON objects, one per line
|
|
125
|
+
- Use `JSON.stringify(entry) + '\n'`
|
|
126
|
+
- Parse with `JSON.parse(line)`
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
### CHANGE 2: No Locking → File Locking
|
|
131
|
+
|
|
132
|
+
**BEFORE (Original Plan):**
|
|
133
|
+
```typescript
|
|
134
|
+
// Just append
|
|
135
|
+
await appendFile('memory.log', data);
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**AFTER (New Plan):**
|
|
139
|
+
```typescript
|
|
140
|
+
// Acquire lock, append, release
|
|
141
|
+
const lock = await acquireLock('memory.log.lock');
|
|
142
|
+
try {
|
|
143
|
+
await appendFile('memory.log', data);
|
|
144
|
+
} finally {
|
|
145
|
+
await lock.release();
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**WHY THIS CHANGE:**
|
|
150
|
+
```
|
|
151
|
+
❌ Without locking:
|
|
152
|
+
Developer writes: {"id":"mem_001"
|
|
153
|
+
Cursor writes: {"id":"mem_002","ts":"..."}
|
|
154
|
+
Result: {"id":"mem_001"{"id":"mem_002","ts":"..."}
|
|
155
|
+
↑ CORRUPTED LOG
|
|
156
|
+
|
|
157
|
+
✅ With locking:
|
|
158
|
+
Developer: Acquire lock → write → release
|
|
159
|
+
Cursor: Wait for lock → write → release
|
|
160
|
+
Result: Both entries written correctly
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**WHAT YOU DO:**
|
|
164
|
+
```typescript
|
|
165
|
+
// 1. Create lock file atomically
|
|
166
|
+
const lock = await acquireFileLock('memory.log.lock');
|
|
167
|
+
|
|
168
|
+
// 2. Write to log
|
|
169
|
+
await appendFile('memory.log', JSON.stringify(entry) + '\n');
|
|
170
|
+
|
|
171
|
+
// 3. Release lock
|
|
172
|
+
await lock.release();
|
|
173
|
+
|
|
174
|
+
// 4. If lock times out (10 retries), throw error
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
### CHANGE 3: Simple List → Search + Filters
|
|
180
|
+
|
|
181
|
+
**BEFORE (Original Plan):**
|
|
182
|
+
```bash
|
|
183
|
+
memorylink memories # Show all entries
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**AFTER (New Plan):**
|
|
187
|
+
```bash
|
|
188
|
+
# Search by keyword
|
|
189
|
+
memorylink search "authentication"
|
|
190
|
+
|
|
191
|
+
# Filter by tag
|
|
192
|
+
memorylink memories --tag=auth
|
|
193
|
+
|
|
194
|
+
# Filter by date
|
|
195
|
+
memorylink memories --since 7d
|
|
196
|
+
|
|
197
|
+
# Filter by status
|
|
198
|
+
memorylink learnings --failed-only
|
|
199
|
+
|
|
200
|
+
# Combine filters
|
|
201
|
+
memorylink search "timeout" --tag=api --since 2w --limit 10
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**WHY THIS CHANGE:**
|
|
205
|
+
```
|
|
206
|
+
❌ Without search:
|
|
207
|
+
Day 1: 10 entries → easy to scan
|
|
208
|
+
Day 30: 200 entries → hard to find anything
|
|
209
|
+
Day 90: 1000+ entries → completely unusable
|
|
210
|
+
User abandons tool
|
|
211
|
+
|
|
212
|
+
✅ With search:
|
|
213
|
+
Day 90: 1000+ entries
|
|
214
|
+
Search "auth" → 15 relevant entries in 0.1s
|
|
215
|
+
User finds what they need instantly
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**WHAT YOU DO:**
|
|
219
|
+
```typescript
|
|
220
|
+
async function search(keyword: string, filters: Filters) {
|
|
221
|
+
// 1. Read all entries
|
|
222
|
+
const entries = await readLog('memory.log');
|
|
223
|
+
|
|
224
|
+
// 2. Filter by keyword
|
|
225
|
+
let results = entries.filter(e =>
|
|
226
|
+
e.details.includes(keyword) ||
|
|
227
|
+
e.tags.some(t => t.includes(keyword))
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
// 3. Apply filters
|
|
231
|
+
if (filters.tag) {
|
|
232
|
+
results = results.filter(e => e.tags.includes(filters.tag));
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (filters.since) {
|
|
236
|
+
const cutoff = parseDuration(filters.since); // "7d" → date
|
|
237
|
+
results = results.filter(e => new Date(e.ts) > cutoff);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (filters.limit) {
|
|
241
|
+
results = results.slice(0, filters.limit);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// 4. Return results
|
|
245
|
+
return results;
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
### CHANGE 4: Basic Output → Formatted Context
|
|
252
|
+
|
|
253
|
+
**BEFORE (Original Plan):**
|
|
254
|
+
```bash
|
|
255
|
+
memorylink get-context
|
|
256
|
+
# Output:
|
|
257
|
+
mem_001|2025-12-12|Use JWT|auth,api
|
|
258
|
+
mem_002|2025-12-11|Add pagination|api
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**AFTER (New Plan):**
|
|
262
|
+
```bash
|
|
263
|
+
# For Cursor AI
|
|
264
|
+
memorylink prompt cursor --tag=auth
|
|
265
|
+
|
|
266
|
+
# Output (ready to paste):
|
|
267
|
+
Context for Cursor AI:
|
|
268
|
+
|
|
269
|
+
[DECISION] Use JWT authentication with refresh tokens
|
|
270
|
+
Tags: auth, api, security
|
|
271
|
+
Date: 2025-12-12
|
|
272
|
+
|
|
273
|
+
[DOC_REF] Authentication flow documentation
|
|
274
|
+
See: docs/auth-flow.md
|
|
275
|
+
Tags: auth, docs
|
|
276
|
+
|
|
277
|
+
Ready to assist with authentication tasks!
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
**WHY THIS CHANGE:**
|
|
281
|
+
```
|
|
282
|
+
❌ Without formatting:
|
|
283
|
+
1. User runs: get-context
|
|
284
|
+
2. Copy raw JSONL
|
|
285
|
+
3. Paste to Cursor
|
|
286
|
+
4. Cursor: "Let me parse this..."
|
|
287
|
+
5. Friction = user annoyed
|
|
288
|
+
|
|
289
|
+
✅ With formatting:
|
|
290
|
+
1. User runs: prompt cursor --tag=auth
|
|
291
|
+
2. Copy formatted text
|
|
292
|
+
3. Paste to Cursor
|
|
293
|
+
4. Cursor: "Got it! I see you use JWT..."
|
|
294
|
+
5. Instant context = happy user
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**WHAT YOU DO:**
|
|
298
|
+
```typescript
|
|
299
|
+
async function formatForCursor(entries: Entry[]) {
|
|
300
|
+
let output = 'Context for Cursor AI:\n\n';
|
|
301
|
+
|
|
302
|
+
for (const entry of entries) {
|
|
303
|
+
output += `[${entry.type.toUpperCase()}] ${entry.details}\n`;
|
|
304
|
+
if (entry.tags.length > 0) {
|
|
305
|
+
output += `Tags: ${entry.tags.join(', ')}\n`;
|
|
306
|
+
}
|
|
307
|
+
if (entry.path) {
|
|
308
|
+
output += `See: ${entry.path}\n`;
|
|
309
|
+
}
|
|
310
|
+
output += '\n';
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
output += 'Ready to assist!\n';
|
|
314
|
+
return output;
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
### CHANGE 5: Basic Validation → Doctor Command
|
|
321
|
+
|
|
322
|
+
**BEFORE (Original Plan):**
|
|
323
|
+
```bash
|
|
324
|
+
memorylink status # Show basic info
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
**AFTER (New Plan):**
|
|
328
|
+
```bash
|
|
329
|
+
memorylink doctor
|
|
330
|
+
|
|
331
|
+
# Output:
|
|
332
|
+
✅ JSONL validation: All logs valid
|
|
333
|
+
✅ File locking: No stale locks
|
|
334
|
+
⚠️ Size warning: memory.log is 2.5MB (consider archiving)
|
|
335
|
+
❌ SECRET DETECTED: memory.log line 47 contains API key
|
|
336
|
+
❌ UNPROTECTED: .env is not in protected.txt
|
|
337
|
+
⚠️ Hash mismatch: docs/api-spec.md changed since doc_ref
|
|
338
|
+
|
|
339
|
+
Actions required:
|
|
340
|
+
1. Run: memorylink delete-memory mem_047 --secure
|
|
341
|
+
2. Run: memorylink protect .env
|
|
342
|
+
3. Update doc_ref or accept changes
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
**WHY THIS CHANGE:**
|
|
346
|
+
```
|
|
347
|
+
❌ Without doctor:
|
|
348
|
+
- User commits secret to Git (security breach)
|
|
349
|
+
- Logs corrupted (lost data)
|
|
350
|
+
- .env unprotected (Cursor edits it, production breaks)
|
|
351
|
+
- No way to know something is wrong
|
|
352
|
+
|
|
353
|
+
✅ With doctor:
|
|
354
|
+
- Catches secrets before Git commit
|
|
355
|
+
- Validates log integrity
|
|
356
|
+
- Warns about unprotected files
|
|
357
|
+
- User fixes issues proactively
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
**WHAT YOU DO:**
|
|
361
|
+
```typescript
|
|
362
|
+
async function runDoctor() {
|
|
363
|
+
const issues = [];
|
|
364
|
+
|
|
365
|
+
// 1. Validate JSONL
|
|
366
|
+
for (const log of ['memory.log', 'changes.log', 'learnings.log']) {
|
|
367
|
+
const lines = await readLines(log);
|
|
368
|
+
for (let i = 0; i < lines.length; i++) {
|
|
369
|
+
try {
|
|
370
|
+
JSON.parse(lines[i]);
|
|
371
|
+
} catch (err) {
|
|
372
|
+
issues.push(`${log}:${i+1} - Invalid JSON`);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// 2. Check for secrets
|
|
378
|
+
const secretPatterns = [
|
|
379
|
+
/sk_live_[A-Za-z0-9]+/,
|
|
380
|
+
/AKIA[A-Z0-9]{16}/,
|
|
381
|
+
/API_KEY\s*=\s*['"]/,
|
|
382
|
+
];
|
|
383
|
+
|
|
384
|
+
for (const entry of await readLog('memory.log')) {
|
|
385
|
+
for (const pattern of secretPatterns) {
|
|
386
|
+
if (pattern.test(entry.details)) {
|
|
387
|
+
issues.push(`SECRET in ${entry.id}: ${entry.details.slice(0,30)}...`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// 3. Check protected files
|
|
393
|
+
const protectedFiles = await readProtectedFiles();
|
|
394
|
+
if (!protectedFiles.includes('.env')) {
|
|
395
|
+
issues.push('WARNING: .env is not protected');
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// 4. Report
|
|
399
|
+
return issues;
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
405
|
+
## 🛠️ WHAT YOU BUILD (6-DAY PLAN)
|
|
406
|
+
|
|
407
|
+
### Day 1: JSONL Conversion (6 hours)
|
|
408
|
+
|
|
409
|
+
**Task: Convert from pipe format to JSONL**
|
|
410
|
+
|
|
411
|
+
**Files to modify:**
|
|
412
|
+
```
|
|
413
|
+
src/
|
|
414
|
+
├── memory.ts # Update write/read for JSONL
|
|
415
|
+
├── learning.ts # Update write/read for JSONL
|
|
416
|
+
├── change.ts # Update write/read for JSONL
|
|
417
|
+
└── types.ts # Update interfaces
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
**Step-by-step:**
|
|
421
|
+
|
|
422
|
+
```typescript
|
|
423
|
+
// 1. Update types.ts
|
|
424
|
+
interface MemoryEntry {
|
|
425
|
+
id: string; // UUID v4
|
|
426
|
+
ts: string; // ISO 8601
|
|
427
|
+
project: string; // Project name
|
|
428
|
+
agent: string; // cursor, claude, user, etc
|
|
429
|
+
type: string; // note, decision, doc_ref, etc
|
|
430
|
+
details: string; // Main content
|
|
431
|
+
tags: string[]; // Searchable keywords
|
|
432
|
+
status: string; // ACTIVE, DEPRECATED, DELETED
|
|
433
|
+
path?: string; // For doc_ref
|
|
434
|
+
hash?: string; // For doc_ref
|
|
435
|
+
replaces_id?: string; // For updates
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// 2. Update memory.ts write function
|
|
439
|
+
async write(entry: MemoryEntry) {
|
|
440
|
+
// Add ID and timestamp
|
|
441
|
+
entry.id = uuidv4();
|
|
442
|
+
entry.ts = new Date().toISOString();
|
|
443
|
+
entry.project = this.getProjectName();
|
|
444
|
+
entry.status = 'ACTIVE';
|
|
445
|
+
|
|
446
|
+
// Write JSONL
|
|
447
|
+
const line = JSON.stringify(entry) + '\n';
|
|
448
|
+
await appendFile(this.logPath, line);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// 3. Update memory.ts read function
|
|
452
|
+
async read(): Promise<MemoryEntry[]> {
|
|
453
|
+
const content = await readFile(this.logPath, 'utf-8');
|
|
454
|
+
const lines = content.split('\n').filter(l => l.trim());
|
|
455
|
+
|
|
456
|
+
const entries: MemoryEntry[] = [];
|
|
457
|
+
for (let i = 0; i < lines.length; i++) {
|
|
458
|
+
try {
|
|
459
|
+
const entry = JSON.parse(lines[i]);
|
|
460
|
+
entries.push(entry);
|
|
461
|
+
} catch (err) {
|
|
462
|
+
console.warn(`Line ${i+1}: Invalid JSON - ${err.message}`);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
return entries;
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
**Test:**
|
|
471
|
+
```typescript
|
|
472
|
+
// Create entry
|
|
473
|
+
await memory.write({
|
|
474
|
+
agent: 'cursor',
|
|
475
|
+
type: 'decision',
|
|
476
|
+
details: 'Use JWT for auth',
|
|
477
|
+
tags: ['auth', 'api']
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
// Read back
|
|
481
|
+
const entries = await memory.read();
|
|
482
|
+
console.log(entries[0].id); // Should be UUID
|
|
483
|
+
console.log(entries[0].ts); // Should be ISO 8601
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
---
|
|
487
|
+
|
|
488
|
+
### Day 2: File Locking (4 hours)
|
|
489
|
+
|
|
490
|
+
**Task: Add concurrent write protection**
|
|
491
|
+
|
|
492
|
+
**Create new file:**
|
|
493
|
+
```
|
|
494
|
+
src/lock.ts # File locking utility
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
**Implementation:**
|
|
498
|
+
|
|
499
|
+
```typescript
|
|
500
|
+
// src/lock.ts
|
|
501
|
+
import { open, unlink } from 'fs/promises';
|
|
502
|
+
|
|
503
|
+
export class FileLock {
|
|
504
|
+
constructor(private lockPath: string) {}
|
|
505
|
+
|
|
506
|
+
async acquire(maxRetries = 10): Promise<() => Promise<void>> {
|
|
507
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
508
|
+
try {
|
|
509
|
+
// Create lock file (exclusive)
|
|
510
|
+
const fd = await open(this.lockPath, 'wx');
|
|
511
|
+
|
|
512
|
+
// Return release function
|
|
513
|
+
return async () => {
|
|
514
|
+
await fd.close();
|
|
515
|
+
await unlink(this.lockPath);
|
|
516
|
+
};
|
|
517
|
+
} catch (err) {
|
|
518
|
+
if (err.code !== 'EEXIST') throw err;
|
|
519
|
+
|
|
520
|
+
// Wait and retry
|
|
521
|
+
await new Promise(r => setTimeout(r, 100));
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
throw new Error(`Could not acquire lock: ${this.lockPath}`);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
// Usage in memory.ts
|
|
530
|
+
async write(entry: MemoryEntry) {
|
|
531
|
+
const lock = new FileLock(this.logPath + '.lock');
|
|
532
|
+
const release = await lock.acquire();
|
|
533
|
+
|
|
534
|
+
try {
|
|
535
|
+
// Add metadata
|
|
536
|
+
entry.id = uuidv4();
|
|
537
|
+
entry.ts = new Date().toISOString();
|
|
538
|
+
|
|
539
|
+
// Write JSONL
|
|
540
|
+
await appendFile(this.logPath, JSON.stringify(entry) + '\n');
|
|
541
|
+
} finally {
|
|
542
|
+
await release();
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
**Test:**
|
|
548
|
+
```typescript
|
|
549
|
+
// Concurrent write test
|
|
550
|
+
const promises = [];
|
|
551
|
+
for (let i = 0; i < 10; i++) {
|
|
552
|
+
promises.push(memory.write({
|
|
553
|
+
agent: 'test',
|
|
554
|
+
type: 'note',
|
|
555
|
+
details: `Test ${i}`,
|
|
556
|
+
tags: ['test']
|
|
557
|
+
}));
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
await Promise.all(promises);
|
|
561
|
+
|
|
562
|
+
// Verify: All 10 entries should be written correctly
|
|
563
|
+
const entries = await memory.read();
|
|
564
|
+
assert(entries.length === 10);
|
|
565
|
+
assert(entries.every(e => e.id && e.ts));
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
---
|
|
569
|
+
|
|
570
|
+
### Day 3: Search + Filters (6 hours)
|
|
571
|
+
|
|
572
|
+
**Task: Make logs searchable**
|
|
573
|
+
|
|
574
|
+
**Create new file:**
|
|
575
|
+
```
|
|
576
|
+
src/search.ts # Search and filter logic
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
**Implementation:**
|
|
580
|
+
|
|
581
|
+
```typescript
|
|
582
|
+
// src/search.ts
|
|
583
|
+
interface SearchFilters {
|
|
584
|
+
keyword?: string;
|
|
585
|
+
tag?: string;
|
|
586
|
+
since?: string; // "7d", "2w", "1m"
|
|
587
|
+
status?: string; // "ACTIVE", "DEPRECATED", "DELETED"
|
|
588
|
+
type?: string;
|
|
589
|
+
limit?: number;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
export class SearchEngine {
|
|
593
|
+
async search(log: string, filters: SearchFilters): Promise<Entry[]> {
|
|
594
|
+
// 1. Read all entries
|
|
595
|
+
let entries = await this.readLog(log);
|
|
596
|
+
|
|
597
|
+
// 2. Filter by keyword
|
|
598
|
+
if (filters.keyword) {
|
|
599
|
+
const kw = filters.keyword.toLowerCase();
|
|
600
|
+
entries = entries.filter(e =>
|
|
601
|
+
e.details.toLowerCase().includes(kw) ||
|
|
602
|
+
e.tags.some(t => t.toLowerCase().includes(kw))
|
|
603
|
+
);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
// 3. Filter by tag
|
|
607
|
+
if (filters.tag) {
|
|
608
|
+
entries = entries.filter(e => e.tags.includes(filters.tag));
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
// 4. Filter by date
|
|
612
|
+
if (filters.since) {
|
|
613
|
+
const cutoff = this.parseDuration(filters.since);
|
|
614
|
+
entries = entries.filter(e => new Date(e.ts) > cutoff);
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
// 5. Filter by status (default: ACTIVE only)
|
|
618
|
+
const status = filters.status || 'ACTIVE';
|
|
619
|
+
entries = entries.filter(e => e.status === status);
|
|
620
|
+
|
|
621
|
+
// 6. Filter by type
|
|
622
|
+
if (filters.type) {
|
|
623
|
+
entries = entries.filter(e => e.type === filters.type);
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
// 7. Limit results
|
|
627
|
+
if (filters.limit) {
|
|
628
|
+
entries = entries.slice(0, filters.limit);
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
return entries;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
private parseDuration(duration: string): Date {
|
|
635
|
+
const match = duration.match(/^(\d+)([dwmy])$/);
|
|
636
|
+
if (!match) throw new Error(`Invalid duration: ${duration}`);
|
|
637
|
+
|
|
638
|
+
const [, amount, unit] = match;
|
|
639
|
+
const now = new Date();
|
|
640
|
+
|
|
641
|
+
switch (unit) {
|
|
642
|
+
case 'd': return new Date(now.getTime() - parseInt(amount) * 24 * 60 * 60 * 1000);
|
|
643
|
+
case 'w': return new Date(now.getTime() - parseInt(amount) * 7 * 24 * 60 * 60 * 1000);
|
|
644
|
+
case 'm': return new Date(now.getTime() - parseInt(amount) * 30 * 24 * 60 * 60 * 1000);
|
|
645
|
+
case 'y': return new Date(now.getTime() - parseInt(amount) * 365 * 24 * 60 * 60 * 1000);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
// Add to CLI (src/cli.ts)
|
|
651
|
+
program
|
|
652
|
+
.command('search <keyword>')
|
|
653
|
+
.option('--tag <tag>')
|
|
654
|
+
.option('--since <duration>')
|
|
655
|
+
.option('--limit <n>', parseInt)
|
|
656
|
+
.action(async (keyword, options) => {
|
|
657
|
+
const search = new SearchEngine();
|
|
658
|
+
const results = await search.search('memory.log', {
|
|
659
|
+
keyword,
|
|
660
|
+
...options
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
for (const entry of results) {
|
|
664
|
+
console.log(`[${entry.type}] ${entry.details}`);
|
|
665
|
+
console.log(` Tags: ${entry.tags.join(', ')}`);
|
|
666
|
+
console.log(` Date: ${entry.ts}\n`);
|
|
667
|
+
}
|
|
668
|
+
});
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
**Test:**
|
|
672
|
+
```bash
|
|
673
|
+
# Add test data
|
|
674
|
+
memorylink memory "Use JWT for auth" --tags auth,api
|
|
675
|
+
memorylink memory "Add pagination" --tags api,performance
|
|
676
|
+
memorylink memory "Implement caching" --tags performance,redis
|
|
677
|
+
|
|
678
|
+
# Test search
|
|
679
|
+
memorylink search "auth"
|
|
680
|
+
# Should show: JWT entry
|
|
681
|
+
|
|
682
|
+
memorylink search "performance" --limit 1
|
|
683
|
+
# Should show: 1 entry
|
|
684
|
+
|
|
685
|
+
memorylink memories --tag=api --since 1d
|
|
686
|
+
# Should show: 2 entries (JWT, pagination)
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
---
|
|
690
|
+
|
|
691
|
+
### Day 4: Formatted Output (4 hours)
|
|
692
|
+
|
|
693
|
+
**Task: Generate AI-friendly context**
|
|
694
|
+
|
|
695
|
+
**Create new file:**
|
|
696
|
+
```
|
|
697
|
+
src/formatter.ts # Format output for different AIs
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
**Implementation:**
|
|
701
|
+
|
|
702
|
+
```typescript
|
|
703
|
+
// src/formatter.ts
|
|
704
|
+
export class ContextFormatter {
|
|
705
|
+
formatForCursor(entries: Entry[]): string {
|
|
706
|
+
let output = '📋 Context for Cursor AI\n\n';
|
|
707
|
+
|
|
708
|
+
for (const entry of entries) {
|
|
709
|
+
output += `## [${entry.type.toUpperCase()}] ${entry.details}\n`;
|
|
710
|
+
output += `**Tags:** ${entry.tags.join(', ')}\n`;
|
|
711
|
+
output += `**Date:** ${this.formatDate(entry.ts)}\n`;
|
|
712
|
+
|
|
713
|
+
if (entry.path) {
|
|
714
|
+
output += `**Reference:** ${entry.path}\n`;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
output += '\n';
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
return output;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
formatForClaude(entries: Entry[]): string {
|
|
724
|
+
let output = 'Project Context:\n\n';
|
|
725
|
+
|
|
726
|
+
for (const entry of entries) {
|
|
727
|
+
if (entry.type === 'decision') {
|
|
728
|
+
output += `✓ ${entry.details}\n`;
|
|
729
|
+
} else if (entry.type === 'doc_ref') {
|
|
730
|
+
output += `→ See ${entry.path}\n`;
|
|
731
|
+
} else {
|
|
732
|
+
output += `• ${entry.details}\n`;
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
return output;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
formatRaw(entries: Entry[]): string {
|
|
740
|
+
return entries.map(e => JSON.stringify(e)).join('\n');
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
// Add to CLI
|
|
745
|
+
program
|
|
746
|
+
.command('prompt <tool>')
|
|
747
|
+
.option('--tag <tag>')
|
|
748
|
+
.option('--since <duration>')
|
|
749
|
+
.action(async (tool, options) => {
|
|
750
|
+
const search = new SearchEngine();
|
|
751
|
+
const entries = await search.search('memory.log', options);
|
|
752
|
+
|
|
753
|
+
const formatter = new ContextFormatter();
|
|
754
|
+
let output;
|
|
755
|
+
|
|
756
|
+
switch (tool) {
|
|
757
|
+
case 'cursor':
|
|
758
|
+
output = formatter.formatForCursor(entries);
|
|
759
|
+
break;
|
|
760
|
+
case 'claude':
|
|
761
|
+
output = formatter.formatForClaude(entries);
|
|
762
|
+
break;
|
|
763
|
+
default:
|
|
764
|
+
output = formatter.formatRaw(entries);
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
console.log(output);
|
|
768
|
+
});
|
|
769
|
+
```
|
|
770
|
+
|
|
771
|
+
**Test:**
|
|
772
|
+
```bash
|
|
773
|
+
# Add some memories
|
|
774
|
+
memorylink memory "Use JWT for auth" --tags auth,decision
|
|
775
|
+
memorylink memory "API spec in docs/api.md" --doc docs/api.md --tags api,docs
|
|
776
|
+
|
|
777
|
+
# Test formatting
|
|
778
|
+
memorylink prompt cursor --tag=auth
|
|
779
|
+
# Should output Cursor-friendly format
|
|
780
|
+
|
|
781
|
+
memorylink prompt claude --tag=api
|
|
782
|
+
# Should output Claude-friendly format
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
---
|
|
786
|
+
|
|
787
|
+
### Day 5: Doctor Command (6 hours)
|
|
788
|
+
|
|
789
|
+
**Task: Comprehensive validation**
|
|
790
|
+
|
|
791
|
+
**Create new file:**
|
|
792
|
+
```
|
|
793
|
+
src/doctor.ts # Health checks
|
|
794
|
+
```
|
|
795
|
+
|
|
796
|
+
**Implementation:**
|
|
797
|
+
|
|
798
|
+
```typescript
|
|
799
|
+
// src/doctor.ts
|
|
800
|
+
export class Doctor {
|
|
801
|
+
async runChecks(): Promise<Issue[]> {
|
|
802
|
+
const issues: Issue[] = [];
|
|
803
|
+
|
|
804
|
+
// 1. Validate JSONL
|
|
805
|
+
issues.push(...await this.validateJSONL());
|
|
806
|
+
|
|
807
|
+
// 2. Check locks
|
|
808
|
+
issues.push(...await this.checkLocks());
|
|
809
|
+
|
|
810
|
+
// 3. Scan secrets
|
|
811
|
+
issues.push(...await this.scanSecrets());
|
|
812
|
+
|
|
813
|
+
// 4. Check protected files
|
|
814
|
+
issues.push(...await this.checkProtectedFiles());
|
|
815
|
+
|
|
816
|
+
// 5. Check doc_ref integrity
|
|
817
|
+
issues.push(...await this.checkDocRefs());
|
|
818
|
+
|
|
819
|
+
// 6. Check size
|
|
820
|
+
issues.push(...await this.checkSize());
|
|
821
|
+
|
|
822
|
+
return issues;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
private async validateJSONL(): Promise<Issue[]> {
|
|
826
|
+
const issues: Issue[] = [];
|
|
827
|
+
|
|
828
|
+
for (const log of ['memory.log', 'changes.log', 'learnings.log']) {
|
|
829
|
+
const lines = await readLines(`.memorylink/${log}`);
|
|
830
|
+
|
|
831
|
+
for (let i = 0; i < lines.length; i++) {
|
|
832
|
+
try {
|
|
833
|
+
const entry = JSON.parse(lines[i]);
|
|
834
|
+
|
|
835
|
+
// Check required fields
|
|
836
|
+
if (!entry.id || !entry.ts || !entry.status) {
|
|
837
|
+
issues.push({
|
|
838
|
+
severity: 'ERROR',
|
|
839
|
+
message: `${log}:${i+1} Missing required fields`
|
|
840
|
+
});
|
|
841
|
+
}
|
|
842
|
+
} catch (err) {
|
|
843
|
+
issues.push({
|
|
844
|
+
severity: 'ERROR',
|
|
845
|
+
message: `${log}:${i+1} Invalid JSON`
|
|
846
|
+
});
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
return issues;
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
private async scanSecrets(): Promise<Issue[]> {
|
|
855
|
+
const issues: Issue[] = [];
|
|
856
|
+
const patterns = [
|
|
857
|
+
{ name: 'API Key', regex: /sk_live_[A-Za-z0-9]+/ },
|
|
858
|
+
{ name: 'AWS Key', regex: /AKIA[A-Z0-9]{16}/ },
|
|
859
|
+
{ name: 'Generic Key', regex: /API_KEY\s*=\s*['"][^'"]+['"]/ },
|
|
860
|
+
{ name: 'Password', regex: /password\s*=\s*['"][^'"]+['"]/ },
|
|
861
|
+
];
|
|
862
|
+
|
|
863
|
+
const entries = await readLog('memory.log');
|
|
864
|
+
|
|
865
|
+
for (const entry of entries) {
|
|
866
|
+
for (const pattern of patterns) {
|
|
867
|
+
if (pattern.regex.test(entry.details)) {
|
|
868
|
+
issues.push({
|
|
869
|
+
severity: 'CRITICAL',
|
|
870
|
+
message: `${pattern.name} detected in ${entry.id}`,
|
|
871
|
+
fix: `memorylink delete-memory ${entry.id} --secure`
|
|
872
|
+
});
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
return issues;
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
private async checkProtectedFiles(): Promise<Issue[]> {
|
|
881
|
+
const issues: Issue[] = [];
|
|
882
|
+
const protected = await readProtectedFiles();
|
|
883
|
+
|
|
884
|
+
const criticalFiles = ['.env', '*.pem', 'config/production.*'];
|
|
885
|
+
|
|
886
|
+
for (const pattern of criticalFiles) {
|
|
887
|
+
if (!protected.includes(pattern)) {
|
|
888
|
+
issues.push({
|
|
889
|
+
severity: 'WARNING',
|
|
890
|
+
message: `${pattern} is not protected`,
|
|
891
|
+
fix: `memorylink protect ${pattern}`
|
|
892
|
+
});
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
return issues;
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
// Add to CLI
|
|
901
|
+
program
|
|
902
|
+
.command('doctor')
|
|
903
|
+
.action(async () => {
|
|
904
|
+
const doctor = new Doctor();
|
|
905
|
+
const issues = await doctor.runChecks();
|
|
906
|
+
|
|
907
|
+
if (issues.length === 0) {
|
|
908
|
+
console.log('✅ All checks passed!');
|
|
909
|
+
return;
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
// Group by severity
|
|
913
|
+
const critical = issues.filter(i => i.severity === 'CRITICAL');
|
|
914
|
+
const errors = issues.filter(i => i.severity === 'ERROR');
|
|
915
|
+
const warnings = issues.filter(i => i.severity === 'WARNING');
|
|
916
|
+
|
|
917
|
+
if (critical.length > 0) {
|
|
918
|
+
console.log('\n❌ CRITICAL ISSUES:');
|
|
919
|
+
for (const issue of critical) {
|
|
920
|
+
console.log(` ${issue.message}`);
|
|
921
|
+
if (issue.fix) console.log(` Fix: ${issue.fix}`);
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
if (errors.length > 0) {
|
|
926
|
+
console.log('\n⚠️ ERRORS:');
|
|
927
|
+
for (const issue of errors) {
|
|
928
|
+
console.log(` ${issue.message}`);
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
if (warnings.length > 0) {
|
|
933
|
+
console.log('\n💡 WARNINGS:');
|
|
934
|
+
for (const issue of warnings) {
|
|
935
|
+
console.log(` ${issue.message}`);
|
|
936
|
+
if (issue.fix) console.log(` Fix: ${issue.fix}`);
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
});
|
|
940
|
+
```
|
|
941
|
+
|
|
942
|
+
**Test:**
|
|
943
|
+
```bash
|
|
944
|
+
# Add test data with secret
|
|
945
|
+
memorylink memory "API key is sk_live_abc123" --tags test
|
|
946
|
+
|
|
947
|
+
# Run doctor
|
|
948
|
+
memorylink doctor
|
|
949
|
+
# Should detect: CRITICAL - API key detected in mem_001
|
|
950
|
+
|
|
951
|
+
# Fix it
|
|
952
|
+
memorylink delete-memory mem_001 --secure
|
|
953
|
+
|
|
954
|
+
# Run doctor again
|
|
955
|
+
memorylink doctor
|
|
956
|
+
# Should pass
|
|
957
|
+
```
|
|
958
|
+
|
|
959
|
+
---
|
|
960
|
+
|
|
961
|
+
### Day 6: Documentation + Testing (4 hours)
|
|
962
|
+
|
|
963
|
+
**Task: Final polish**
|
|
964
|
+
|
|
965
|
+
**Update README.md:**
|
|
966
|
+
```markdown
|
|
967
|
+
# MemoryLink v1.0
|
|
968
|
+
|
|
969
|
+
## Quick Start
|
|
970
|
+
|
|
971
|
+
```bash
|
|
972
|
+
# Install
|
|
973
|
+
npm install -g memorylink
|
|
974
|
+
|
|
975
|
+
# Initialize
|
|
976
|
+
cd your-project
|
|
977
|
+
memorylink init
|
|
978
|
+
|
|
979
|
+
# Protect files
|
|
980
|
+
memorylink protect .env
|
|
981
|
+
memorylink protect config/**
|
|
982
|
+
|
|
983
|
+
# Add memory
|
|
984
|
+
memorylink memory "Use JWT for auth" --tags auth,api
|
|
985
|
+
|
|
986
|
+
# Search
|
|
987
|
+
memorylink search "auth"
|
|
988
|
+
|
|
989
|
+
# Get context for Cursor
|
|
990
|
+
memorylink prompt cursor --tag=auth
|
|
991
|
+
|
|
992
|
+
# Check health
|
|
993
|
+
memorylink doctor
|
|
994
|
+
```
|
|
995
|
+
|
|
996
|
+
## JSONL Format
|
|
997
|
+
|
|
998
|
+
Memory entries:
|
|
999
|
+
```json
|
|
1000
|
+
{
|
|
1001
|
+
"id": "mem_001",
|
|
1002
|
+
"ts": "2025-12-12T10:00:00Z",
|
|
1003
|
+
"project": "my-project",
|
|
1004
|
+
"agent": "cursor",
|
|
1005
|
+
"type": "decision",
|
|
1006
|
+
"details": "Use JWT for authentication",
|
|
1007
|
+
"tags": ["auth", "api"],
|
|
1008
|
+
"status": "ACTIVE"
|
|
1009
|
+
}
|
|
1010
|
+
```
|
|
1011
|
+
|
|
1012
|
+
## Commands
|
|
1013
|
+
|
|
1014
|
+
- `search <keyword>` - Search memories
|
|
1015
|
+
- `prompt <tool>` - Formatted context
|
|
1016
|
+
- `doctor` - Health check
|
|
1017
|
+
- All previous commands still work!
|
|
1018
|
+
|
|
1019
|
+
## What Changed
|
|
1020
|
+
|
|
1021
|
+
v1.0 adds:
|
|
1022
|
+
- ✅ JSONL format (robust)
|
|
1023
|
+
- ✅ File locking (safe)
|
|
1024
|
+
- ✅ Search + filters (usable)
|
|
1025
|
+
- ✅ Formatted output (easy)
|
|
1026
|
+
- ✅ Doctor checks (secure)
|
|
1027
|
+
```
|
|
1028
|
+
|
|
1029
|
+
**Final testing:**
|
|
1030
|
+
```bash
|
|
1031
|
+
# Test all features
|
|
1032
|
+
npm test
|
|
1033
|
+
|
|
1034
|
+
# Test on real project
|
|
1035
|
+
cd ../test-project
|
|
1036
|
+
memorylink init
|
|
1037
|
+
memorylink protect .env
|
|
1038
|
+
memorylink memory "Test project" --tags test
|
|
1039
|
+
memorylink search "test"
|
|
1040
|
+
memorylink prompt cursor
|
|
1041
|
+
memorylink doctor
|
|
1042
|
+
```
|
|
1043
|
+
|
|
1044
|
+
---
|
|
1045
|
+
|
|
1046
|
+
## ✅ ACCEPTANCE CRITERIA
|
|
1047
|
+
|
|
1048
|
+
**You're done when:**
|
|
1049
|
+
|
|
1050
|
+
1. ✅ All logs use JSONL format
|
|
1051
|
+
2. ✅ All writes use file locking
|
|
1052
|
+
3. ✅ Search works with filters
|
|
1053
|
+
4. ✅ Formatted output works for cursor/claude
|
|
1054
|
+
5. ✅ Doctor detects secrets and issues
|
|
1055
|
+
6. ✅ All tests pass
|
|
1056
|
+
7. ✅ Documentation is complete
|
|
1057
|
+
8. ✅ Package builds successfully
|
|
1058
|
+
|
|
1059
|
+
---
|
|
1060
|
+
|
|
1061
|
+
## 🚀 WHAT YOU DO NEXT (RIGHT NOW)
|
|
1062
|
+
|
|
1063
|
+
**Step 1: Confirm Understanding**
|
|
1064
|
+
```
|
|
1065
|
+
Reply: "Understood! I will:
|
|
1066
|
+
1. Convert to JSONL format
|
|
1067
|
+
2. Add file locking
|
|
1068
|
+
3. Implement search + filters
|
|
1069
|
+
4. Add formatted output
|
|
1070
|
+
5. Build doctor command
|
|
1071
|
+
6. Test everything
|
|
1072
|
+
|
|
1073
|
+
Starting with Day 1: JSONL conversion."
|
|
1074
|
+
```
|
|
1075
|
+
|
|
1076
|
+
**Step 2: Start Day 1**
|
|
1077
|
+
```
|
|
1078
|
+
1. Open src/types.ts
|
|
1079
|
+
2. Update MemoryEntry interface
|
|
1080
|
+
3. Open src/memory.ts
|
|
1081
|
+
4. Update write() function
|
|
1082
|
+
5. Update read() function
|
|
1083
|
+
6. Test with example entry
|
|
1084
|
+
7. Report: "Day 1 complete, JSONL working"
|
|
1085
|
+
```
|
|
1086
|
+
|
|
1087
|
+
---
|
|
1088
|
+
|
|
1089
|
+
**Buddy (Cursor AI), are you ready to start building?** 🚀
|
|
1090
|
+
|
|
1091
|
+
**Reply "START" and I'll guide you through Day 1!** 🎯
|
|
1092
|
+
|