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,683 +0,0 @@
|
|
|
1
|
-
# Skills Indexer Architecture Design
|
|
2
|
-
|
|
3
|
-
## System Overview
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
┌─────────────────────────────────────────────────────────────────────────┐
|
|
7
|
-
│ Skills Indexer │
|
|
8
|
-
├─────────────────────────────────────────────────────────────────────────┤
|
|
9
|
-
│ │
|
|
10
|
-
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
11
|
-
│ │ CLI │───▶│ Scraper │───▶│ Indexer │ │
|
|
12
|
-
│ │ Interface │ │ Agent │ │ Agent │ │
|
|
13
|
-
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|
14
|
-
│ │ │ │ │
|
|
15
|
-
│ │ ▼ ▼ │
|
|
16
|
-
│ │ ┌──────────────┐ ┌──────────────┐ │
|
|
17
|
-
│ │ │ GitHub │ │ Claude │ │
|
|
18
|
-
│ │ │ API │ │ API │ │
|
|
19
|
-
│ │ └──────────────┘ └──────────────┘ │
|
|
20
|
-
│ │ │ │ │
|
|
21
|
-
│ ▼ ▼ ▼ │
|
|
22
|
-
│ ┌─────────────────────────────────────────────────────────────────┐ │
|
|
23
|
-
│ │ Database Adapter │ │
|
|
24
|
-
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
|
|
25
|
-
│ │ │ SQLite │ │ PostgreSQL │ │ │
|
|
26
|
-
│ │ │ (default) │ │ (future) │ │ │
|
|
27
|
-
│ │ └─────────────────┘ └─────────────────┘ │ │
|
|
28
|
-
│ └─────────────────────────────────────────────────────────────────┘ │
|
|
29
|
-
│ │
|
|
30
|
-
└─────────────────────────────────────────────────────────────────────────┘
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## Core Design Principles
|
|
34
|
-
|
|
35
|
-
### 1. Async-First Architecture
|
|
36
|
-
|
|
37
|
-
All I/O operations are async to enable:
|
|
38
|
-
- Parallel scraping of multiple repositories
|
|
39
|
-
- Concurrent AI classification requests
|
|
40
|
-
- Non-blocking database operations
|
|
41
|
-
- Responsive CLI experience
|
|
42
|
-
|
|
43
|
-
```typescript
|
|
44
|
-
// All service methods return Promises
|
|
45
|
-
interface ScraperService {
|
|
46
|
-
scrapeRepository(url: string): Promise<ScrapedSkill[]>;
|
|
47
|
-
discoverFromAwesomeList(url: string): Promise<string[]>;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
interface IndexerService {
|
|
51
|
-
classifySkill(skill: RawSkill): Promise<Classification>;
|
|
52
|
-
batchClassify(skills: RawSkill[]): Promise<Classification[]>;
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### 2. Adapter Pattern for Database
|
|
57
|
-
|
|
58
|
-
Abstract database operations behind an interface to enable:
|
|
59
|
-
- SQLite for local development and small deployments
|
|
60
|
-
- PostgreSQL for production scale and vector search
|
|
61
|
-
- Easy testing with in-memory implementations
|
|
62
|
-
|
|
63
|
-
```typescript
|
|
64
|
-
interface DatabaseAdapter {
|
|
65
|
-
// Connection lifecycle
|
|
66
|
-
connect(): Promise<void>;
|
|
67
|
-
disconnect(): Promise<void>;
|
|
68
|
-
|
|
69
|
-
// Skills
|
|
70
|
-
insertSkill(skill: Skill): Promise<string>;
|
|
71
|
-
getSkill(id: string): Promise<Skill | null>;
|
|
72
|
-
listSkills(filter?: SkillFilter): Promise<Skill[]>;
|
|
73
|
-
updateSkill(id: string, updates: Partial<Skill>): Promise<void>;
|
|
74
|
-
deleteSkill(id: string): Promise<void>;
|
|
75
|
-
|
|
76
|
-
// Taxonomy
|
|
77
|
-
insertTaxonomyNode(node: TaxonomyNode): Promise<string>;
|
|
78
|
-
getTaxonomyTree(rootPath?: string): Promise<TaxonomyTree>;
|
|
79
|
-
updateTaxonomyNode(id: string, updates: Partial<TaxonomyNode>): Promise<void>;
|
|
80
|
-
|
|
81
|
-
// Placements
|
|
82
|
-
placeSkill(skillId: string, path: string[], isPrimary: boolean): Promise<void>;
|
|
83
|
-
getSkillPlacements(skillId: string): Promise<SkillPlacement[]>;
|
|
84
|
-
getSkillsAtPath(path: string[]): Promise<Skill[]>;
|
|
85
|
-
|
|
86
|
-
// Search
|
|
87
|
-
searchSkills(query: string): Promise<Skill[]>;
|
|
88
|
-
|
|
89
|
-
// Migrations
|
|
90
|
-
migrate(): Promise<void>;
|
|
91
|
-
}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### 3. Agent-Based Processing
|
|
95
|
-
|
|
96
|
-
Specialized agents handle discrete tasks:
|
|
97
|
-
|
|
98
|
-
```typescript
|
|
99
|
-
// Scraper Agent - discovers and fetches skills
|
|
100
|
-
interface ScraperAgent {
|
|
101
|
-
discover(sources: SkillSource[]): AsyncGenerator<DiscoveredSkill>;
|
|
102
|
-
fetch(skill: DiscoveredSkill): Promise<RawSkill>;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Indexer Agent - classifies and organizes skills
|
|
106
|
-
interface IndexerAgent {
|
|
107
|
-
classify(skill: RawSkill): Promise<Classification>;
|
|
108
|
-
suggestTaxonomy(skills: RawSkill[]): Promise<TaxonomySuggestion>;
|
|
109
|
-
detectRelationships(skills: RawSkill[]): Promise<Relationship[]>;
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
## Data Models
|
|
114
|
-
|
|
115
|
-
### Skill (Parsed from SKILL.md)
|
|
116
|
-
|
|
117
|
-
```typescript
|
|
118
|
-
interface Skill {
|
|
119
|
-
// Identity
|
|
120
|
-
id: string; // Generated UUID
|
|
121
|
-
slug: string; // From _meta.json or derived
|
|
122
|
-
name: string; // From frontmatter
|
|
123
|
-
displayName?: string; // From _meta.json
|
|
124
|
-
|
|
125
|
-
// Source
|
|
126
|
-
sourceRepo: string; // e.g., "openclaw/skills"
|
|
127
|
-
sourcePath: string; // e.g., "skills/username/skill-name"
|
|
128
|
-
sourceUrl: string; // Full GitHub URL
|
|
129
|
-
author: string; // Directory name or frontmatter
|
|
130
|
-
|
|
131
|
-
// Content
|
|
132
|
-
description: string; // From frontmatter
|
|
133
|
-
content: string; // Full markdown content
|
|
134
|
-
|
|
135
|
-
// Metadata
|
|
136
|
-
version: string; // From _meta.json or "1.0.0"
|
|
137
|
-
homepage?: string; // From frontmatter
|
|
138
|
-
metadata?: Record<string, unknown>; // Platform-specific metadata
|
|
139
|
-
|
|
140
|
-
// Indexing
|
|
141
|
-
status: 'raw' | 'indexed' | 'failed';
|
|
142
|
-
indexedAt?: Date;
|
|
143
|
-
indexingError?: string;
|
|
144
|
-
|
|
145
|
-
// Timestamps
|
|
146
|
-
scrapedAt: Date;
|
|
147
|
-
updatedAt: Date;
|
|
148
|
-
publishedAt?: Date; // From _meta.json
|
|
149
|
-
}
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### Taxonomy Node
|
|
153
|
-
|
|
154
|
-
```typescript
|
|
155
|
-
interface TaxonomyNode {
|
|
156
|
-
id: string;
|
|
157
|
-
name: string; // e.g., "Python"
|
|
158
|
-
path: string[]; // e.g., ["Development", "Languages", "Python"]
|
|
159
|
-
fullPath: string; // e.g., "Development/Languages/Python"
|
|
160
|
-
|
|
161
|
-
// Hierarchy
|
|
162
|
-
parentId: string | null;
|
|
163
|
-
depth: number;
|
|
164
|
-
childCount: number;
|
|
165
|
-
skillCount: number; // Skills directly in this node
|
|
166
|
-
|
|
167
|
-
// AI reasoning
|
|
168
|
-
createdBy: 'ai' | 'manual';
|
|
169
|
-
creationReasoning?: string; // Why this category exists
|
|
170
|
-
|
|
171
|
-
// Timestamps
|
|
172
|
-
createdAt: Date;
|
|
173
|
-
updatedAt: Date;
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
### Skill Placement
|
|
178
|
-
|
|
179
|
-
```typescript
|
|
180
|
-
interface SkillPlacement {
|
|
181
|
-
id: string;
|
|
182
|
-
skillId: string;
|
|
183
|
-
taxonomyNodeId: string;
|
|
184
|
-
|
|
185
|
-
// Classification
|
|
186
|
-
isPrimary: boolean; // Primary path vs secondary
|
|
187
|
-
confidence: number; // 0-1 classification confidence
|
|
188
|
-
reasoning: string; // AI's reasoning for placement
|
|
189
|
-
|
|
190
|
-
// Metadata
|
|
191
|
-
placedAt: Date;
|
|
192
|
-
placedBy: 'ai' | 'manual';
|
|
193
|
-
}
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### Relationship
|
|
197
|
-
|
|
198
|
-
```typescript
|
|
199
|
-
interface SkillRelationship {
|
|
200
|
-
id: string;
|
|
201
|
-
sourceSkillId: string;
|
|
202
|
-
targetSkillId: string;
|
|
203
|
-
|
|
204
|
-
type: 'depends_on' | 'extends' | 'alternative' | 'related';
|
|
205
|
-
strength: number; // 0-1 relationship strength
|
|
206
|
-
reasoning: string;
|
|
207
|
-
|
|
208
|
-
detectedAt: Date;
|
|
209
|
-
detectedBy: 'ai' | 'manual';
|
|
210
|
-
}
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
## Database Schema (Drizzle ORM)
|
|
214
|
-
|
|
215
|
-
```typescript
|
|
216
|
-
// schema.ts
|
|
217
|
-
import { sqliteTable, text, integer, real } from 'drizzle-orm/sqlite-core';
|
|
218
|
-
|
|
219
|
-
export const skills = sqliteTable('skills', {
|
|
220
|
-
id: text('id').primaryKey(),
|
|
221
|
-
slug: text('slug').notNull().unique(),
|
|
222
|
-
name: text('name').notNull(),
|
|
223
|
-
displayName: text('display_name'),
|
|
224
|
-
|
|
225
|
-
sourceRepo: text('source_repo').notNull(),
|
|
226
|
-
sourcePath: text('source_path').notNull(),
|
|
227
|
-
sourceUrl: text('source_url').notNull(),
|
|
228
|
-
author: text('author').notNull(),
|
|
229
|
-
|
|
230
|
-
description: text('description').notNull(),
|
|
231
|
-
content: text('content').notNull(),
|
|
232
|
-
|
|
233
|
-
version: text('version').notNull().default('1.0.0'),
|
|
234
|
-
homepage: text('homepage'),
|
|
235
|
-
metadata: text('metadata', { mode: 'json' }),
|
|
236
|
-
|
|
237
|
-
status: text('status', { enum: ['raw', 'indexed', 'failed'] }).notNull().default('raw'),
|
|
238
|
-
indexedAt: integer('indexed_at', { mode: 'timestamp' }),
|
|
239
|
-
indexingError: text('indexing_error'),
|
|
240
|
-
|
|
241
|
-
scrapedAt: integer('scraped_at', { mode: 'timestamp' }).notNull(),
|
|
242
|
-
updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull(),
|
|
243
|
-
publishedAt: integer('published_at', { mode: 'timestamp' }),
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
export const taxonomyNodes = sqliteTable('taxonomy_nodes', {
|
|
247
|
-
id: text('id').primaryKey(),
|
|
248
|
-
name: text('name').notNull(),
|
|
249
|
-
path: text('path', { mode: 'json' }).$type<string[]>().notNull(),
|
|
250
|
-
fullPath: text('full_path').notNull().unique(),
|
|
251
|
-
|
|
252
|
-
parentId: text('parent_id').references(() => taxonomyNodes.id),
|
|
253
|
-
depth: integer('depth').notNull(),
|
|
254
|
-
childCount: integer('child_count').notNull().default(0),
|
|
255
|
-
skillCount: integer('skill_count').notNull().default(0),
|
|
256
|
-
|
|
257
|
-
createdBy: text('created_by', { enum: ['ai', 'manual'] }).notNull(),
|
|
258
|
-
creationReasoning: text('creation_reasoning'),
|
|
259
|
-
|
|
260
|
-
createdAt: integer('created_at', { mode: 'timestamp' }).notNull(),
|
|
261
|
-
updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull(),
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
export const skillPlacements = sqliteTable('skill_placements', {
|
|
265
|
-
id: text('id').primaryKey(),
|
|
266
|
-
skillId: text('skill_id').notNull().references(() => skills.id),
|
|
267
|
-
taxonomyNodeId: text('taxonomy_node_id').notNull().references(() => taxonomyNodes.id),
|
|
268
|
-
|
|
269
|
-
isPrimary: integer('is_primary', { mode: 'boolean' }).notNull(),
|
|
270
|
-
confidence: real('confidence').notNull(),
|
|
271
|
-
reasoning: text('reasoning').notNull(),
|
|
272
|
-
|
|
273
|
-
placedAt: integer('placed_at', { mode: 'timestamp' }).notNull(),
|
|
274
|
-
placedBy: text('placed_by', { enum: ['ai', 'manual'] }).notNull(),
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
export const skillRelationships = sqliteTable('skill_relationships', {
|
|
278
|
-
id: text('id').primaryKey(),
|
|
279
|
-
sourceSkillId: text('source_skill_id').notNull().references(() => skills.id),
|
|
280
|
-
targetSkillId: text('target_skill_id').notNull().references(() => skills.id),
|
|
281
|
-
|
|
282
|
-
type: text('type', {
|
|
283
|
-
enum: ['depends_on', 'extends', 'alternative', 'related']
|
|
284
|
-
}).notNull(),
|
|
285
|
-
strength: real('strength').notNull(),
|
|
286
|
-
reasoning: text('reasoning').notNull(),
|
|
287
|
-
|
|
288
|
-
detectedAt: integer('detected_at', { mode: 'timestamp' }).notNull(),
|
|
289
|
-
detectedBy: text('detected_by', { enum: ['ai', 'manual'] }).notNull(),
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
export const scrapeState = sqliteTable('scrape_state', {
|
|
293
|
-
id: text('id').primaryKey(),
|
|
294
|
-
sourceUrl: text('source_url').notNull().unique(),
|
|
295
|
-
lastScrapedAt: integer('last_scraped_at', { mode: 'timestamp' }),
|
|
296
|
-
lastCommitSha: text('last_commit_sha'),
|
|
297
|
-
skillCount: integer('skill_count').notNull().default(0),
|
|
298
|
-
status: text('status', { enum: ['pending', 'in_progress', 'completed', 'failed'] }).notNull(),
|
|
299
|
-
error: text('error'),
|
|
300
|
-
});
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
## AI Classification Design
|
|
304
|
-
|
|
305
|
-
### Classification Prompt
|
|
306
|
-
|
|
307
|
-
```typescript
|
|
308
|
-
const CLASSIFICATION_PROMPT = `You are an expert at organizing software development skills into a hierarchical taxonomy.
|
|
309
|
-
|
|
310
|
-
Given a skill definition, classify it into the most appropriate category path(s).
|
|
311
|
-
|
|
312
|
-
## Skill to Classify
|
|
313
|
-
|
|
314
|
-
Name: {name}
|
|
315
|
-
Description: {description}
|
|
316
|
-
|
|
317
|
-
Content:
|
|
318
|
-
{content}
|
|
319
|
-
|
|
320
|
-
## Current Taxonomy
|
|
321
|
-
{taxonomyTree}
|
|
322
|
-
|
|
323
|
-
## Instructions
|
|
324
|
-
|
|
325
|
-
1. Determine the PRIMARY category path where this skill best fits
|
|
326
|
-
2. Optionally suggest SECONDARY paths if the skill fits multiple categories
|
|
327
|
-
3. If no existing category fits well, suggest a NEW category with reasoning
|
|
328
|
-
4. Identify any relationships to other skills
|
|
329
|
-
|
|
330
|
-
## Response Format (JSON)
|
|
331
|
-
|
|
332
|
-
{
|
|
333
|
-
"primaryPath": ["Level1", "Level2", "Level3"],
|
|
334
|
-
"secondaryPaths": [["Alt1", "Alt2"]],
|
|
335
|
-
"confidence": 0.85,
|
|
336
|
-
"reasoning": "This skill is primarily about X because...",
|
|
337
|
-
"suggestedNewCategories": [
|
|
338
|
-
{
|
|
339
|
-
"path": ["New", "Category"],
|
|
340
|
-
"reasoning": "Why this category should exist"
|
|
341
|
-
}
|
|
342
|
-
],
|
|
343
|
-
"relationships": [
|
|
344
|
-
{
|
|
345
|
-
"skillSlug": "other-skill",
|
|
346
|
-
"type": "extends",
|
|
347
|
-
"reasoning": "This skill extends other-skill by..."
|
|
348
|
-
}
|
|
349
|
-
],
|
|
350
|
-
"suggestedTags": ["tag1", "tag2"]
|
|
351
|
-
}`;
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
### Classification Response
|
|
355
|
-
|
|
356
|
-
```typescript
|
|
357
|
-
interface ClassificationResponse {
|
|
358
|
-
primaryPath: string[];
|
|
359
|
-
secondaryPaths?: string[][];
|
|
360
|
-
confidence: number;
|
|
361
|
-
reasoning: string;
|
|
362
|
-
suggestedNewCategories?: {
|
|
363
|
-
path: string[];
|
|
364
|
-
reasoning: string;
|
|
365
|
-
}[];
|
|
366
|
-
relationships?: {
|
|
367
|
-
skillSlug: string;
|
|
368
|
-
type: 'depends_on' | 'extends' | 'alternative' | 'related';
|
|
369
|
-
reasoning: string;
|
|
370
|
-
}[];
|
|
371
|
-
suggestedTags?: string[];
|
|
372
|
-
}
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
## GitHub Scraping Design
|
|
376
|
-
|
|
377
|
-
### Discovery Flow
|
|
378
|
-
|
|
379
|
-
```
|
|
380
|
-
1. Parse awesome-list README.md
|
|
381
|
-
├── Extract repository links
|
|
382
|
-
├── Extract direct skill links
|
|
383
|
-
└── Queue for scraping
|
|
384
|
-
|
|
385
|
-
2. For each repository:
|
|
386
|
-
├── Fetch repo metadata
|
|
387
|
-
├── Get directory tree
|
|
388
|
-
├── Find SKILL.md files
|
|
389
|
-
└── Queue skills for parsing
|
|
390
|
-
|
|
391
|
-
3. For each skill:
|
|
392
|
-
├── Fetch SKILL.md content
|
|
393
|
-
├── Fetch _meta.json if exists
|
|
394
|
-
├── Parse frontmatter + content
|
|
395
|
-
└── Store as RawSkill
|
|
396
|
-
```
|
|
397
|
-
|
|
398
|
-
### Rate Limit Handling
|
|
399
|
-
|
|
400
|
-
```typescript
|
|
401
|
-
interface RateLimitConfig {
|
|
402
|
-
requestsPerHour: number; // GitHub: 5000 for authenticated
|
|
403
|
-
minDelayMs: number; // Minimum delay between requests
|
|
404
|
-
maxRetries: number; // Max retries on 429
|
|
405
|
-
backoffMultiplier: number; // Exponential backoff multiplier
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
const DEFAULT_RATE_LIMIT: RateLimitConfig = {
|
|
409
|
-
requestsPerHour: 5000,
|
|
410
|
-
minDelayMs: 100,
|
|
411
|
-
maxRetries: 3,
|
|
412
|
-
backoffMultiplier: 2,
|
|
413
|
-
};
|
|
414
|
-
```
|
|
415
|
-
|
|
416
|
-
### Caching Strategy
|
|
417
|
-
|
|
418
|
-
```typescript
|
|
419
|
-
interface CacheConfig {
|
|
420
|
-
enabled: boolean;
|
|
421
|
-
directory: string; // Default: ./data/cache
|
|
422
|
-
ttlSeconds: number; // Default: 86400 (24 hours)
|
|
423
|
-
maxSizeBytes: number; // Default: 100MB
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
// Cache keys:
|
|
427
|
-
// - repo:{owner}/{name}/tree - Repository file tree
|
|
428
|
-
// - repo:{owner}/{name}/readme - README content
|
|
429
|
-
// - skill:{owner}/{repo}/{path} - Individual skill content
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
## CLI Design
|
|
433
|
-
|
|
434
|
-
### Command Structure
|
|
435
|
-
|
|
436
|
-
```
|
|
437
|
-
skillindexer <command> [options]
|
|
438
|
-
|
|
439
|
-
Commands:
|
|
440
|
-
scrape <source> Scrape skills from a source
|
|
441
|
-
index Index unclassified skills
|
|
442
|
-
tree [path] Browse taxonomy tree
|
|
443
|
-
list List all skills
|
|
444
|
-
show <skill> Show skill details
|
|
445
|
-
search <query> Search skills
|
|
446
|
-
export Export database
|
|
447
|
-
stats Show statistics
|
|
448
|
-
|
|
449
|
-
Global Options:
|
|
450
|
-
--config, -c Path to config file
|
|
451
|
-
--verbose, -v Verbose output
|
|
452
|
-
--quiet, -q Minimal output
|
|
453
|
-
--help, -h Show help
|
|
454
|
-
--version Show version
|
|
455
|
-
```
|
|
456
|
-
|
|
457
|
-
### Output Formatting
|
|
458
|
-
|
|
459
|
-
```typescript
|
|
460
|
-
// Tree view
|
|
461
|
-
Development/
|
|
462
|
-
├── Languages/
|
|
463
|
-
│ ├── Python/ (15 skills)
|
|
464
|
-
│ │ ├── Testing/
|
|
465
|
-
│ │ └── Web-Frameworks/
|
|
466
|
-
│ └── JavaScript/ (23 skills)
|
|
467
|
-
└── Infrastructure/
|
|
468
|
-
└── Docker/ (8 skills)
|
|
469
|
-
|
|
470
|
-
// Skill detail view
|
|
471
|
-
┌─────────────────────────────────────────────┐
|
|
472
|
-
│ react-testing-helper │
|
|
473
|
-
├─────────────────────────────────────────────┤
|
|
474
|
-
│ Author: community │
|
|
475
|
-
│ Version: 1.2.0 │
|
|
476
|
-
│ Source: openclaw/skills │
|
|
477
|
-
├─────────────────────────────────────────────┤
|
|
478
|
-
│ Description: │
|
|
479
|
-
│ Helps write and debug React component tests │
|
|
480
|
-
│ using React Testing Library. │
|
|
481
|
-
├─────────────────────────────────────────────┤
|
|
482
|
-
│ Taxonomy: │
|
|
483
|
-
│ • Development/Frontend/React/Testing │
|
|
484
|
-
│ • Development/Testing/Unit-Testing │
|
|
485
|
-
├─────────────────────────────────────────────┤
|
|
486
|
-
│ Tags: react, testing, frontend, rtl │
|
|
487
|
-
└─────────────────────────────────────────────┘
|
|
488
|
-
```
|
|
489
|
-
|
|
490
|
-
## Configuration
|
|
491
|
-
|
|
492
|
-
### Environment Variables
|
|
493
|
-
|
|
494
|
-
```bash
|
|
495
|
-
# Required
|
|
496
|
-
GITHUB_TOKEN=ghp_xxxxx # GitHub personal access token
|
|
497
|
-
ANTHROPIC_API_KEY=sk-ant-xxxxx # Anthropic API key
|
|
498
|
-
|
|
499
|
-
# Optional
|
|
500
|
-
SKILLINDEXER_DB_PATH=./data/skills.db
|
|
501
|
-
SKILLINDEXER_CACHE_DIR=./data/cache
|
|
502
|
-
SKILLINDEXER_LOG_LEVEL=info # debug, info, warn, error
|
|
503
|
-
SKILLINDEXER_CLAUDE_MODEL=claude-sonnet-4-20250514
|
|
504
|
-
```
|
|
505
|
-
|
|
506
|
-
### Config File (skillindexer.config.ts)
|
|
507
|
-
|
|
508
|
-
```typescript
|
|
509
|
-
import { defineConfig } from './src/config';
|
|
510
|
-
|
|
511
|
-
export default defineConfig({
|
|
512
|
-
database: {
|
|
513
|
-
type: 'sqlite', // 'sqlite' | 'postgresql'
|
|
514
|
-
path: './data/skills.db',
|
|
515
|
-
// PostgreSQL options (future)
|
|
516
|
-
// host: 'localhost',
|
|
517
|
-
// port: 5432,
|
|
518
|
-
// database: 'skillindexer',
|
|
519
|
-
},
|
|
520
|
-
|
|
521
|
-
github: {
|
|
522
|
-
token: process.env.GITHUB_TOKEN,
|
|
523
|
-
cacheEnabled: true,
|
|
524
|
-
cacheTtlSeconds: 86400,
|
|
525
|
-
},
|
|
526
|
-
|
|
527
|
-
anthropic: {
|
|
528
|
-
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
529
|
-
model: 'claude-sonnet-4-20250514',
|
|
530
|
-
maxTokens: 4096,
|
|
531
|
-
},
|
|
532
|
-
|
|
533
|
-
indexer: {
|
|
534
|
-
batchSize: 10, // Skills per batch
|
|
535
|
-
concurrency: 3, // Parallel classifications
|
|
536
|
-
minConfidence: 0.7, // Minimum classification confidence
|
|
537
|
-
},
|
|
538
|
-
|
|
539
|
-
sources: [
|
|
540
|
-
'https://github.com/VoltAgent/awesome-agent-skills',
|
|
541
|
-
'https://github.com/VoltAgent/awesome-openclaw-skills',
|
|
542
|
-
],
|
|
543
|
-
});
|
|
544
|
-
```
|
|
545
|
-
|
|
546
|
-
## Error Handling
|
|
547
|
-
|
|
548
|
-
### Error Types
|
|
549
|
-
|
|
550
|
-
```typescript
|
|
551
|
-
class SkillIndexerError extends Error {
|
|
552
|
-
constructor(
|
|
553
|
-
message: string,
|
|
554
|
-
public code: string,
|
|
555
|
-
public cause?: Error
|
|
556
|
-
) {
|
|
557
|
-
super(message);
|
|
558
|
-
this.name = 'SkillIndexerError';
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
class GitHubError extends SkillIndexerError {
|
|
563
|
-
constructor(message: string, public statusCode?: number, cause?: Error) {
|
|
564
|
-
super(message, 'GITHUB_ERROR', cause);
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
class ParseError extends SkillIndexerError {
|
|
569
|
-
constructor(message: string, public filePath: string, cause?: Error) {
|
|
570
|
-
super(message, 'PARSE_ERROR', cause);
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
class ClassificationError extends SkillIndexerError {
|
|
575
|
-
constructor(message: string, public skillId: string, cause?: Error) {
|
|
576
|
-
super(message, 'CLASSIFICATION_ERROR', cause);
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
class DatabaseError extends SkillIndexerError {
|
|
581
|
-
constructor(message: string, cause?: Error) {
|
|
582
|
-
super(message, 'DATABASE_ERROR', cause);
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
```
|
|
586
|
-
|
|
587
|
-
### Retry Logic
|
|
588
|
-
|
|
589
|
-
```typescript
|
|
590
|
-
async function withRetry<T>(
|
|
591
|
-
fn: () => Promise<T>,
|
|
592
|
-
options: {
|
|
593
|
-
maxRetries: number;
|
|
594
|
-
backoffMs: number;
|
|
595
|
-
backoffMultiplier: number;
|
|
596
|
-
shouldRetry?: (error: Error) => boolean;
|
|
597
|
-
}
|
|
598
|
-
): Promise<T> {
|
|
599
|
-
let lastError: Error;
|
|
600
|
-
|
|
601
|
-
for (let attempt = 0; attempt <= options.maxRetries; attempt++) {
|
|
602
|
-
try {
|
|
603
|
-
return await fn();
|
|
604
|
-
} catch (error) {
|
|
605
|
-
lastError = error as Error;
|
|
606
|
-
|
|
607
|
-
if (options.shouldRetry && !options.shouldRetry(lastError)) {
|
|
608
|
-
throw lastError;
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
if (attempt < options.maxRetries) {
|
|
612
|
-
const delay = options.backoffMs * Math.pow(options.backoffMultiplier, attempt);
|
|
613
|
-
await sleep(delay);
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
throw lastError!;
|
|
619
|
-
}
|
|
620
|
-
```
|
|
621
|
-
|
|
622
|
-
## PostgreSQL Migration Path
|
|
623
|
-
|
|
624
|
-
When scaling beyond SQLite, the migration path involves:
|
|
625
|
-
|
|
626
|
-
1. **Schema Translation**: Drizzle ORM supports both SQLite and PostgreSQL with minimal schema changes
|
|
627
|
-
|
|
628
|
-
2. **Vector Search**: Add pgvector for semantic search
|
|
629
|
-
```sql
|
|
630
|
-
CREATE EXTENSION vector;
|
|
631
|
-
ALTER TABLE skills ADD COLUMN embedding vector(1536);
|
|
632
|
-
CREATE INDEX ON skills USING ivfflat (embedding vector_cosine_ops);
|
|
633
|
-
```
|
|
634
|
-
|
|
635
|
-
3. **Connection Pooling**: Use connection pool for concurrent access
|
|
636
|
-
```typescript
|
|
637
|
-
import { Pool } from 'pg';
|
|
638
|
-
import { drizzle } from 'drizzle-orm/node-postgres';
|
|
639
|
-
```
|
|
640
|
-
|
|
641
|
-
4. **Data Migration**: Export from SQLite, import to PostgreSQL
|
|
642
|
-
```bash
|
|
643
|
-
skillindexer export --format sql > backup.sql
|
|
644
|
-
psql skillindexer < backup.sql
|
|
645
|
-
```
|
|
646
|
-
|
|
647
|
-
## Testing Strategy
|
|
648
|
-
|
|
649
|
-
### Unit Tests
|
|
650
|
-
- Parser tests with fixture SKILL.md files
|
|
651
|
-
- Database adapter tests with in-memory SQLite
|
|
652
|
-
- Classification prompt tests with mocked responses
|
|
653
|
-
|
|
654
|
-
### Integration Tests
|
|
655
|
-
- End-to-end scraping with real GitHub API (rate-limited)
|
|
656
|
-
- Classification with real Claude API (cost-limited)
|
|
657
|
-
- Full CLI command tests
|
|
658
|
-
|
|
659
|
-
### Fixtures
|
|
660
|
-
```
|
|
661
|
-
test/fixtures/
|
|
662
|
-
├── skills/
|
|
663
|
-
│ ├── valid-skill/
|
|
664
|
-
│ │ ├── SKILL.md
|
|
665
|
-
│ │ └── _meta.json
|
|
666
|
-
│ ├── minimal-skill/
|
|
667
|
-
│ │ └── SKILL.md
|
|
668
|
-
│ └── invalid-skill/
|
|
669
|
-
│ └── SKILL.md
|
|
670
|
-
├── awesome-lists/
|
|
671
|
-
│ └── README.md
|
|
672
|
-
└── api-responses/
|
|
673
|
-
├── github/
|
|
674
|
-
└── claude/
|
|
675
|
-
```
|
|
676
|
-
|
|
677
|
-
## Security Considerations
|
|
678
|
-
|
|
679
|
-
1. **API Keys**: Never log or expose API keys; use environment variables
|
|
680
|
-
2. **Input Validation**: Validate all parsed content before database insertion
|
|
681
|
-
3. **SQL Injection**: Use parameterized queries (Drizzle ORM handles this)
|
|
682
|
-
4. **Rate Limiting**: Respect GitHub and Anthropic rate limits
|
|
683
|
-
5. **Cache Poisoning**: Validate cached content before use
|