cognitive-core 0.2.1 → 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/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/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/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/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 +2 -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/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/workspace/types.ts +22 -78
- package/tests/integration/curated-sources-e2e.test.ts +502 -0
- package/tests/memory/compound-engineering-seed.test.ts +338 -0
- package/tests/memory/curated-loader-extended.test.ts +225 -0
- package/tests/memory/playbook-quality-validation.test.ts +430 -0
- package/tests/memory/source-resolver.test.ts +700 -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,759 +0,0 @@
|
|
|
1
|
-
# Multi-Agent Skill Synchronization Design
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
This document explores how skill-tree can support synchronization across multiple agents and compute environments, enabling collaborative skill sharing and evolution.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Design Decisions
|
|
10
|
-
|
|
11
|
-
The following decisions have been made based on design discussions:
|
|
12
|
-
|
|
13
|
-
| Decision | Choice | Rationale |
|
|
14
|
-
|----------|--------|-----------|
|
|
15
|
-
| **Sync Model** | Shared Main (Model A) | Simple to start, can evolve to Model C later |
|
|
16
|
-
| **Transport** | Git-first, HTTP later | Git gives versioning for free, hybrid approach |
|
|
17
|
-
| **Sync Frequency** | Periodic | Simpler than real-time, sufficient for most cases |
|
|
18
|
-
| **Conflict Resolution** | Auto-resolve when possible | `prefer-newer` + `prefer-local`, use `SkillMerger` for complex |
|
|
19
|
-
| **Agent Identity** | User-provided slug | Simple, human-readable, optional UUID later |
|
|
20
|
-
| **Version Storage** | Git history in git mode | `.versions/` folder is mirror only, not source of truth |
|
|
21
|
-
| **MVP Scope** | Pull, push, conflict workflow | Minimum viable for multi-agent collaboration |
|
|
22
|
-
|
|
23
|
-
### Version Storage Clarification
|
|
24
|
-
|
|
25
|
-
In **git mode**, the `.versions/` folder behavior changes:
|
|
26
|
-
- Git commit history is the **source of truth** for version history
|
|
27
|
-
- `.versions/` folder is **optional mirror** for non-git access patterns
|
|
28
|
-
- `getVersionHistory()` reads from git log, not filesystem
|
|
29
|
-
- Local storage (SQLite/Memory) still uses `.versions/` as primary
|
|
30
|
-
|
|
31
|
-
## Current Architecture (What We Have)
|
|
32
|
-
|
|
33
|
-
### Existing Strengths
|
|
34
|
-
- **StorageAdapter interface** - Clean abstraction (Memory, Filesystem, SQLite)
|
|
35
|
-
- **FilesystemStorageAdapter** - YAML frontmatter + Markdown (git-friendly)
|
|
36
|
-
- **SkillMerger** - Field-level conflict detection with multiple strategies
|
|
37
|
-
- **LineageTracker** - Version history, forks, parentVersion, derivedFrom
|
|
38
|
-
- **Content hashing** - Change detection via contentHash
|
|
39
|
-
- **SyncService** - Basic GitHub pull-based sync with ETag tracking
|
|
40
|
-
|
|
41
|
-
### Current Limitations
|
|
42
|
-
- No push capability (pull-only from GitHub)
|
|
43
|
-
- No agent-to-agent sync
|
|
44
|
-
- No distributed conflict resolution
|
|
45
|
-
- No agent identity/provenance tracking
|
|
46
|
-
- Version history stored in `.versions/` folders (redundant with git)
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## Proposed Architecture
|
|
51
|
-
|
|
52
|
-
### Repository Structure
|
|
53
|
-
|
|
54
|
-
```
|
|
55
|
-
skills-repo/
|
|
56
|
-
├── .git/
|
|
57
|
-
├── skills/
|
|
58
|
-
│ ├── error-handling-python/
|
|
59
|
-
│ │ └── SKILL.md # YAML frontmatter + markdown
|
|
60
|
-
│ ├── api-rate-limiting/
|
|
61
|
-
│ │ └── SKILL.md
|
|
62
|
-
│ └── ...
|
|
63
|
-
├── .skillbank/
|
|
64
|
-
│ ├── config.yaml # Sync settings, remote URLs
|
|
65
|
-
│ ├── agents/ # Agent manifests
|
|
66
|
-
│ │ ├── agent-alpha.yaml
|
|
67
|
-
│ │ └── agent-beta.yaml
|
|
68
|
-
│ ├── sync-state.yaml # Track what's synced where
|
|
69
|
-
│ └── conflicts/ # Unresolved conflicts
|
|
70
|
-
│ └── {skillId}-{timestamp}.yaml
|
|
71
|
-
├── taxonomy/
|
|
72
|
-
│ └── tree.yaml # Shared taxonomy
|
|
73
|
-
└── README.md
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
**Key insight**: Git history IS version history. No need for `.versions/` folders—each skill version is a commit.
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## Core Interfaces
|
|
81
|
-
|
|
82
|
-
### SyncConfig
|
|
83
|
-
|
|
84
|
-
```typescript
|
|
85
|
-
interface SyncConfig {
|
|
86
|
-
// Remote repository configuration
|
|
87
|
-
remote: {
|
|
88
|
-
type: 'git' | 'http' | 'custom';
|
|
89
|
-
url: string; // git@github.com:org/skills.git
|
|
90
|
-
branch?: string; // default: 'main'
|
|
91
|
-
skillsPath?: string; // default: 'skills/'
|
|
92
|
-
auth?: {
|
|
93
|
-
type: 'ssh' | 'token' | 'oauth';
|
|
94
|
-
// ... credentials
|
|
95
|
-
};
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
// Agent identity
|
|
99
|
-
agent: {
|
|
100
|
-
id: string; // unique identifier (uuid or slug)
|
|
101
|
-
name?: string; // human-readable
|
|
102
|
-
environment?: string; // 'production', 'dev', 'agent-cluster-1'
|
|
103
|
-
capabilities?: string[]; // what this agent specializes in
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
// Sync behavior
|
|
107
|
-
sync: {
|
|
108
|
-
mode: 'manual' | 'on-change' | 'periodic';
|
|
109
|
-
intervalMs?: number; // for periodic mode
|
|
110
|
-
pushStrategy: 'immediate' | 'batch' | 'validated-only';
|
|
111
|
-
pullStrategy: 'auto-merge' | 'manual' | 'preview-first';
|
|
112
|
-
branchStrategy: 'shared-main' | 'agent-branches' | 'promotion';
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
// Conflict resolution
|
|
116
|
-
conflicts: {
|
|
117
|
-
defaultStrategy: ConflictStrategy;
|
|
118
|
-
fieldStrategies?: Record<keyof Skill, ConflictStrategy>;
|
|
119
|
-
autoResolveThreshold?: number; // confidence level for auto-resolve
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
type ConflictStrategy =
|
|
124
|
-
| 'prefer-local' // keep local version
|
|
125
|
-
| 'prefer-remote' // accept remote version
|
|
126
|
-
| 'prefer-newer' // compare updatedAt timestamps
|
|
127
|
-
| 'union' // for arrays: combine unique items
|
|
128
|
-
| 'combine' // for strings: concatenate
|
|
129
|
-
| 'manual'; // delegate to SkillMerger for resolution
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### SyncService Interface
|
|
133
|
-
|
|
134
|
-
```typescript
|
|
135
|
-
interface SyncService {
|
|
136
|
-
// Initialize sync (clone or configure existing repo)
|
|
137
|
-
initialize(config: SyncConfig): Promise<void>;
|
|
138
|
-
|
|
139
|
-
// Fetch remote state without applying
|
|
140
|
-
fetch(): Promise<RemoteState>;
|
|
141
|
-
|
|
142
|
-
// Pull and merge remote changes
|
|
143
|
-
pull(options?: PullOptions): Promise<SyncResult>;
|
|
144
|
-
|
|
145
|
-
// Push local changes to remote
|
|
146
|
-
push(options?: PushOptions): Promise<SyncResult>;
|
|
147
|
-
|
|
148
|
-
// Get current sync status
|
|
149
|
-
status(): Promise<SyncStatus>;
|
|
150
|
-
|
|
151
|
-
// Resolve a pending conflict
|
|
152
|
-
resolveConflict(skillId: string, resolution: ConflictResolution): Promise<void>;
|
|
153
|
-
|
|
154
|
-
// List pending conflicts
|
|
155
|
-
listConflicts(): Promise<SkillConflict[]>;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
interface PullOptions {
|
|
159
|
-
skillIds?: string[]; // specific skills, or all
|
|
160
|
-
force?: boolean; // overwrite local changes
|
|
161
|
-
dryRun?: boolean; // preview only
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
interface PushOptions {
|
|
165
|
-
skillIds?: string[]; // specific skills, or all
|
|
166
|
-
message?: string; // commit message
|
|
167
|
-
force?: boolean; // overwrite remote (dangerous)
|
|
168
|
-
minValidationScore?: number; // only push validated skills
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
interface SyncResult {
|
|
172
|
-
pulled: SkillChange[];
|
|
173
|
-
pushed: SkillChange[];
|
|
174
|
-
conflicts: SkillConflict[];
|
|
175
|
-
autoMerged: SkillMerge[];
|
|
176
|
-
errors: SyncError[];
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
interface SyncStatus {
|
|
180
|
-
lastSync: Date;
|
|
181
|
-
localAhead: number; // commits ahead of remote
|
|
182
|
-
localBehind: number; // commits behind remote
|
|
183
|
-
pendingConflicts: number;
|
|
184
|
-
modifiedSkills: string[]; // locally modified
|
|
185
|
-
stagedSkills: string[]; // ready to push
|
|
186
|
-
}
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
### Skill Conflict Model
|
|
190
|
-
|
|
191
|
-
```typescript
|
|
192
|
-
interface SkillConflict {
|
|
193
|
-
skillId: string;
|
|
194
|
-
localVersion: Skill;
|
|
195
|
-
remoteVersion: Skill;
|
|
196
|
-
baseVersion?: Skill; // common ancestor (3-way merge)
|
|
197
|
-
conflictingFields: (keyof Skill)[];
|
|
198
|
-
suggestedResolution?: Skill; // auto-merged where possible
|
|
199
|
-
confidence: number; // 0-1, how confident in suggestion
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
interface ConflictResolution {
|
|
203
|
-
strategy: 'accept-local' | 'accept-remote' | 'accept-merged' | 'custom';
|
|
204
|
-
customSkill?: Skill; // for 'custom' strategy
|
|
205
|
-
fieldOverrides?: Partial<Record<keyof Skill, 'local' | 'remote'>>;
|
|
206
|
-
}
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
### Agent Provenance
|
|
210
|
-
|
|
211
|
-
```typescript
|
|
212
|
-
// Added to Skill interface
|
|
213
|
-
interface SkillProvenance {
|
|
214
|
-
createdBy: AgentRef;
|
|
215
|
-
modifiedBy: AgentRef[];
|
|
216
|
-
validatedBy: AgentValidation[];
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
interface AgentRef {
|
|
220
|
-
agentId: string;
|
|
221
|
-
environment?: string;
|
|
222
|
-
timestamp: Date;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
interface AgentValidation {
|
|
226
|
-
agentId: string;
|
|
227
|
-
timestamp: Date;
|
|
228
|
-
outcome: 'success' | 'failure' | 'partial';
|
|
229
|
-
context?: string; // what task was this used for
|
|
230
|
-
score?: number; // 0-1 effectiveness rating
|
|
231
|
-
}
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
---
|
|
235
|
-
|
|
236
|
-
## Sync Models
|
|
237
|
-
|
|
238
|
-
### Model A: Shared Main Branch
|
|
239
|
-
|
|
240
|
-
```
|
|
241
|
-
main ─────●─────●─────●─────●─────●
|
|
242
|
-
↑ ↑ ↑ ↑ ↑
|
|
243
|
-
agent1 agent2 agent1 agent3 agent2
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
**How it works:**
|
|
247
|
-
- All agents push directly to main
|
|
248
|
-
- Conflicts resolved at push time
|
|
249
|
-
- First to push wins; others must pull and merge
|
|
250
|
-
|
|
251
|
-
**Pros:**
|
|
252
|
-
- Simple mental model
|
|
253
|
-
- Always up-to-date
|
|
254
|
-
- Single source of truth
|
|
255
|
-
|
|
256
|
-
**Cons:**
|
|
257
|
-
- Contention with many agents
|
|
258
|
-
- Fast-moving skills may conflict often
|
|
259
|
-
- Requires good auto-merge or frequent manual resolution
|
|
260
|
-
|
|
261
|
-
**Best for:** Small teams, low-frequency updates, high-trust environments
|
|
262
|
-
|
|
263
|
-
---
|
|
264
|
-
|
|
265
|
-
### Model B: Agent Branches + Periodic Merge
|
|
266
|
-
|
|
267
|
-
```
|
|
268
|
-
main ────────●───────────────●───────────────●
|
|
269
|
-
│ │ │
|
|
270
|
-
agent-alpha ─┴──●──●──●──────┴──●──●──●──────┴──
|
|
271
|
-
│
|
|
272
|
-
agent-beta ──┴──●──●─────●──────●──●─────●─────
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
**How it works:**
|
|
276
|
-
- Each agent works on their own branch
|
|
277
|
-
- Periodic sync to/from main (manual or scheduled)
|
|
278
|
-
- Agents can cherry-pick from each other
|
|
279
|
-
|
|
280
|
-
**Pros:**
|
|
281
|
-
- Isolation—agents don't block each other
|
|
282
|
-
- Can work offline for extended periods
|
|
283
|
-
- Review before merging to main
|
|
284
|
-
|
|
285
|
-
**Cons:**
|
|
286
|
-
- Merge complexity increases over time
|
|
287
|
-
- Divergence risk
|
|
288
|
-
- More branches to manage
|
|
289
|
-
|
|
290
|
-
**Best for:** Distributed teams, agents with different specializations, environments needing review gates
|
|
291
|
-
|
|
292
|
-
---
|
|
293
|
-
|
|
294
|
-
### Model C: Validation-Based Promotion
|
|
295
|
-
|
|
296
|
-
```
|
|
297
|
-
┌─────────────┐
|
|
298
|
-
│ active │ (validated by 3+ agents)
|
|
299
|
-
└──────▲──────┘
|
|
300
|
-
│ promote
|
|
301
|
-
┌──────┴──────┐
|
|
302
|
-
│ experimental │ (validated by 1+ agent)
|
|
303
|
-
└──────▲──────┘
|
|
304
|
-
│ promote
|
|
305
|
-
┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
|
306
|
-
│ Agent 1 │ │ Agent 2 │ │ Agent 3 │──────┘
|
|
307
|
-
│ (draft) │ │ (draft) │ │ (draft) │
|
|
308
|
-
└─────────┘ └─────────┘ └─────────┘
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
**How it works:**
|
|
312
|
-
- Skills created locally as `draft`
|
|
313
|
-
- After N successful uses → pushed as `experimental`
|
|
314
|
-
- After M validations across agents → promoted to `active`
|
|
315
|
-
- Conflicts resolved by validation score
|
|
316
|
-
|
|
317
|
-
**Promotion rules:**
|
|
318
|
-
```typescript
|
|
319
|
-
interface PromotionRules {
|
|
320
|
-
draftToExperimental: {
|
|
321
|
-
minLocalSuccesses: number; // e.g., 3
|
|
322
|
-
minSuccessRate: number; // e.g., 0.7
|
|
323
|
-
};
|
|
324
|
-
experimentalToActive: {
|
|
325
|
-
minAgentValidations: number; // e.g., 3 different agents
|
|
326
|
-
minTotalSuccesses: number; // e.g., 10
|
|
327
|
-
minSuccessRate: number; // e.g., 0.8
|
|
328
|
-
};
|
|
329
|
-
deprecation: {
|
|
330
|
-
maxConsecutiveFailures: number; // e.g., 5
|
|
331
|
-
minFailureRate: number; // e.g., 0.5 over last 20 uses
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
**Pros:**
|
|
337
|
-
- Quality gate—only validated skills propagate
|
|
338
|
-
- Conflict resolution is data-driven
|
|
339
|
-
- Natural curation without human review
|
|
340
|
-
|
|
341
|
-
**Cons:**
|
|
342
|
-
- Slower propagation of new skills
|
|
343
|
-
- Cold-start problem for new skills
|
|
344
|
-
- Needs robust validation tracking
|
|
345
|
-
|
|
346
|
-
**Best for:** Production systems, quality-critical environments, large agent fleets
|
|
347
|
-
|
|
348
|
-
---
|
|
349
|
-
|
|
350
|
-
## Field-Level Merge Strategies
|
|
351
|
-
|
|
352
|
-
When two agents modify the same skill, use semantic merging instead of line-by-line:
|
|
353
|
-
|
|
354
|
-
| Field | Default Strategy | Rationale |
|
|
355
|
-
|-------|------------------|-----------|
|
|
356
|
-
| `triggerConditions` | `union` | Both agents discovered valid triggers |
|
|
357
|
-
| `examples` | `union` | More examples = better coverage |
|
|
358
|
-
| `tags` | `union` | Additive metadata |
|
|
359
|
-
| `solution` | `combine` or `manual` | Core content, may need review |
|
|
360
|
-
| `verification` | `prefer-newer` | Usually improvements |
|
|
361
|
-
| `metrics` | `merge-stats` | Combine usage statistics |
|
|
362
|
-
| `notes` | `combine` | Accumulate learnings |
|
|
363
|
-
| `status` | `prefer-higher` | draft < experimental < active |
|
|
364
|
-
| `version` | `bump` | Auto-increment on merge |
|
|
365
|
-
|
|
366
|
-
```typescript
|
|
367
|
-
const defaultFieldStrategies: Record<keyof Skill, ConflictStrategy> = {
|
|
368
|
-
id: 'error', // should never conflict
|
|
369
|
-
version: 'bump', // auto-increment
|
|
370
|
-
problem: 'prefer-longer', // more detailed is better
|
|
371
|
-
triggerConditions: 'union',
|
|
372
|
-
solution: 'manual', // too important to auto-merge
|
|
373
|
-
verification: 'prefer-newer',
|
|
374
|
-
examples: 'union',
|
|
375
|
-
notes: 'combine',
|
|
376
|
-
tags: 'union',
|
|
377
|
-
status: 'prefer-higher',
|
|
378
|
-
metrics: 'merge-stats',
|
|
379
|
-
// ...
|
|
380
|
-
};
|
|
381
|
-
```
|
|
382
|
-
|
|
383
|
-
---
|
|
384
|
-
|
|
385
|
-
## Implementation Phases
|
|
386
|
-
|
|
387
|
-
### Phase 1: Git Sync Foundation (MVP)
|
|
388
|
-
|
|
389
|
-
**Goal**: Enable many agents on one shared repo with periodic sync.
|
|
390
|
-
|
|
391
|
-
#### 1.1 Core Infrastructure
|
|
392
|
-
- [ ] `GitSyncAdapter` class wrapping `simple-git`
|
|
393
|
-
- [ ] Extends/composes with `FilesystemStorageAdapter`
|
|
394
|
-
- [ ] Agent identity configuration (`SyncConfig.agent`)
|
|
395
|
-
- [ ] Remote repository configuration (`SyncConfig.remote`)
|
|
396
|
-
|
|
397
|
-
#### 1.2 Pull Operation
|
|
398
|
-
```typescript
|
|
399
|
-
async pull(options?: PullOptions): Promise<SyncResult>
|
|
400
|
-
```
|
|
401
|
-
- [ ] `git fetch origin main`
|
|
402
|
-
- [ ] Detect changed skill files via `git diff`
|
|
403
|
-
- [ ] For each changed skill:
|
|
404
|
-
- New remote skill → import to local storage
|
|
405
|
-
- Updated remote skill (no local changes) → update local
|
|
406
|
-
- Both changed → detect conflict
|
|
407
|
-
- [ ] Return `SyncResult` with pulled/conflicts/errors
|
|
408
|
-
|
|
409
|
-
#### 1.3 Push Operation
|
|
410
|
-
```typescript
|
|
411
|
-
async push(options?: PushOptions): Promise<SyncResult>
|
|
412
|
-
```
|
|
413
|
-
- [ ] Export locally modified skills to filesystem
|
|
414
|
-
- [ ] `git add` + `git commit` with agent attribution
|
|
415
|
-
- [ ] `git push origin main`
|
|
416
|
-
- [ ] Handle non-fast-forward (pull first, then retry)
|
|
417
|
-
- [ ] Return `SyncResult` with pushed/conflicts/errors
|
|
418
|
-
|
|
419
|
-
#### 1.4 Conflict Workflow
|
|
420
|
-
- [ ] Detect conflicts: local and remote both modified since last sync
|
|
421
|
-
- [ ] Store conflicts in `.skillbank/conflicts/`
|
|
422
|
-
- [ ] `listConflicts()` → list pending conflicts
|
|
423
|
-
- [ ] `resolveConflict(skillId, resolution)` → apply resolution
|
|
424
|
-
- [ ] Integration with `SkillMerger` for field-level merge suggestions
|
|
425
|
-
|
|
426
|
-
#### 1.5 CLI Commands
|
|
427
|
-
```bash
|
|
428
|
-
skill-tree sync status # Show sync status
|
|
429
|
-
skill-tree sync pull # Pull remote changes
|
|
430
|
-
skill-tree sync push # Push local changes
|
|
431
|
-
skill-tree sync conflicts # List pending conflicts
|
|
432
|
-
skill-tree sync resolve <id> # Resolve a conflict
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
### Phase 2: Enhanced Conflict Resolution
|
|
436
|
-
|
|
437
|
-
- [ ] 3-way merge using git merge-base
|
|
438
|
-
- [ ] Field-specific auto-resolution strategies
|
|
439
|
-
- [ ] Conflict preview with suggested merge
|
|
440
|
-
- [ ] Interactive conflict resolution CLI
|
|
441
|
-
|
|
442
|
-
### Phase 3: Multi-Agent Coordination (Future)
|
|
443
|
-
|
|
444
|
-
- [ ] Agent branch support (Model B)
|
|
445
|
-
- [ ] Validation tracking and provenance
|
|
446
|
-
- [ ] Promotion rules (Model C)
|
|
447
|
-
- [ ] Cross-agent skill discovery
|
|
448
|
-
|
|
449
|
-
### Phase 4: Advanced Features (Future)
|
|
450
|
-
|
|
451
|
-
- [ ] HTTP API sync adapter
|
|
452
|
-
- [ ] Real-time sync via webhooks
|
|
453
|
-
- [ ] Peer-to-peer sync
|
|
454
|
-
- [ ] Skill request/broadcast protocol
|
|
455
|
-
|
|
456
|
-
---
|
|
457
|
-
|
|
458
|
-
## Conflict Resolution Flow
|
|
459
|
-
|
|
460
|
-
```
|
|
461
|
-
┌─────────────────────────────────────────────────────────────────┐
|
|
462
|
-
│ On Pull │
|
|
463
|
-
├─────────────────────────────────────────────────────────────────┤
|
|
464
|
-
│ │
|
|
465
|
-
│ Remote changed? ──No──► No action │
|
|
466
|
-
│ │ │
|
|
467
|
-
│ Yes │
|
|
468
|
-
│ │ │
|
|
469
|
-
│ ▼ │
|
|
470
|
-
│ Local changed? ──No──► Accept remote (fast-forward) │
|
|
471
|
-
│ │ │
|
|
472
|
-
│ Yes │
|
|
473
|
-
│ │ │
|
|
474
|
-
│ ▼ │
|
|
475
|
-
│ Can auto-merge? ──Yes──► Apply merge, record in SyncResult │
|
|
476
|
-
│ │ │
|
|
477
|
-
│ No │
|
|
478
|
-
│ │ │
|
|
479
|
-
│ ▼ │
|
|
480
|
-
│ Store conflict in .skillbank/conflicts/ │
|
|
481
|
-
│ Return in SyncResult.conflicts │
|
|
482
|
-
│ │
|
|
483
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
484
|
-
```
|
|
485
|
-
|
|
486
|
-
**Auto-merge conditions** (using existing SkillMerger):
|
|
487
|
-
1. Only non-overlapping fields changed → merge both
|
|
488
|
-
2. Same field changed to same value → no conflict
|
|
489
|
-
3. Array fields (tags, examples, triggers) → union
|
|
490
|
-
4. Otherwise → manual resolution required
|
|
491
|
-
|
|
492
|
-
---
|
|
493
|
-
|
|
494
|
-
## GitSyncAdapter Interface (Detailed)
|
|
495
|
-
|
|
496
|
-
The `GitSyncAdapter` is the core component for git-based synchronization. It wraps the `FilesystemStorageAdapter` and adds git operations.
|
|
497
|
-
|
|
498
|
-
### Class Design
|
|
499
|
-
|
|
500
|
-
```typescript
|
|
501
|
-
import { SimpleGit, simpleGit } from 'simple-git';
|
|
502
|
-
import { FilesystemStorageAdapter } from '../storage/filesystem.js';
|
|
503
|
-
import { SkillMerger } from '../versioning/merge.js';
|
|
504
|
-
|
|
505
|
-
/**
|
|
506
|
-
* Git-aware storage adapter for multi-agent synchronization
|
|
507
|
-
*
|
|
508
|
-
* Extends FilesystemStorageAdapter with:
|
|
509
|
-
* - Git operations (fetch, pull, push, commit)
|
|
510
|
-
* - Agent identity tracking
|
|
511
|
-
* - Conflict detection and resolution workflow
|
|
512
|
-
*/
|
|
513
|
-
export class GitSyncAdapter {
|
|
514
|
-
private git: SimpleGit;
|
|
515
|
-
private storage: FilesystemStorageAdapter;
|
|
516
|
-
private merger: SkillMerger;
|
|
517
|
-
private config: SyncConfig;
|
|
518
|
-
private conflictStore: ConflictStore;
|
|
519
|
-
|
|
520
|
-
constructor(options: GitSyncAdapterOptions) {
|
|
521
|
-
this.config = options.config;
|
|
522
|
-
this.git = simpleGit(options.repoPath);
|
|
523
|
-
this.storage = new FilesystemStorageAdapter(options.repoPath);
|
|
524
|
-
this.merger = new SkillMerger();
|
|
525
|
-
this.conflictStore = new ConflictStore(
|
|
526
|
-
path.join(options.repoPath, '.skillbank', 'conflicts')
|
|
527
|
-
);
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
/**
|
|
531
|
-
* Initialize the adapter
|
|
532
|
-
* - Ensures git repo exists
|
|
533
|
-
* - Configures remote if needed
|
|
534
|
-
* - Loads existing conflict state
|
|
535
|
-
*/
|
|
536
|
-
async initialize(): Promise<void>;
|
|
537
|
-
|
|
538
|
-
/**
|
|
539
|
-
* Fetch remote changes without applying
|
|
540
|
-
* Returns summary of what would change
|
|
541
|
-
*/
|
|
542
|
-
async fetch(): Promise<FetchResult>;
|
|
543
|
-
|
|
544
|
-
/**
|
|
545
|
-
* Pull remote changes and merge into local
|
|
546
|
-
*
|
|
547
|
-
* Flow:
|
|
548
|
-
* 1. git fetch origin main
|
|
549
|
-
* 2. Diff local vs remote skill files
|
|
550
|
-
* 3. For each changed skill:
|
|
551
|
-
* - No local changes → accept remote
|
|
552
|
-
* - Local changes, no remote → keep local
|
|
553
|
-
* - Both changed → attempt auto-merge or create conflict
|
|
554
|
-
* 4. Update local storage
|
|
555
|
-
* 5. Return result with conflicts
|
|
556
|
-
*/
|
|
557
|
-
async pull(options?: PullOptions): Promise<SyncResult>;
|
|
558
|
-
|
|
559
|
-
/**
|
|
560
|
-
* Push local changes to remote
|
|
561
|
-
*
|
|
562
|
-
* Flow:
|
|
563
|
-
* 1. Get locally modified skills (vs last sync point)
|
|
564
|
-
* 2. Export skills to filesystem (already done by storage)
|
|
565
|
-
* 3. git add skills/
|
|
566
|
-
* 4. git commit with agent attribution
|
|
567
|
-
* 5. git push origin main
|
|
568
|
-
* 6. Handle non-fast-forward: pull, merge, retry
|
|
569
|
-
*/
|
|
570
|
-
async push(options?: PushOptions): Promise<SyncResult>;
|
|
571
|
-
|
|
572
|
-
/**
|
|
573
|
-
* Get current sync status
|
|
574
|
-
*/
|
|
575
|
-
async status(): Promise<SyncStatus>;
|
|
576
|
-
|
|
577
|
-
/**
|
|
578
|
-
* List pending conflicts
|
|
579
|
-
*/
|
|
580
|
-
async listConflicts(): Promise<SkillConflict[]>;
|
|
581
|
-
|
|
582
|
-
/**
|
|
583
|
-
* Resolve a conflict
|
|
584
|
-
*
|
|
585
|
-
* Strategies:
|
|
586
|
-
* - 'accept-local': Keep local version, discard remote
|
|
587
|
-
* - 'accept-remote': Accept remote version, discard local changes
|
|
588
|
-
* - 'accept-merged': Apply auto-merged suggestion
|
|
589
|
-
* - 'custom': Apply user-provided merged skill
|
|
590
|
-
*/
|
|
591
|
-
async resolveConflict(
|
|
592
|
-
skillId: string,
|
|
593
|
-
resolution: ConflictResolution
|
|
594
|
-
): Promise<void>;
|
|
595
|
-
|
|
596
|
-
// === Internal helpers ===
|
|
597
|
-
|
|
598
|
-
/**
|
|
599
|
-
* Get skills modified locally since last sync
|
|
600
|
-
*/
|
|
601
|
-
private async getLocallyModifiedSkills(): Promise<Skill[]>;
|
|
602
|
-
|
|
603
|
-
/**
|
|
604
|
-
* Get skills modified on remote since last sync
|
|
605
|
-
*/
|
|
606
|
-
private async getRemoteChangedSkills(): Promise<RemoteSkillChange[]>;
|
|
607
|
-
|
|
608
|
-
/**
|
|
609
|
-
* Attempt to auto-merge two skill versions
|
|
610
|
-
* Uses SkillMerger with configured field strategies
|
|
611
|
-
*/
|
|
612
|
-
private async attemptAutoMerge(
|
|
613
|
-
local: Skill,
|
|
614
|
-
remote: Skill,
|
|
615
|
-
base?: Skill
|
|
616
|
-
): Promise<MergeAttempt>;
|
|
617
|
-
|
|
618
|
-
/**
|
|
619
|
-
* Get the common ancestor (base) version for 3-way merge
|
|
620
|
-
*/
|
|
621
|
-
private async getBaseVersion(skillId: string): Promise<Skill | null>;
|
|
622
|
-
|
|
623
|
-
/**
|
|
624
|
-
* Track sync point (commit hash) for change detection
|
|
625
|
-
*/
|
|
626
|
-
private async recordSyncPoint(): Promise<void>;
|
|
627
|
-
}
|
|
628
|
-
```
|
|
629
|
-
|
|
630
|
-
### Supporting Types
|
|
631
|
-
|
|
632
|
-
```typescript
|
|
633
|
-
interface GitSyncAdapterOptions {
|
|
634
|
-
repoPath: string; // Local git repository path
|
|
635
|
-
config: SyncConfig; // Sync configuration
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
interface FetchResult {
|
|
639
|
-
ahead: number; // Local commits not on remote
|
|
640
|
-
behind: number; // Remote commits not local
|
|
641
|
-
changedSkills: string[]; // Skill IDs with changes
|
|
642
|
-
newSkills: string[]; // New skills on remote
|
|
643
|
-
deletedSkills: string[]; // Skills deleted on remote
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
interface RemoteSkillChange {
|
|
647
|
-
skillId: string;
|
|
648
|
-
changeType: 'added' | 'modified' | 'deleted';
|
|
649
|
-
remoteSkill?: Skill;
|
|
650
|
-
commitHash: string;
|
|
651
|
-
author: string;
|
|
652
|
-
timestamp: Date;
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
interface MergeAttempt {
|
|
656
|
-
success: boolean;
|
|
657
|
-
merged?: Skill; // Merged result if successful
|
|
658
|
-
conflicts?: MergeConflict[]; // Field-level conflicts if failed
|
|
659
|
-
confidence: number; // 0-1, how confident in merge
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
interface ConflictStore {
|
|
663
|
-
save(conflict: SkillConflict): Promise<void>;
|
|
664
|
-
get(skillId: string): Promise<SkillConflict | null>;
|
|
665
|
-
list(): Promise<SkillConflict[]>;
|
|
666
|
-
remove(skillId: string): Promise<void>;
|
|
667
|
-
}
|
|
668
|
-
```
|
|
669
|
-
|
|
670
|
-
### Commit Message Format
|
|
671
|
-
|
|
672
|
-
Agent attribution in commit messages:
|
|
673
|
-
|
|
674
|
-
```
|
|
675
|
-
[agent:claude-prod-1] Update skill: api-rate-limiting
|
|
676
|
-
|
|
677
|
-
Modified fields: solution, examples
|
|
678
|
-
Auto-merged: triggerConditions (union)
|
|
679
|
-
|
|
680
|
-
---
|
|
681
|
-
Agent: claude-prod-1
|
|
682
|
-
Environment: production
|
|
683
|
-
Sync-Version: 1.0.0
|
|
684
|
-
```
|
|
685
|
-
|
|
686
|
-
### Sync State Tracking
|
|
687
|
-
|
|
688
|
-
Track last sync point to detect changes:
|
|
689
|
-
|
|
690
|
-
```yaml
|
|
691
|
-
# .skillbank/sync-state.yaml
|
|
692
|
-
lastSyncCommit: "abc123def456"
|
|
693
|
-
lastSyncTime: "2024-01-15T10:30:00Z"
|
|
694
|
-
agent:
|
|
695
|
-
id: "claude-prod-1"
|
|
696
|
-
environment: "production"
|
|
697
|
-
skills:
|
|
698
|
-
api-rate-limiting:
|
|
699
|
-
localHash: "hash1"
|
|
700
|
-
syncedAt: "2024-01-15T10:30:00Z"
|
|
701
|
-
syncedVersion: "1.2.0"
|
|
702
|
-
error-handling-python:
|
|
703
|
-
localHash: "hash2"
|
|
704
|
-
syncedAt: "2024-01-15T10:30:00Z"
|
|
705
|
-
syncedVersion: "2.0.0"
|
|
706
|
-
```
|
|
707
|
-
|
|
708
|
-
### Integration with Existing SyncService
|
|
709
|
-
|
|
710
|
-
The existing `SyncService` in `src/services/sync.ts` handles GitHub-based imports. The new `GitSyncAdapter` is complementary:
|
|
711
|
-
|
|
712
|
-
| Component | Purpose |
|
|
713
|
-
|-----------|---------|
|
|
714
|
-
| `SyncService` | Pull-only sync from GitHub URLs (imports) |
|
|
715
|
-
| `GitSyncAdapter` | Bidirectional sync with git repo (multi-agent) |
|
|
716
|
-
|
|
717
|
-
They can coexist:
|
|
718
|
-
- Skills imported via `SyncService` can be pushed to the shared repo
|
|
719
|
-
- Skills from the shared repo can be imported to agents that don't have direct git access
|
|
720
|
-
|
|
721
|
-
---
|
|
722
|
-
|
|
723
|
-
## Key Files to Create/Modify
|
|
724
|
-
|
|
725
|
-
### New Files
|
|
726
|
-
```
|
|
727
|
-
src/sync/
|
|
728
|
-
├── index.ts # Public exports
|
|
729
|
-
├── types.ts # SyncConfig, SyncResult, etc.
|
|
730
|
-
├── git-sync-adapter.ts # GitSyncAdapter class
|
|
731
|
-
├── conflict-store.ts # Conflict persistence
|
|
732
|
-
└── sync-service.ts # High-level sync orchestration
|
|
733
|
-
|
|
734
|
-
src/cli/commands/
|
|
735
|
-
└── sync.ts # CLI commands for sync
|
|
736
|
-
```
|
|
737
|
-
|
|
738
|
-
### Modified Files
|
|
739
|
-
```
|
|
740
|
-
src/types.ts # Add SkillProvenance to Skill
|
|
741
|
-
src/storage/filesystem.ts # Add git-aware mode flag
|
|
742
|
-
src/versioning/merge.ts # Enhance for sync use cases
|
|
743
|
-
```
|
|
744
|
-
|
|
745
|
-
---
|
|
746
|
-
|
|
747
|
-
## Open Questions (Remaining)
|
|
748
|
-
|
|
749
|
-
1. **Offline Duration**: How long can agents work offline before divergence becomes problematic?
|
|
750
|
-
- Recommendation: No hard limit, but warn on large divergence
|
|
751
|
-
|
|
752
|
-
2. **Conflict Expiration**: Should unresolved conflicts expire?
|
|
753
|
-
- Recommendation: No, but surface them prominently in status
|
|
754
|
-
|
|
755
|
-
3. **Partial Sync**: Should we support syncing only specific skills?
|
|
756
|
-
- Recommendation: Yes, via `--skills` flag in CLI
|
|
757
|
-
|
|
758
|
-
4. **Authentication**: How to handle git auth in different environments?
|
|
759
|
-
- Recommendation: Rely on system git config (SSH keys, credential helpers)
|