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,138 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Directory type detection for sync system
|
|
3
|
-
*
|
|
4
|
-
* Detects whether a memory directory is:
|
|
5
|
-
* - project-bound: inside git repo (synced via project's git)
|
|
6
|
-
* - standalone: has minimem sync config (synced via central repo)
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import fs from "node:fs/promises";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
import { getConfigPath } from "../config.js";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Directory type for sync purposes
|
|
15
|
-
*
|
|
16
|
-
* - project-bound: Memory is inside a git repo and synced via project's git
|
|
17
|
-
* - standalone: Memory has minimem sync config and syncs via central repo
|
|
18
|
-
*/
|
|
19
|
-
export type DirectoryType = "project-bound" | "standalone";
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Check if a directory is inside a git repository
|
|
23
|
-
* Walks up the directory tree looking for .git
|
|
24
|
-
*/
|
|
25
|
-
export async function isInsideGitRepo(dir: string): Promise<boolean> {
|
|
26
|
-
let current = path.resolve(dir);
|
|
27
|
-
const root = path.parse(current).root;
|
|
28
|
-
|
|
29
|
-
while (current !== root) {
|
|
30
|
-
try {
|
|
31
|
-
const gitPath = path.join(current, ".git");
|
|
32
|
-
const stat = await fs.stat(gitPath);
|
|
33
|
-
if (stat.isDirectory() || stat.isFile()) {
|
|
34
|
-
// .git can be a file in worktrees
|
|
35
|
-
return true;
|
|
36
|
-
}
|
|
37
|
-
} catch {
|
|
38
|
-
// .git doesn't exist at this level, continue up
|
|
39
|
-
}
|
|
40
|
-
current = path.dirname(current);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Get the root of the git repository containing a directory
|
|
48
|
-
* Returns undefined if not inside a git repo
|
|
49
|
-
*/
|
|
50
|
-
export async function getGitRoot(dir: string): Promise<string | undefined> {
|
|
51
|
-
let current = path.resolve(dir);
|
|
52
|
-
const root = path.parse(current).root;
|
|
53
|
-
|
|
54
|
-
while (current !== root) {
|
|
55
|
-
try {
|
|
56
|
-
const gitPath = path.join(current, ".git");
|
|
57
|
-
const stat = await fs.stat(gitPath);
|
|
58
|
-
if (stat.isDirectory() || stat.isFile()) {
|
|
59
|
-
return current;
|
|
60
|
-
}
|
|
61
|
-
} catch {
|
|
62
|
-
// Continue up
|
|
63
|
-
}
|
|
64
|
-
current = path.dirname(current);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Check if a directory has sync configuration enabled
|
|
72
|
-
*/
|
|
73
|
-
export async function hasSyncConfig(dir: string): Promise<boolean> {
|
|
74
|
-
const configPath = getConfigPath(dir);
|
|
75
|
-
|
|
76
|
-
try {
|
|
77
|
-
const content = await fs.readFile(configPath, "utf-8");
|
|
78
|
-
const config = JSON.parse(content);
|
|
79
|
-
// Check if sync is explicitly enabled or has a path configured
|
|
80
|
-
return config.sync?.enabled === true || typeof config.sync?.path === "string";
|
|
81
|
-
} catch {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Detect the directory type based on git repo presence and sync config
|
|
88
|
-
*
|
|
89
|
-
* - If has sync config -> standalone (uses minimem central repo sync)
|
|
90
|
-
* - If inside git repo -> project-bound (synced via project's git)
|
|
91
|
-
* - Otherwise -> standalone (default, can set up sync later)
|
|
92
|
-
*/
|
|
93
|
-
export async function detectDirectoryType(dir: string): Promise<DirectoryType> {
|
|
94
|
-
const hasSync = await hasSyncConfig(dir);
|
|
95
|
-
|
|
96
|
-
// If has sync config, it's standalone (uses minimem sync)
|
|
97
|
-
if (hasSync) {
|
|
98
|
-
return "standalone";
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// If inside git repo, it's project-bound (synced via git)
|
|
102
|
-
const inGit = await isInsideGitRepo(dir);
|
|
103
|
-
if (inGit) {
|
|
104
|
-
return "project-bound";
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Default to standalone (can set up sync later)
|
|
108
|
-
return "standalone";
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Get detailed directory info including type and git root
|
|
113
|
-
*/
|
|
114
|
-
export async function getDirectoryInfo(dir: string): Promise<{
|
|
115
|
-
type: DirectoryType;
|
|
116
|
-
gitRoot?: string;
|
|
117
|
-
hasSyncConfig: boolean;
|
|
118
|
-
}> {
|
|
119
|
-
const [hasSync, gitRoot] = await Promise.all([
|
|
120
|
-
hasSyncConfig(dir),
|
|
121
|
-
getGitRoot(dir),
|
|
122
|
-
]);
|
|
123
|
-
|
|
124
|
-
let type: DirectoryType;
|
|
125
|
-
if (hasSync) {
|
|
126
|
-
type = "standalone";
|
|
127
|
-
} else if (gitRoot !== undefined) {
|
|
128
|
-
type = "project-bound";
|
|
129
|
-
} else {
|
|
130
|
-
type = "standalone";
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return {
|
|
134
|
-
type,
|
|
135
|
-
gitRoot,
|
|
136
|
-
hasSyncConfig: hasSync,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sync module - Git-based syncing for memory directories
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export {
|
|
6
|
-
type DirectoryType,
|
|
7
|
-
detectDirectoryType,
|
|
8
|
-
isInsideGitRepo,
|
|
9
|
-
getGitRoot,
|
|
10
|
-
hasSyncConfig,
|
|
11
|
-
getDirectoryInfo,
|
|
12
|
-
} from "./detection.js";
|
|
13
|
-
|
|
14
|
-
export {
|
|
15
|
-
type Registry,
|
|
16
|
-
type RegistryMapping,
|
|
17
|
-
type CollisionCheckResult,
|
|
18
|
-
createEmptyRegistry,
|
|
19
|
-
readRegistry,
|
|
20
|
-
writeRegistry,
|
|
21
|
-
getRegistryPath,
|
|
22
|
-
checkCollision,
|
|
23
|
-
addMapping,
|
|
24
|
-
removeMapping,
|
|
25
|
-
findMapping,
|
|
26
|
-
getMachineMappings,
|
|
27
|
-
updateLastSync,
|
|
28
|
-
normalizePath,
|
|
29
|
-
compressPath,
|
|
30
|
-
normalizeRepoPath,
|
|
31
|
-
} from "./registry.js";
|
|
32
|
-
|
|
33
|
-
export {
|
|
34
|
-
type InitCentralResult,
|
|
35
|
-
initCentralRepo,
|
|
36
|
-
validateCentralRepo,
|
|
37
|
-
getCentralRepoPath,
|
|
38
|
-
} from "./central.js";
|
|
39
|
-
|
|
40
|
-
export {
|
|
41
|
-
type SyncState,
|
|
42
|
-
type FileHashInfo,
|
|
43
|
-
type FileSyncStatus,
|
|
44
|
-
createEmptySyncState,
|
|
45
|
-
loadSyncState,
|
|
46
|
-
saveSyncState,
|
|
47
|
-
computeFileHash,
|
|
48
|
-
computeContentHash,
|
|
49
|
-
listSyncableFiles,
|
|
50
|
-
getFileHashInfo,
|
|
51
|
-
getFileSyncStatus,
|
|
52
|
-
updateSyncStateAfterSync,
|
|
53
|
-
removeFileFromSyncState,
|
|
54
|
-
buildSyncState,
|
|
55
|
-
getSyncStatePath,
|
|
56
|
-
} from "./state.js";
|
|
57
|
-
|
|
58
|
-
export {
|
|
59
|
-
type FileConflict,
|
|
60
|
-
type ConflictDetectionResult,
|
|
61
|
-
detectConflicts,
|
|
62
|
-
createShadowCopy,
|
|
63
|
-
readShadowCopy,
|
|
64
|
-
deleteShadowCopy,
|
|
65
|
-
cleanShadows,
|
|
66
|
-
quarantineConflict,
|
|
67
|
-
listQuarantinedConflicts,
|
|
68
|
-
getShadowsDir,
|
|
69
|
-
getConflictsDir,
|
|
70
|
-
createShadowsForConflicts,
|
|
71
|
-
} from "./conflicts.js";
|
|
72
|
-
|
|
73
|
-
export {
|
|
74
|
-
type SyncResult,
|
|
75
|
-
push,
|
|
76
|
-
pull,
|
|
77
|
-
bidirectionalSync,
|
|
78
|
-
} from "./operations.js";
|
|
79
|
-
|
|
80
|
-
export {
|
|
81
|
-
type WatcherEvent,
|
|
82
|
-
type FileChange,
|
|
83
|
-
type WatcherOptions,
|
|
84
|
-
type WatcherInstance,
|
|
85
|
-
createFileWatcher,
|
|
86
|
-
createMultiDirWatcher,
|
|
87
|
-
} from "./watcher.js";
|
|
88
|
-
|
|
89
|
-
export {
|
|
90
|
-
type DaemonOptions,
|
|
91
|
-
type DaemonStatus,
|
|
92
|
-
getDaemonDir,
|
|
93
|
-
getPidFilePath,
|
|
94
|
-
getDaemonLogPath,
|
|
95
|
-
isDaemonRunning,
|
|
96
|
-
getDaemonStatus,
|
|
97
|
-
stopDaemon,
|
|
98
|
-
startDaemon,
|
|
99
|
-
startDaemonBackground,
|
|
100
|
-
} from "./daemon.js";
|
|
101
|
-
|
|
102
|
-
export {
|
|
103
|
-
type ValidationIssue,
|
|
104
|
-
type ValidationResult,
|
|
105
|
-
validateRegistry,
|
|
106
|
-
formatValidationResult,
|
|
107
|
-
} from "./validation.js";
|
|
@@ -1,373 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sync operations - push and pull
|
|
3
|
-
*
|
|
4
|
-
* Uses last-write-wins conflict resolution:
|
|
5
|
-
* - Push: local overwrites remote
|
|
6
|
-
* - Pull: remote overwrites local
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import fs from "node:fs/promises";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
import crypto from "node:crypto";
|
|
12
|
-
|
|
13
|
-
import { getSyncConfig } from "../config.js";
|
|
14
|
-
import { getCentralRepoPath } from "./central.js";
|
|
15
|
-
import {
|
|
16
|
-
loadSyncState,
|
|
17
|
-
saveSyncState,
|
|
18
|
-
listSyncableFiles,
|
|
19
|
-
computeFileHash,
|
|
20
|
-
getFileSyncStatus,
|
|
21
|
-
getFileHashInfo,
|
|
22
|
-
} from "./state.js";
|
|
23
|
-
import { readRegistry, writeRegistry, updateLastSync } from "./registry.js";
|
|
24
|
-
import { getMachineId } from "../config.js";
|
|
25
|
-
import { appendSyncLog, type SyncLogEntry } from "../commands/conflicts.js";
|
|
26
|
-
|
|
27
|
-
export type SyncResult = {
|
|
28
|
-
success: boolean;
|
|
29
|
-
pushed: string[];
|
|
30
|
-
pulled: string[];
|
|
31
|
-
errors: string[];
|
|
32
|
-
skipped: string[];
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Ensure a directory exists
|
|
37
|
-
*/
|
|
38
|
-
async function ensureDir(dirPath: string): Promise<void> {
|
|
39
|
-
await fs.mkdir(dirPath, { recursive: true });
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Copy a file atomically via temp file
|
|
44
|
-
*/
|
|
45
|
-
async function copyFileAtomic(src: string, dest: string): Promise<void> {
|
|
46
|
-
const destDir = path.dirname(dest);
|
|
47
|
-
await ensureDir(destDir);
|
|
48
|
-
|
|
49
|
-
const tempDest = `${dest}.${crypto.randomBytes(4).toString("hex")}.tmp`;
|
|
50
|
-
|
|
51
|
-
try {
|
|
52
|
-
await fs.copyFile(src, tempDest);
|
|
53
|
-
await fs.rename(tempDest, dest);
|
|
54
|
-
} catch (error) {
|
|
55
|
-
// Clean up temp file on error
|
|
56
|
-
try {
|
|
57
|
-
await fs.unlink(tempDest);
|
|
58
|
-
} catch {
|
|
59
|
-
// Ignore cleanup errors
|
|
60
|
-
}
|
|
61
|
-
throw error;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Push local changes to central repository
|
|
67
|
-
*
|
|
68
|
-
* Last-write-wins: local files always overwrite remote files
|
|
69
|
-
*/
|
|
70
|
-
export async function push(
|
|
71
|
-
memoryDir: string,
|
|
72
|
-
options: {
|
|
73
|
-
force?: boolean;
|
|
74
|
-
dryRun?: boolean;
|
|
75
|
-
} = {}
|
|
76
|
-
): Promise<SyncResult> {
|
|
77
|
-
const result: SyncResult = {
|
|
78
|
-
success: true,
|
|
79
|
-
pushed: [],
|
|
80
|
-
pulled: [],
|
|
81
|
-
errors: [],
|
|
82
|
-
skipped: [],
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
// Get config
|
|
86
|
-
const syncConfig = await getSyncConfig(memoryDir);
|
|
87
|
-
if (!syncConfig.enabled || !syncConfig.path) {
|
|
88
|
-
result.success = false;
|
|
89
|
-
result.errors.push("Sync not configured for this directory");
|
|
90
|
-
return result;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const centralRepo = await getCentralRepoPath();
|
|
94
|
-
if (!centralRepo) {
|
|
95
|
-
result.success = false;
|
|
96
|
-
result.errors.push("No central repository configured");
|
|
97
|
-
return result;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const remotePath = path.join(centralRepo, syncConfig.path);
|
|
101
|
-
|
|
102
|
-
// Load state
|
|
103
|
-
const state = await loadSyncState(memoryDir, syncConfig.path);
|
|
104
|
-
|
|
105
|
-
// Get all local files
|
|
106
|
-
const localFiles = await listSyncableFiles(
|
|
107
|
-
memoryDir,
|
|
108
|
-
syncConfig.include,
|
|
109
|
-
syncConfig.exclude
|
|
110
|
-
);
|
|
111
|
-
|
|
112
|
-
// Get all remote files for comparison
|
|
113
|
-
const remoteFiles = await listSyncableFiles(
|
|
114
|
-
remotePath,
|
|
115
|
-
syncConfig.include,
|
|
116
|
-
syncConfig.exclude
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
const allFiles = new Set([...localFiles, ...remoteFiles]);
|
|
120
|
-
|
|
121
|
-
// Process each file
|
|
122
|
-
for (const file of allFiles) {
|
|
123
|
-
const localPath = path.join(memoryDir, file);
|
|
124
|
-
const remoteFilePath = path.join(remotePath, file);
|
|
125
|
-
|
|
126
|
-
try {
|
|
127
|
-
const [localInfo, remoteInfo] = await Promise.all([
|
|
128
|
-
getFileHashInfo(localPath),
|
|
129
|
-
getFileHashInfo(remoteFilePath),
|
|
130
|
-
]);
|
|
131
|
-
|
|
132
|
-
const status = getFileSyncStatus(
|
|
133
|
-
localInfo.hash ?? null,
|
|
134
|
-
remoteInfo.hash ?? null
|
|
135
|
-
);
|
|
136
|
-
|
|
137
|
-
switch (status) {
|
|
138
|
-
case "unchanged":
|
|
139
|
-
// Already in sync
|
|
140
|
-
break;
|
|
141
|
-
|
|
142
|
-
case "local-only":
|
|
143
|
-
case "local-modified":
|
|
144
|
-
// Push local to remote (last-write-wins)
|
|
145
|
-
if (!options.dryRun) {
|
|
146
|
-
await copyFileAtomic(localPath, remoteFilePath);
|
|
147
|
-
const hash = localInfo.hash!;
|
|
148
|
-
state.files[file] = {
|
|
149
|
-
localHash: hash,
|
|
150
|
-
remoteHash: hash,
|
|
151
|
-
lastModified: new Date().toISOString(),
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
result.pushed.push(file);
|
|
155
|
-
break;
|
|
156
|
-
|
|
157
|
-
case "remote-only":
|
|
158
|
-
// File only exists on remote - skip on push (don't delete)
|
|
159
|
-
result.skipped.push(file);
|
|
160
|
-
break;
|
|
161
|
-
|
|
162
|
-
default:
|
|
163
|
-
result.skipped.push(file);
|
|
164
|
-
break;
|
|
165
|
-
}
|
|
166
|
-
} catch (error) {
|
|
167
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
168
|
-
result.errors.push(`${file}: ${message}`);
|
|
169
|
-
result.success = false;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Save state and update registry
|
|
174
|
-
if (!options.dryRun && result.pushed.length > 0) {
|
|
175
|
-
state.lastSync = new Date().toISOString();
|
|
176
|
-
await saveSyncState(memoryDir, state);
|
|
177
|
-
|
|
178
|
-
// Update registry lastSync
|
|
179
|
-
const machineId = await getMachineId();
|
|
180
|
-
const registry = await readRegistry(centralRepo);
|
|
181
|
-
const updatedRegistry = updateLastSync(registry, syncConfig.path, machineId);
|
|
182
|
-
await writeRegistry(centralRepo, updatedRegistry);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// Log the sync operation
|
|
186
|
-
if (!options.dryRun) {
|
|
187
|
-
const logEntry: SyncLogEntry = {
|
|
188
|
-
timestamp: new Date().toISOString(),
|
|
189
|
-
operation: "push",
|
|
190
|
-
result: result.success ? "success" : "failure",
|
|
191
|
-
pushed: result.pushed.length,
|
|
192
|
-
errors: result.errors.length > 0 ? result.errors : undefined,
|
|
193
|
-
};
|
|
194
|
-
await appendSyncLog(memoryDir, logEntry);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
return result;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Pull changes from central repository
|
|
202
|
-
*
|
|
203
|
-
* Last-write-wins: remote files always overwrite local files
|
|
204
|
-
*/
|
|
205
|
-
export async function pull(
|
|
206
|
-
memoryDir: string,
|
|
207
|
-
options: {
|
|
208
|
-
force?: boolean;
|
|
209
|
-
dryRun?: boolean;
|
|
210
|
-
} = {}
|
|
211
|
-
): Promise<SyncResult> {
|
|
212
|
-
const result: SyncResult = {
|
|
213
|
-
success: true,
|
|
214
|
-
pushed: [],
|
|
215
|
-
pulled: [],
|
|
216
|
-
errors: [],
|
|
217
|
-
skipped: [],
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
// Get config
|
|
221
|
-
const syncConfig = await getSyncConfig(memoryDir);
|
|
222
|
-
if (!syncConfig.enabled || !syncConfig.path) {
|
|
223
|
-
result.success = false;
|
|
224
|
-
result.errors.push("Sync not configured for this directory");
|
|
225
|
-
return result;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
const centralRepo = await getCentralRepoPath();
|
|
229
|
-
if (!centralRepo) {
|
|
230
|
-
result.success = false;
|
|
231
|
-
result.errors.push("No central repository configured");
|
|
232
|
-
return result;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const remotePath = path.join(centralRepo, syncConfig.path);
|
|
236
|
-
|
|
237
|
-
// Load state
|
|
238
|
-
const state = await loadSyncState(memoryDir, syncConfig.path);
|
|
239
|
-
|
|
240
|
-
// Get all files from both sides
|
|
241
|
-
const localFiles = await listSyncableFiles(
|
|
242
|
-
memoryDir,
|
|
243
|
-
syncConfig.include,
|
|
244
|
-
syncConfig.exclude
|
|
245
|
-
);
|
|
246
|
-
|
|
247
|
-
const remoteFiles = await listSyncableFiles(
|
|
248
|
-
remotePath,
|
|
249
|
-
syncConfig.include,
|
|
250
|
-
syncConfig.exclude
|
|
251
|
-
);
|
|
252
|
-
|
|
253
|
-
const allFiles = new Set([...localFiles, ...remoteFiles]);
|
|
254
|
-
|
|
255
|
-
// Process each file
|
|
256
|
-
for (const file of allFiles) {
|
|
257
|
-
const localPath = path.join(memoryDir, file);
|
|
258
|
-
const remoteFilePath = path.join(remotePath, file);
|
|
259
|
-
|
|
260
|
-
try {
|
|
261
|
-
const [localInfo, remoteInfo] = await Promise.all([
|
|
262
|
-
getFileHashInfo(localPath),
|
|
263
|
-
getFileHashInfo(remoteFilePath),
|
|
264
|
-
]);
|
|
265
|
-
|
|
266
|
-
const status = getFileSyncStatus(
|
|
267
|
-
localInfo.hash ?? null,
|
|
268
|
-
remoteInfo.hash ?? null
|
|
269
|
-
);
|
|
270
|
-
|
|
271
|
-
switch (status) {
|
|
272
|
-
case "unchanged":
|
|
273
|
-
// Already in sync
|
|
274
|
-
break;
|
|
275
|
-
|
|
276
|
-
case "remote-only":
|
|
277
|
-
// Pull new remote file to local
|
|
278
|
-
if (!options.dryRun) {
|
|
279
|
-
await copyFileAtomic(remoteFilePath, localPath);
|
|
280
|
-
const hash = remoteInfo.hash!;
|
|
281
|
-
state.files[file] = {
|
|
282
|
-
localHash: hash,
|
|
283
|
-
remoteHash: hash,
|
|
284
|
-
lastModified: new Date().toISOString(),
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
result.pulled.push(file);
|
|
288
|
-
break;
|
|
289
|
-
|
|
290
|
-
case "local-modified":
|
|
291
|
-
// Both have changes - with last-write-wins, pull overwrites local
|
|
292
|
-
if (options.force || !localInfo.exists) {
|
|
293
|
-
if (!options.dryRun) {
|
|
294
|
-
await copyFileAtomic(remoteFilePath, localPath);
|
|
295
|
-
const hash = remoteInfo.hash!;
|
|
296
|
-
state.files[file] = {
|
|
297
|
-
localHash: hash,
|
|
298
|
-
remoteHash: hash,
|
|
299
|
-
lastModified: new Date().toISOString(),
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
|
-
result.pulled.push(file);
|
|
303
|
-
} else {
|
|
304
|
-
// Without --force, skip files that have local changes
|
|
305
|
-
result.skipped.push(file);
|
|
306
|
-
}
|
|
307
|
-
break;
|
|
308
|
-
|
|
309
|
-
case "local-only":
|
|
310
|
-
// File only exists locally - skip on pull (don't delete)
|
|
311
|
-
result.skipped.push(file);
|
|
312
|
-
break;
|
|
313
|
-
|
|
314
|
-
default:
|
|
315
|
-
result.skipped.push(file);
|
|
316
|
-
break;
|
|
317
|
-
}
|
|
318
|
-
} catch (error) {
|
|
319
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
320
|
-
result.errors.push(`${file}: ${message}`);
|
|
321
|
-
result.success = false;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
// Save state and update registry
|
|
326
|
-
if (!options.dryRun && result.pulled.length > 0) {
|
|
327
|
-
state.lastSync = new Date().toISOString();
|
|
328
|
-
await saveSyncState(memoryDir, state);
|
|
329
|
-
|
|
330
|
-
// Update registry lastSync
|
|
331
|
-
const machineId = await getMachineId();
|
|
332
|
-
const registry = await readRegistry(centralRepo);
|
|
333
|
-
const updatedRegistry = updateLastSync(registry, syncConfig.path, machineId);
|
|
334
|
-
await writeRegistry(centralRepo, updatedRegistry);
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
// Log the sync operation
|
|
338
|
-
if (!options.dryRun) {
|
|
339
|
-
const logEntry: SyncLogEntry = {
|
|
340
|
-
timestamp: new Date().toISOString(),
|
|
341
|
-
operation: "pull",
|
|
342
|
-
result: result.success ? "success" : "failure",
|
|
343
|
-
pulled: result.pulled.length,
|
|
344
|
-
errors: result.errors.length > 0 ? result.errors : undefined,
|
|
345
|
-
};
|
|
346
|
-
await appendSyncLog(memoryDir, logEntry);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
return result;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* Bidirectional sync - push local changes, pull remote changes
|
|
354
|
-
*/
|
|
355
|
-
export async function bidirectionalSync(
|
|
356
|
-
memoryDir: string,
|
|
357
|
-
options: {
|
|
358
|
-
force?: boolean;
|
|
359
|
-
dryRun?: boolean;
|
|
360
|
-
} = {}
|
|
361
|
-
): Promise<SyncResult> {
|
|
362
|
-
// First push, then pull
|
|
363
|
-
const pushResult = await push(memoryDir, options);
|
|
364
|
-
const pullResult = await pull(memoryDir, options);
|
|
365
|
-
|
|
366
|
-
return {
|
|
367
|
-
success: pushResult.success && pullResult.success,
|
|
368
|
-
pushed: pushResult.pushed,
|
|
369
|
-
pulled: pullResult.pulled,
|
|
370
|
-
errors: [...pushResult.errors, ...pullResult.errors],
|
|
371
|
-
skipped: [...new Set([...pushResult.skipped, ...pullResult.skipped])],
|
|
372
|
-
};
|
|
373
|
-
}
|