cognitive-core 0.2.0 โ 0.2.2
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/.claude/settings.json +111 -2
- package/.sessionlog/settings.json +4 -0
- package/dist/atlas.d.ts +10 -0
- package/dist/atlas.d.ts.map +1 -1
- package/dist/atlas.js +65 -0
- package/dist/atlas.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/learning/index.d.ts +1 -1
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/pipeline.d.ts +4 -31
- package/dist/learning/pipeline.d.ts.map +1 -1
- package/dist/learning/pipeline.js +12 -64
- package/dist/learning/pipeline.js.map +1 -1
- package/dist/learning/unified-pipeline.d.ts +30 -0
- package/dist/learning/unified-pipeline.d.ts.map +1 -1
- package/dist/learning/unified-pipeline.js +207 -0
- package/dist/learning/unified-pipeline.js.map +1 -1
- package/dist/memory/candidate-retrieval.d.ts.map +1 -1
- package/dist/memory/candidate-retrieval.js +3 -1
- package/dist/memory/candidate-retrieval.js.map +1 -1
- package/dist/memory/curated-loader.d.ts +21 -4
- package/dist/memory/curated-loader.d.ts.map +1 -1
- package/dist/memory/curated-loader.js +53 -16
- package/dist/memory/curated-loader.js.map +1 -1
- package/dist/memory/index.d.ts +2 -1
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +3 -1
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/playbook.d.ts +6 -0
- package/dist/memory/playbook.d.ts.map +1 -1
- package/dist/memory/playbook.js +15 -0
- package/dist/memory/playbook.js.map +1 -1
- package/dist/memory/source-resolver.d.ts +120 -0
- package/dist/memory/source-resolver.d.ts.map +1 -0
- package/dist/memory/source-resolver.js +300 -0
- package/dist/memory/source-resolver.js.map +1 -0
- package/dist/types/config.d.ts +141 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +40 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/error-classifier.js +8 -8
- package/dist/utils/error-classifier.js.map +1 -1
- package/dist/workspace/efficacy-toolkit.d.ts +164 -0
- package/dist/workspace/efficacy-toolkit.d.ts.map +1 -0
- package/dist/workspace/efficacy-toolkit.js +281 -0
- package/dist/workspace/efficacy-toolkit.js.map +1 -0
- package/dist/workspace/index.d.ts +2 -1
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +3 -1
- package/dist/workspace/index.js.map +1 -1
- package/dist/workspace/templates/index.d.ts +3 -0
- package/dist/workspace/templates/index.d.ts.map +1 -1
- package/dist/workspace/templates/index.js +6 -0
- package/dist/workspace/templates/index.js.map +1 -1
- package/dist/workspace/templates/playbook-decay-detection.d.ts +46 -0
- package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-decay-detection.js +197 -0
- package/dist/workspace/templates/playbook-decay-detection.js.map +1 -0
- package/dist/workspace/templates/playbook-efficacy-audit.d.ts +46 -0
- package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-efficacy-audit.js +160 -0
- package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -0
- package/dist/workspace/templates/playbook-lifecycle-review.d.ts +51 -0
- package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-lifecycle-review.js +187 -0
- package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -0
- package/dist/workspace/types.d.ts +12 -54
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/types.js.map +1 -1
- package/package.json +8 -2
- package/playbooks/compound-engineering/adversarial-review.json +51 -0
- package/playbooks/compound-engineering/agent-native-architecture.json +59 -0
- package/playbooks/compound-engineering/agent-native-review.json +54 -0
- package/playbooks/compound-engineering/api-contract-review.json +52 -0
- package/playbooks/compound-engineering/brainstorm-requirements.json +55 -0
- package/playbooks/compound-engineering/bug-reproduction.json +62 -0
- package/playbooks/compound-engineering/confidence-calibration.json +49 -0
- package/playbooks/compound-engineering/correctness-review.json +49 -0
- package/playbooks/compound-engineering/data-migration-safety.json +59 -0
- package/playbooks/compound-engineering/deployment-verification.json +63 -0
- package/playbooks/compound-engineering/error-recovery-patterns.json +53 -0
- package/playbooks/compound-engineering/implementation-planning.json +64 -0
- package/playbooks/compound-engineering/issue-pattern-analysis.json +53 -0
- package/playbooks/compound-engineering/knowledge-compounding.json +63 -0
- package/playbooks/compound-engineering/learnings-research.json +54 -0
- package/playbooks/compound-engineering/maintainability-review.json +49 -0
- package/playbooks/compound-engineering/performance-review.json +54 -0
- package/playbooks/compound-engineering/plan-adversarial-review.json +56 -0
- package/playbooks/compound-engineering/plan-feasibility-review.json +56 -0
- package/playbooks/compound-engineering/project-standards-review.json +52 -0
- package/playbooks/compound-engineering/reliability-review.json +53 -0
- package/playbooks/compound-engineering/review-orchestration.json +64 -0
- package/playbooks/compound-engineering/security-review.json +54 -0
- package/playbooks/compound-engineering/systematic-execution.json +64 -0
- package/playbooks/compound-engineering/testing-review.json +50 -0
- package/src/atlas.ts +96 -0
- package/src/index.ts +27 -0
- package/src/learning/index.ts +1 -0
- package/src/learning/unified-pipeline.ts +271 -1
- package/src/memory/candidate-retrieval.ts +2 -1
- package/src/memory/curated-loader.ts +69 -16
- package/src/memory/index.ts +16 -0
- package/src/memory/playbook.ts +19 -0
- package/src/memory/source-resolver.ts +422 -0
- package/src/types/config.ts +46 -0
- package/src/types/index.ts +4 -0
- package/src/utils/error-classifier.ts +8 -8
- package/src/workspace/efficacy-toolkit.ts +496 -0
- package/src/workspace/index.ts +29 -0
- package/src/workspace/templates/index.ts +24 -0
- package/src/workspace/templates/playbook-decay-detection.ts +272 -0
- package/src/workspace/templates/playbook-efficacy-audit.ts +246 -0
- package/src/workspace/templates/playbook-lifecycle-review.ts +274 -0
- package/src/workspace/types.ts +22 -78
- package/tests/fixtures/behavioral-trajectories.ts +210 -0
- package/tests/integration/curated-sources-e2e.test.ts +502 -0
- package/tests/integration/pipeline-data-correctness.test.ts +794 -0
- package/tests/learning/meta-learner.test.ts +418 -0
- package/tests/learning/pipeline-memory-updates.test.ts +721 -0
- package/tests/learning/unified-pipeline-efficacy.test.ts +232 -0
- package/tests/memory/candidate-retrieval.test.ts +167 -0
- package/tests/memory/compound-engineering-seed.test.ts +338 -0
- package/tests/memory/curated-loader-extended.test.ts +225 -0
- package/tests/memory/meta.test.ts +399 -0
- package/tests/memory/playbook-quality-validation.test.ts +430 -0
- package/tests/memory/source-resolver.test.ts +700 -0
- package/tests/search/evaluator.test.ts +257 -0
- package/tests/search/verification-runner.test.ts +357 -0
- package/tests/utils/error-classifier.test.ts +149 -0
- package/tests/utils/trajectory-helpers.test.ts +163 -0
- package/tests/workspace/efficacy-toolkit.test.ts +404 -0
- package/tests/workspace/templates/playbook-efficacy.test.ts +377 -0
- package/.claude/settings.local.json +0 -11
- package/dist/learning/llm-extractor.d.ts +0 -88
- package/dist/learning/llm-extractor.d.ts.map +0 -1
- package/dist/learning/llm-extractor.js +0 -372
- package/dist/learning/llm-extractor.js.map +0 -1
- package/dist/learning/loop-coordinator.d.ts +0 -61
- package/dist/learning/loop-coordinator.d.ts.map +0 -1
- package/dist/learning/loop-coordinator.js +0 -96
- package/dist/learning/loop-coordinator.js.map +0 -1
- package/references/agent-workspace/CLAUDE.md +0 -74
- package/references/agent-workspace/README.md +0 -587
- package/references/agent-workspace/media/banner.png +0 -0
- package/references/agent-workspace/package-lock.json +0 -2061
- package/references/agent-workspace/package.json +0 -54
- package/references/agent-workspace/src/handle.ts +0 -122
- package/references/agent-workspace/src/index.ts +0 -32
- package/references/agent-workspace/src/manager.ts +0 -102
- package/references/agent-workspace/src/readers/json.ts +0 -71
- package/references/agent-workspace/src/readers/markdown.ts +0 -37
- package/references/agent-workspace/src/readers/raw.ts +0 -27
- package/references/agent-workspace/src/types.ts +0 -68
- package/references/agent-workspace/src/validation.ts +0 -93
- package/references/agent-workspace/src/writers/json.ts +0 -17
- package/references/agent-workspace/src/writers/markdown.ts +0 -27
- package/references/agent-workspace/src/writers/raw.ts +0 -22
- package/references/agent-workspace/tests/errors.test.ts +0 -652
- package/references/agent-workspace/tests/handle.test.ts +0 -144
- package/references/agent-workspace/tests/manager.test.ts +0 -124
- package/references/agent-workspace/tests/readers.test.ts +0 -205
- package/references/agent-workspace/tests/validation.test.ts +0 -196
- package/references/agent-workspace/tests/writers.test.ts +0 -108
- package/references/agent-workspace/tsconfig.json +0 -20
- package/references/agent-workspace/tsup.config.ts +0 -9
- package/references/minimem/.claude/settings.json +0 -7
- package/references/minimem/.sudocode/issues.jsonl +0 -18
- package/references/minimem/.sudocode/specs.jsonl +0 -1
- package/references/minimem/CLAUDE.md +0 -310
- package/references/minimem/README.md +0 -556
- package/references/minimem/claude-plugin/.claude-plugin/plugin.json +0 -10
- package/references/minimem/claude-plugin/.mcp.json +0 -7
- package/references/minimem/claude-plugin/README.md +0 -158
- package/references/minimem/claude-plugin/commands/recall.md +0 -47
- package/references/minimem/claude-plugin/commands/remember.md +0 -41
- package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +0 -272
- package/references/minimem/claude-plugin/hooks/hooks.json +0 -27
- package/references/minimem/claude-plugin/hooks/session-end.sh +0 -86
- package/references/minimem/claude-plugin/hooks/session-start.sh +0 -85
- package/references/minimem/claude-plugin/skills/memory/SKILL.md +0 -108
- package/references/minimem/package-lock.json +0 -5373
- package/references/minimem/package.json +0 -60
- package/references/minimem/scripts/postbuild.js +0 -35
- package/references/minimem/src/__tests__/edge-cases.test.ts +0 -371
- package/references/minimem/src/__tests__/errors.test.ts +0 -265
- package/references/minimem/src/__tests__/helpers.ts +0 -199
- package/references/minimem/src/__tests__/internal.test.ts +0 -407
- package/references/minimem/src/__tests__/knowledge.test.ts +0 -287
- package/references/minimem/src/__tests__/minimem.integration.test.ts +0 -1127
- package/references/minimem/src/__tests__/session.test.ts +0 -190
- package/references/minimem/src/cli/__tests__/commands.test.ts +0 -759
- package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +0 -141
- package/references/minimem/src/cli/commands/append.ts +0 -76
- package/references/minimem/src/cli/commands/config.ts +0 -262
- package/references/minimem/src/cli/commands/conflicts.ts +0 -413
- package/references/minimem/src/cli/commands/daemon.ts +0 -169
- package/references/minimem/src/cli/commands/index.ts +0 -12
- package/references/minimem/src/cli/commands/init.ts +0 -88
- package/references/minimem/src/cli/commands/mcp.ts +0 -177
- package/references/minimem/src/cli/commands/push-pull.ts +0 -213
- package/references/minimem/src/cli/commands/search.ts +0 -158
- package/references/minimem/src/cli/commands/status.ts +0 -84
- package/references/minimem/src/cli/commands/sync-init.ts +0 -290
- package/references/minimem/src/cli/commands/sync.ts +0 -70
- package/references/minimem/src/cli/commands/upsert.ts +0 -197
- package/references/minimem/src/cli/config.ts +0 -584
- package/references/minimem/src/cli/index.ts +0 -264
- package/references/minimem/src/cli/shared.ts +0 -161
- package/references/minimem/src/cli/sync/__tests__/central.test.ts +0 -152
- package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +0 -209
- package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +0 -118
- package/references/minimem/src/cli/sync/__tests__/detection.test.ts +0 -207
- package/references/minimem/src/cli/sync/__tests__/integration.test.ts +0 -476
- package/references/minimem/src/cli/sync/__tests__/registry.test.ts +0 -363
- package/references/minimem/src/cli/sync/__tests__/state.test.ts +0 -255
- package/references/minimem/src/cli/sync/__tests__/validation.test.ts +0 -193
- package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +0 -178
- package/references/minimem/src/cli/sync/central.ts +0 -292
- package/references/minimem/src/cli/sync/conflicts.ts +0 -204
- package/references/minimem/src/cli/sync/daemon.ts +0 -407
- package/references/minimem/src/cli/sync/detection.ts +0 -138
- package/references/minimem/src/cli/sync/index.ts +0 -107
- package/references/minimem/src/cli/sync/operations.ts +0 -373
- package/references/minimem/src/cli/sync/registry.ts +0 -279
- package/references/minimem/src/cli/sync/state.ts +0 -355
- package/references/minimem/src/cli/sync/validation.ts +0 -206
- package/references/minimem/src/cli/sync/watcher.ts +0 -234
- package/references/minimem/src/cli/version.ts +0 -34
- package/references/minimem/src/core/index.ts +0 -9
- package/references/minimem/src/core/indexer.ts +0 -628
- package/references/minimem/src/core/searcher.ts +0 -221
- package/references/minimem/src/db/schema.ts +0 -183
- package/references/minimem/src/db/sqlite-vec.ts +0 -24
- package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +0 -431
- package/references/minimem/src/embeddings/batch-gemini.ts +0 -392
- package/references/minimem/src/embeddings/batch-openai.ts +0 -409
- package/references/minimem/src/embeddings/embeddings.ts +0 -434
- package/references/minimem/src/index.ts +0 -109
- package/references/minimem/src/internal.ts +0 -299
- package/references/minimem/src/minimem.ts +0 -1276
- package/references/minimem/src/search/__tests__/hybrid.test.ts +0 -247
- package/references/minimem/src/search/graph.ts +0 -234
- package/references/minimem/src/search/hybrid.ts +0 -151
- package/references/minimem/src/search/search.ts +0 -256
- package/references/minimem/src/server/__tests__/mcp.test.ts +0 -341
- package/references/minimem/src/server/__tests__/tools.test.ts +0 -364
- package/references/minimem/src/server/mcp.ts +0 -326
- package/references/minimem/src/server/tools.ts +0 -720
- package/references/minimem/src/session.ts +0 -460
- package/references/minimem/tsconfig.json +0 -19
- package/references/minimem/tsup.config.ts +0 -26
- package/references/minimem/vitest.config.ts +0 -24
- package/references/sessionlog/.husky/pre-commit +0 -1
- package/references/sessionlog/.lintstagedrc.json +0 -4
- package/references/sessionlog/.prettierignore +0 -4
- package/references/sessionlog/.prettierrc.json +0 -11
- package/references/sessionlog/LICENSE +0 -21
- package/references/sessionlog/README.md +0 -453
- package/references/sessionlog/eslint.config.js +0 -58
- package/references/sessionlog/package-lock.json +0 -3672
- package/references/sessionlog/package.json +0 -65
- package/references/sessionlog/src/__tests__/agent-hooks.test.ts +0 -570
- package/references/sessionlog/src/__tests__/agent-registry.test.ts +0 -127
- package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +0 -225
- package/references/sessionlog/src/__tests__/claude-generator.test.ts +0 -46
- package/references/sessionlog/src/__tests__/commit-msg.test.ts +0 -86
- package/references/sessionlog/src/__tests__/cursor-agent.test.ts +0 -224
- package/references/sessionlog/src/__tests__/e2e-live.test.ts +0 -890
- package/references/sessionlog/src/__tests__/event-log.test.ts +0 -183
- package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +0 -105
- package/references/sessionlog/src/__tests__/gemini-agent.test.ts +0 -375
- package/references/sessionlog/src/__tests__/git-hooks.test.ts +0 -78
- package/references/sessionlog/src/__tests__/hook-managers.test.ts +0 -121
- package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +0 -759
- package/references/sessionlog/src/__tests__/opencode-agent.test.ts +0 -338
- package/references/sessionlog/src/__tests__/redaction.test.ts +0 -136
- package/references/sessionlog/src/__tests__/session-repo.test.ts +0 -353
- package/references/sessionlog/src/__tests__/session-store.test.ts +0 -166
- package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +0 -466
- package/references/sessionlog/src/__tests__/skill-live.test.ts +0 -461
- package/references/sessionlog/src/__tests__/summarize.test.ts +0 -348
- package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +0 -610
- package/references/sessionlog/src/__tests__/task-plan-live.test.ts +0 -632
- package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +0 -121
- package/references/sessionlog/src/__tests__/types.test.ts +0 -166
- package/references/sessionlog/src/__tests__/utils.test.ts +0 -333
- package/references/sessionlog/src/__tests__/validation.test.ts +0 -103
- package/references/sessionlog/src/__tests__/worktree.test.ts +0 -57
- package/references/sessionlog/src/agent/agents/claude-code.ts +0 -1089
- package/references/sessionlog/src/agent/agents/cursor.ts +0 -361
- package/references/sessionlog/src/agent/agents/gemini-cli.ts +0 -632
- package/references/sessionlog/src/agent/agents/opencode.ts +0 -540
- package/references/sessionlog/src/agent/registry.ts +0 -143
- package/references/sessionlog/src/agent/session-types.ts +0 -113
- package/references/sessionlog/src/agent/types.ts +0 -220
- package/references/sessionlog/src/cli.ts +0 -597
- package/references/sessionlog/src/commands/clean.ts +0 -133
- package/references/sessionlog/src/commands/disable.ts +0 -84
- package/references/sessionlog/src/commands/doctor.ts +0 -145
- package/references/sessionlog/src/commands/enable.ts +0 -202
- package/references/sessionlog/src/commands/explain.ts +0 -261
- package/references/sessionlog/src/commands/reset.ts +0 -105
- package/references/sessionlog/src/commands/resume.ts +0 -180
- package/references/sessionlog/src/commands/rewind.ts +0 -195
- package/references/sessionlog/src/commands/setup-ccweb.ts +0 -275
- package/references/sessionlog/src/commands/status.ts +0 -172
- package/references/sessionlog/src/config.ts +0 -165
- package/references/sessionlog/src/events/event-log.ts +0 -126
- package/references/sessionlog/src/git-operations.ts +0 -558
- package/references/sessionlog/src/hooks/git-hooks.ts +0 -165
- package/references/sessionlog/src/hooks/lifecycle.ts +0 -391
- package/references/sessionlog/src/index.ts +0 -650
- package/references/sessionlog/src/security/redaction.ts +0 -283
- package/references/sessionlog/src/session/state-machine.ts +0 -452
- package/references/sessionlog/src/store/checkpoint-store.ts +0 -509
- package/references/sessionlog/src/store/native-store.ts +0 -173
- package/references/sessionlog/src/store/provider-types.ts +0 -99
- package/references/sessionlog/src/store/session-store.ts +0 -266
- package/references/sessionlog/src/strategy/attribution.ts +0 -296
- package/references/sessionlog/src/strategy/common.ts +0 -207
- package/references/sessionlog/src/strategy/content-overlap.ts +0 -228
- package/references/sessionlog/src/strategy/manual-commit.ts +0 -988
- package/references/sessionlog/src/strategy/types.ts +0 -279
- package/references/sessionlog/src/summarize/claude-generator.ts +0 -115
- package/references/sessionlog/src/summarize/summarize.ts +0 -432
- package/references/sessionlog/src/types.ts +0 -508
- package/references/sessionlog/src/utils/chunk-files.ts +0 -49
- package/references/sessionlog/src/utils/commit-message.ts +0 -65
- package/references/sessionlog/src/utils/detect-agent.ts +0 -36
- package/references/sessionlog/src/utils/hook-managers.ts +0 -125
- package/references/sessionlog/src/utils/ide-tags.ts +0 -32
- package/references/sessionlog/src/utils/paths.ts +0 -79
- package/references/sessionlog/src/utils/preview-rewind.ts +0 -80
- package/references/sessionlog/src/utils/rewind-conflict.ts +0 -121
- package/references/sessionlog/src/utils/shadow-branch.ts +0 -109
- package/references/sessionlog/src/utils/string-utils.ts +0 -46
- package/references/sessionlog/src/utils/todo-extract.ts +0 -188
- package/references/sessionlog/src/utils/trailers.ts +0 -187
- package/references/sessionlog/src/utils/transcript-parse.ts +0 -177
- package/references/sessionlog/src/utils/transcript-timestamp.ts +0 -59
- package/references/sessionlog/src/utils/tree-ops.ts +0 -219
- package/references/sessionlog/src/utils/tty.ts +0 -72
- package/references/sessionlog/src/utils/validation.ts +0 -65
- package/references/sessionlog/src/utils/worktree.ts +0 -58
- package/references/sessionlog/src/wire-types.ts +0 -59
- package/references/sessionlog/templates/setup-env.sh +0 -153
- package/references/sessionlog/tsconfig.json +0 -18
- package/references/sessionlog/vitest.config.ts +0 -12
- package/references/skill-tree/.claude/settings.json +0 -6
- package/references/skill-tree/.sudocode/issues.jsonl +0 -19
- package/references/skill-tree/.sudocode/specs.jsonl +0 -3
- package/references/skill-tree/CLAUDE.md +0 -126
- package/references/skill-tree/README.md +0 -372
- package/references/skill-tree/docs/GAPS_v1.md +0 -221
- package/references/skill-tree/docs/INTEGRATION_PLAN.md +0 -467
- package/references/skill-tree/docs/TODOS.md +0 -91
- package/references/skill-tree/docs/anthropic_skill_guide.md +0 -1364
- package/references/skill-tree/docs/design/federated-skill-trees.md +0 -524
- package/references/skill-tree/docs/design/multi-agent-sync.md +0 -759
- package/references/skill-tree/docs/scraper/BRAINSTORM.md +0 -583
- package/references/skill-tree/docs/scraper/POC_PLAN.md +0 -420
- package/references/skill-tree/docs/scraper/README.md +0 -170
- package/references/skill-tree/examples/basic-usage.ts +0 -164
- package/references/skill-tree/package-lock.json +0 -1852
- package/references/skill-tree/package.json +0 -66
- package/references/skill-tree/scraper/README.md +0 -123
- package/references/skill-tree/scraper/docs/DESIGN.md +0 -683
- package/references/skill-tree/scraper/docs/PLAN.md +0 -336
- package/references/skill-tree/scraper/drizzle.config.ts +0 -10
- package/references/skill-tree/scraper/package-lock.json +0 -6329
- package/references/skill-tree/scraper/package.json +0 -68
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +0 -7
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +0 -7
- package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +0 -27
- package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +0 -21
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +0 -54
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +0 -24
- package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +0 -93
- package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +0 -22
- package/references/skill-tree/scraper/tsup.config.ts +0 -14
- package/references/skill-tree/scraper/vitest.config.ts +0 -17
- package/references/skill-tree/scripts/convert-to-vitest.ts +0 -166
- package/references/skill-tree/skills/skill-writer/SKILL.md +0 -339
- package/references/skill-tree/skills/skill-writer/references/examples.md +0 -326
- package/references/skill-tree/skills/skill-writer/references/patterns.md +0 -210
- package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +0 -123
- package/references/skill-tree/test/run-all.ts +0 -106
- package/references/skill-tree/test/utils.ts +0 -128
- package/references/skill-tree/vitest.config.ts +0 -16
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "minimem",
|
|
3
|
-
"version": "0.0.3",
|
|
4
|
-
"description": "A lightweight file-based memory system with vector search for AI agents",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "dist/index.js",
|
|
7
|
-
"module": "dist/index.js",
|
|
8
|
-
"types": "dist/index.d.ts",
|
|
9
|
-
"exports": {
|
|
10
|
-
".": {
|
|
11
|
-
"types": "./dist/index.d.ts",
|
|
12
|
-
"import": "./dist/index.js"
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
"files": [
|
|
16
|
-
"dist"
|
|
17
|
-
],
|
|
18
|
-
"scripts": {
|
|
19
|
-
"build": "tsup && npm run postbuild",
|
|
20
|
-
"postbuild": "node scripts/postbuild.js",
|
|
21
|
-
"dev": "tsup --watch",
|
|
22
|
-
"test": "vitest run",
|
|
23
|
-
"test:integration": "npx tsx --test src/__tests__/minimem.integration.test.ts",
|
|
24
|
-
"test:cli": "npx tsx --test src/cli/__tests__/commands.test.ts",
|
|
25
|
-
"test:all": "npm run test && npm run test:integration && npm run test:cli",
|
|
26
|
-
"prepublishOnly": "npm run build"
|
|
27
|
-
},
|
|
28
|
-
"keywords": [
|
|
29
|
-
"memory",
|
|
30
|
-
"vector-search",
|
|
31
|
-
"embeddings",
|
|
32
|
-
"sqlite",
|
|
33
|
-
"ai-agent",
|
|
34
|
-
"rag",
|
|
35
|
-
"semantic-search"
|
|
36
|
-
],
|
|
37
|
-
"author": "Alex Ngai",
|
|
38
|
-
"license": "MIT",
|
|
39
|
-
"engines": {
|
|
40
|
-
"node": ">=22.0.0"
|
|
41
|
-
},
|
|
42
|
-
"bin": {
|
|
43
|
-
"minimem": "./dist/cli/index.js"
|
|
44
|
-
},
|
|
45
|
-
"dependencies": {
|
|
46
|
-
"chokidar": "^4.0.3",
|
|
47
|
-
"commander": "^12.0.0",
|
|
48
|
-
"minimatch": "^10.1.1",
|
|
49
|
-
"sqlite-vec": "^0.1.6"
|
|
50
|
-
},
|
|
51
|
-
"optionalDependencies": {
|
|
52
|
-
"node-llama-cpp": "^3.0.0"
|
|
53
|
-
},
|
|
54
|
-
"devDependencies": {
|
|
55
|
-
"@types/node": "^22.0.0",
|
|
56
|
-
"tsup": "^8.0.0",
|
|
57
|
-
"typescript": "^5.0.0",
|
|
58
|
-
"vitest": "^2.0.0"
|
|
59
|
-
}
|
|
60
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Cross-platform postbuild script
|
|
5
|
-
*
|
|
6
|
-
* Fixes the sqlite import in the CLI bundle.
|
|
7
|
-
* esbuild/tsup strips the "node:" prefix from built-in modules,
|
|
8
|
-
* but node:sqlite requires it.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { readFileSync, writeFileSync } from "node:fs";
|
|
12
|
-
import { join, dirname } from "node:path";
|
|
13
|
-
import { fileURLToPath } from "node:url";
|
|
14
|
-
|
|
15
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
16
|
-
const cliPath = join(__dirname, "../dist/cli/index.js");
|
|
17
|
-
|
|
18
|
-
try {
|
|
19
|
-
let content = readFileSync(cliPath, "utf-8");
|
|
20
|
-
|
|
21
|
-
// Fix sqlite import (esbuild strips the node: prefix)
|
|
22
|
-
const before = content;
|
|
23
|
-
content = content.replace(/from "sqlite"/g, 'from "node:sqlite"');
|
|
24
|
-
content = content.replace(/from 'sqlite'/g, "from 'node:sqlite'");
|
|
25
|
-
|
|
26
|
-
if (content !== before) {
|
|
27
|
-
writeFileSync(cliPath, content);
|
|
28
|
-
console.log("โ Fixed node:sqlite import in dist/cli/index.js");
|
|
29
|
-
} else {
|
|
30
|
-
console.log("โ No sqlite import fixes needed");
|
|
31
|
-
}
|
|
32
|
-
} catch (error) {
|
|
33
|
-
console.error("Error running postbuild:", error.message);
|
|
34
|
-
process.exit(1);
|
|
35
|
-
}
|
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Edge case tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for boundary conditions and unusual inputs:
|
|
5
|
-
* - Empty files
|
|
6
|
-
* - Unicode content (emoji, CJK, RTL)
|
|
7
|
-
* - Very large files
|
|
8
|
-
* - Files with only frontmatter
|
|
9
|
-
* - Windows line endings
|
|
10
|
-
* - Path validation edge cases
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
14
|
-
import fs from "node:fs/promises";
|
|
15
|
-
import os from "node:os";
|
|
16
|
-
import path from "node:path";
|
|
17
|
-
|
|
18
|
-
import {
|
|
19
|
-
chunkMarkdown,
|
|
20
|
-
hashText,
|
|
21
|
-
buildFileEntry,
|
|
22
|
-
listMemoryFiles,
|
|
23
|
-
isMemoryPath,
|
|
24
|
-
cosineSimilarity,
|
|
25
|
-
truncateUtf16Safe,
|
|
26
|
-
} from "../internal.js";
|
|
27
|
-
import {
|
|
28
|
-
parseFrontmatter,
|
|
29
|
-
serializeFrontmatter,
|
|
30
|
-
addSessionToContent,
|
|
31
|
-
type SessionContext,
|
|
32
|
-
} from "../session.js";
|
|
33
|
-
|
|
34
|
-
describe("Edge case: empty files", () => {
|
|
35
|
-
let tempDir: string;
|
|
36
|
-
|
|
37
|
-
beforeEach(async () => {
|
|
38
|
-
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "minimem-edge-"));
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
afterEach(async () => {
|
|
42
|
-
await fs.rm(tempDir, { recursive: true, force: true });
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it("listMemoryFiles includes empty .md files", async () => {
|
|
46
|
-
await fs.writeFile(path.join(tempDir, "MEMORY.md"), "");
|
|
47
|
-
const files = await listMemoryFiles(tempDir);
|
|
48
|
-
expect(files).toHaveLength(1);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it("chunkMarkdown handles empty string", () => {
|
|
52
|
-
const chunks = chunkMarkdown("", { tokens: 256, overlap: 32 });
|
|
53
|
-
expect(chunks.length).toBeLessThanOrEqual(1);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it("chunkMarkdown handles single newline", () => {
|
|
57
|
-
const chunks = chunkMarkdown("\n", { tokens: 256, overlap: 32 });
|
|
58
|
-
expect(chunks.length).toBeLessThanOrEqual(1);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it("chunkMarkdown handles whitespace-only content", () => {
|
|
62
|
-
const chunks = chunkMarkdown(" \n \n ", { tokens: 256, overlap: 32 });
|
|
63
|
-
expect(chunks.length).toBeGreaterThan(0);
|
|
64
|
-
// Each chunk should have text defined
|
|
65
|
-
for (const chunk of chunks) {
|
|
66
|
-
expect(chunk.text).toBeDefined();
|
|
67
|
-
expect(chunk.hash).toBeDefined();
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it("buildFileEntry handles empty file", async () => {
|
|
72
|
-
const filePath = path.join(tempDir, "empty.md");
|
|
73
|
-
await fs.writeFile(filePath, "");
|
|
74
|
-
|
|
75
|
-
const entry = await buildFileEntry(filePath, tempDir);
|
|
76
|
-
expect(entry.path).toBe("empty.md");
|
|
77
|
-
expect(entry.size).toBe(0);
|
|
78
|
-
expect(entry.hash).toBe(hashText(""));
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
describe("Edge case: unicode content", () => {
|
|
83
|
-
it("chunkMarkdown handles emoji content", () => {
|
|
84
|
-
const content = "# ๐ Project Launch\n\n๐ Notes about the launch ๐\n\n## โ
Tasks\n- ๐ฅ Deploy\n- ๐งช Test";
|
|
85
|
-
const chunks = chunkMarkdown(content, { tokens: 256, overlap: 32 });
|
|
86
|
-
expect(chunks.length).toBeGreaterThan(0);
|
|
87
|
-
expect(chunks[0].text).toContain("๐");
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it("chunkMarkdown handles CJK characters", () => {
|
|
91
|
-
const content = "# ้กน็ฎ็ฌ่ฎฐ\n\n่ฟๆฏไธไธชๆต่ฏๆไปถใ\n\n## ไผ่ฎฎ่ฎฐๅฝ\nไปๅคฉ่ฎจ่ฎบไบๆฐๅ่ฝใ";
|
|
92
|
-
const chunks = chunkMarkdown(content, { tokens: 256, overlap: 32 });
|
|
93
|
-
expect(chunks.length).toBeGreaterThan(0);
|
|
94
|
-
expect(chunks[0].text).toContain("้กน็ฎ็ฌ่ฎฐ");
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it("chunkMarkdown handles RTL text (Arabic)", () => {
|
|
98
|
-
const content = "# ู
ูุงุญุธุงุช ุงูู
ุดุฑูุน\n\nูุฐุง ู
ูู ุงุฎุชุจุงุฑ.\n\n## ุณุฌู ุงูุงุฌุชู
ุงุนุงุช";
|
|
99
|
-
const chunks = chunkMarkdown(content, { tokens: 256, overlap: 32 });
|
|
100
|
-
expect(chunks.length).toBeGreaterThan(0);
|
|
101
|
-
expect(chunks[0].text).toContain("ู
ูุงุญุธุงุช");
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it("chunkMarkdown handles mixed scripts", () => {
|
|
105
|
-
const content = "# Mixed: English, ไธญๆ, ุงูุนุฑุจูุฉ, ฮฮปฮปฮทฮฝฮนฮบฮฌ\n\nContent with ะผะฝoะณะพ different scripts.";
|
|
106
|
-
const chunks = chunkMarkdown(content, { tokens: 256, overlap: 32 });
|
|
107
|
-
expect(chunks.length).toBeGreaterThan(0);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it("hashText produces consistent hashes for unicode", () => {
|
|
111
|
-
const emoji = "๐๐";
|
|
112
|
-
const h1 = hashText(emoji);
|
|
113
|
-
const h2 = hashText(emoji);
|
|
114
|
-
expect(h1).toBe(h2);
|
|
115
|
-
expect(h1.length).toBe(64);
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
it("parseFrontmatter handles unicode values", () => {
|
|
119
|
-
const content = '---\nsession:\n source: "ใในใ"\ncreated: 2024-01-01\n---\n# ๅ
ๅฎน';
|
|
120
|
-
const { frontmatter, body } = parseFrontmatter(content);
|
|
121
|
-
expect(frontmatter?.session?.source).toBe("ใในใ");
|
|
122
|
-
expect(body).toBe("# ๅ
ๅฎน");
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it("truncateUtf16Safe truncates at char boundary", () => {
|
|
126
|
-
const emoji = "๐๐๐ฅ๐ก"; // Each emoji is 2 UTF-16 code units
|
|
127
|
-
const truncated = truncateUtf16Safe(emoji, 2);
|
|
128
|
-
// Should truncate at character count
|
|
129
|
-
expect(truncated.length).toBe(2);
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
describe("Edge case: large files", () => {
|
|
134
|
-
it("chunkMarkdown splits large content into multiple chunks", () => {
|
|
135
|
-
// Generate ~100KB of content
|
|
136
|
-
const lines: string[] = [];
|
|
137
|
-
for (let i = 0; i < 2000; i++) {
|
|
138
|
-
lines.push(`Line ${i}: This is a test line with enough content to fill chunks properly.`);
|
|
139
|
-
}
|
|
140
|
-
const content = lines.join("\n");
|
|
141
|
-
|
|
142
|
-
const chunks = chunkMarkdown(content, { tokens: 256, overlap: 32 });
|
|
143
|
-
expect(chunks.length).toBeGreaterThan(10);
|
|
144
|
-
|
|
145
|
-
// Verify line numbers are monotonically increasing
|
|
146
|
-
for (let i = 1; i < chunks.length; i++) {
|
|
147
|
-
expect(chunks[i].startLine).toBeGreaterThanOrEqual(chunks[i - 1].startLine);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// Verify all content is captured (first and last lines)
|
|
151
|
-
expect(chunks[0].text).toContain("Line 0");
|
|
152
|
-
expect(chunks[chunks.length - 1].text).toContain("Line 1999");
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
it("chunkMarkdown handles single very long line", () => {
|
|
156
|
-
const longLine = "a".repeat(10000);
|
|
157
|
-
const chunks = chunkMarkdown(longLine, { tokens: 256, overlap: 32 });
|
|
158
|
-
expect(chunks.length).toBeGreaterThan(1);
|
|
159
|
-
|
|
160
|
-
// All chunks should have valid hash and line numbers
|
|
161
|
-
for (const chunk of chunks) {
|
|
162
|
-
expect(chunk.hash).toBeDefined();
|
|
163
|
-
expect(chunk.hash.length).toBe(64);
|
|
164
|
-
expect(chunk.startLine).toBe(1); // Single line = always line 1
|
|
165
|
-
expect(chunk.endLine).toBe(1);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Total text across chunks (minus overlap) should cover original content
|
|
169
|
-
// Just verify first and last segments are present
|
|
170
|
-
expect(chunks[0].text.length).toBeGreaterThan(0);
|
|
171
|
-
expect(chunks[chunks.length - 1].text.length).toBeGreaterThan(0);
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
describe("Edge case: files with only frontmatter", () => {
|
|
176
|
-
it("parseFrontmatter handles file with only frontmatter and empty body", () => {
|
|
177
|
-
const content = "---\ncreated: 2024-01-01\ntags: [test]\n---\n";
|
|
178
|
-
const { frontmatter, body } = parseFrontmatter(content);
|
|
179
|
-
expect(frontmatter).toBeDefined();
|
|
180
|
-
expect(frontmatter?.created).toBe("2024-01-01");
|
|
181
|
-
expect(body).toBe("");
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it("chunkMarkdown handles frontmatter-only content", () => {
|
|
185
|
-
const content = "---\ncreated: 2024-01-01\n---\n";
|
|
186
|
-
const chunks = chunkMarkdown(content, { tokens: 256, overlap: 32 });
|
|
187
|
-
// Should produce at least one chunk containing the frontmatter text
|
|
188
|
-
expect(chunks.length).toBeGreaterThan(0);
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
describe("Edge case: Windows line endings", () => {
|
|
193
|
-
it("chunkMarkdown handles CRLF line endings", () => {
|
|
194
|
-
const content = "# Title\r\n\r\nParagraph one.\r\n\r\nParagraph two.\r\n";
|
|
195
|
-
const chunks = chunkMarkdown(content, { tokens: 256, overlap: 32 });
|
|
196
|
-
expect(chunks.length).toBeGreaterThan(0);
|
|
197
|
-
// Content should be preserved (with \r)
|
|
198
|
-
expect(chunks[0].text).toContain("Title");
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it("parseFrontmatter handles CRLF frontmatter", () => {
|
|
202
|
-
const content = "---\r\ncreated: 2024-01-01\r\n---\r\n# Body";
|
|
203
|
-
// The regex uses \n, so CRLF may not match.
|
|
204
|
-
// This documents the current behavior.
|
|
205
|
-
const { frontmatter, body } = parseFrontmatter(content);
|
|
206
|
-
// On CRLF, the frontmatter regex may not match since it looks for \n
|
|
207
|
-
// This is a known limitation
|
|
208
|
-
if (frontmatter) {
|
|
209
|
-
expect(frontmatter.created).toBeDefined();
|
|
210
|
-
}
|
|
211
|
-
expect(body).toBeTruthy();
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
describe("Edge case: path validation", () => {
|
|
216
|
-
it("isMemoryPath rejects path traversal attempts", () => {
|
|
217
|
-
expect(isMemoryPath("../../../etc/passwd")).toBe(false);
|
|
218
|
-
expect(isMemoryPath("memory/../../etc/passwd")).toBe(true); // starts with memory/ so returns true
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
it("isMemoryPath handles various path formats", () => {
|
|
222
|
-
expect(isMemoryPath("MEMORY.md")).toBe(true);
|
|
223
|
-
expect(isMemoryPath("memory.md")).toBe(true);
|
|
224
|
-
expect(isMemoryPath("memory/notes.md")).toBe(true);
|
|
225
|
-
expect(isMemoryPath("memory/deep/nested/file.md")).toBe(true);
|
|
226
|
-
expect(isMemoryPath("MEMORY.txt")).toBe(false);
|
|
227
|
-
expect(isMemoryPath("notes.md")).toBe(false);
|
|
228
|
-
expect(isMemoryPath("src/memory.md")).toBe(false);
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
it("isMemoryPath handles empty and whitespace", () => {
|
|
232
|
-
expect(isMemoryPath("")).toBe(false);
|
|
233
|
-
expect(isMemoryPath(" ")).toBe(false);
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
describe("Edge case: cosineSimilarity", () => {
|
|
238
|
-
it("handles vectors of different lengths", () => {
|
|
239
|
-
const a = [1, 2, 3, 4, 5];
|
|
240
|
-
const b = [1, 2, 3];
|
|
241
|
-
// Should use min length
|
|
242
|
-
const sim = cosineSimilarity(a, b);
|
|
243
|
-
expect(sim).toBeGreaterThan(0);
|
|
244
|
-
expect(sim).toBeLessThanOrEqual(1);
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
it("handles very small values", () => {
|
|
248
|
-
const a = [1e-10, 1e-10];
|
|
249
|
-
const b = [1e-10, 1e-10];
|
|
250
|
-
const sim = cosineSimilarity(a, b);
|
|
251
|
-
expect(sim).toBeCloseTo(1);
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
it("handles large vectors", () => {
|
|
255
|
-
const size = 1536; // OpenAI embedding dimension
|
|
256
|
-
const a = Array.from({ length: size }, (_, i) => Math.sin(i));
|
|
257
|
-
const b = Array.from({ length: size }, (_, i) => Math.cos(i));
|
|
258
|
-
const sim = cosineSimilarity(a, b);
|
|
259
|
-
expect(sim).toBeGreaterThan(-1);
|
|
260
|
-
expect(sim).toBeLessThan(1);
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
describe("Edge case: session tracking", () => {
|
|
265
|
-
it("addSessionToContent handles content without existing frontmatter", () => {
|
|
266
|
-
const session: SessionContext = {
|
|
267
|
-
id: "test-123",
|
|
268
|
-
source: "test",
|
|
269
|
-
};
|
|
270
|
-
const result = addSessionToContent("# Hello", session);
|
|
271
|
-
expect(result).toContain("---");
|
|
272
|
-
expect(result).toContain("id: test-123");
|
|
273
|
-
expect(result).toContain("# Hello");
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
it("serializeFrontmatter handles empty session", () => {
|
|
277
|
-
const yaml = serializeFrontmatter({ session: {} });
|
|
278
|
-
expect(yaml).toContain("---");
|
|
279
|
-
expect(yaml).toContain("session:");
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
it("serializeFrontmatter handles paths with home directory", () => {
|
|
283
|
-
const home = os.homedir();
|
|
284
|
-
const session: SessionContext = {
|
|
285
|
-
project: path.join(home, "projects", "test"),
|
|
286
|
-
};
|
|
287
|
-
const yaml = serializeFrontmatter({ session });
|
|
288
|
-
// Should use ~ for home directory
|
|
289
|
-
expect(yaml).toContain("~/projects/test");
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
it("parseFrontmatter roundtrips through serialize", () => {
|
|
293
|
-
const original = {
|
|
294
|
-
session: { id: "abc", source: "test" },
|
|
295
|
-
created: "2024-01-01T00:00:00Z",
|
|
296
|
-
tags: ["tag1", "tag2"],
|
|
297
|
-
};
|
|
298
|
-
const serialized = serializeFrontmatter(original);
|
|
299
|
-
const { frontmatter } = parseFrontmatter(serialized + "body");
|
|
300
|
-
|
|
301
|
-
expect(frontmatter?.session?.id).toBe("abc");
|
|
302
|
-
expect(frontmatter?.session?.source).toBe("test");
|
|
303
|
-
expect(frontmatter?.created).toBe("2024-01-01T00:00:00Z");
|
|
304
|
-
expect(frontmatter?.tags).toEqual(["tag1", "tag2"]);
|
|
305
|
-
});
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
describe("Edge case: hashText determinism", () => {
|
|
309
|
-
it("same content always produces same hash", () => {
|
|
310
|
-
const content = "Hello, World!";
|
|
311
|
-
const hashes = Array.from({ length: 100 }, () => hashText(content));
|
|
312
|
-
const unique = new Set(hashes);
|
|
313
|
-
expect(unique.size).toBe(1);
|
|
314
|
-
});
|
|
315
|
-
|
|
316
|
-
it("different content produces different hashes", () => {
|
|
317
|
-
const hashes = new Set<string>();
|
|
318
|
-
for (let i = 0; i < 100; i++) {
|
|
319
|
-
hashes.add(hashText(`content-${i}`));
|
|
320
|
-
}
|
|
321
|
-
expect(hashes.size).toBe(100);
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
it("handles special characters consistently", () => {
|
|
325
|
-
const special = "line1\nline2\ttab\r\nwindows\0null";
|
|
326
|
-
const h1 = hashText(special);
|
|
327
|
-
const h2 = hashText(special);
|
|
328
|
-
expect(h1).toBe(h2);
|
|
329
|
-
});
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
describe("Edge case: buildFileEntry", () => {
|
|
333
|
-
let tempDir: string;
|
|
334
|
-
|
|
335
|
-
beforeEach(async () => {
|
|
336
|
-
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "minimem-edge-"));
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
afterEach(async () => {
|
|
340
|
-
await fs.rm(tempDir, { recursive: true, force: true });
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
it("handles file with only whitespace", async () => {
|
|
344
|
-
const filePath = path.join(tempDir, "whitespace.md");
|
|
345
|
-
await fs.writeFile(filePath, " \n\n \n");
|
|
346
|
-
|
|
347
|
-
const entry = await buildFileEntry(filePath, tempDir);
|
|
348
|
-
expect(entry.size).toBeGreaterThan(0);
|
|
349
|
-
expect(entry.hash).toBe(hashText(" \n\n \n"));
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
it("handles file with unicode content", async () => {
|
|
353
|
-
const content = "# ๐ Launch Notes\n\nๆฅๆฌ่ชใในใ";
|
|
354
|
-
const filePath = path.join(tempDir, "unicode.md");
|
|
355
|
-
await fs.writeFile(filePath, content);
|
|
356
|
-
|
|
357
|
-
const entry = await buildFileEntry(filePath, tempDir);
|
|
358
|
-
expect(entry.hash).toBe(hashText(content));
|
|
359
|
-
expect(entry.size).toBeGreaterThan(0);
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
it("handles deeply nested path", async () => {
|
|
363
|
-
const nested = path.join(tempDir, "memory", "a", "b", "c");
|
|
364
|
-
await fs.mkdir(nested, { recursive: true });
|
|
365
|
-
const filePath = path.join(nested, "deep.md");
|
|
366
|
-
await fs.writeFile(filePath, "# Deep");
|
|
367
|
-
|
|
368
|
-
const entry = await buildFileEntry(filePath, tempDir);
|
|
369
|
-
expect(entry.path).toBe("memory/a/b/c/deep.md");
|
|
370
|
-
});
|
|
371
|
-
});
|