forge-server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/hooks/worktree-create.sh +64 -0
- package/.claude/hooks/worktree-remove.sh +57 -0
- package/.claude/settings.local.json +29 -0
- package/.forge/knowledge/conventions.yaml +1 -0
- package/.forge/knowledge/decisions.yaml +1 -0
- package/.forge/knowledge/gotchas.yaml +1 -0
- package/.forge/knowledge/patterns.yaml +1 -0
- package/.forge/manifest.yaml +6 -0
- package/CLAUDE.md +144 -0
- package/bin/setup-forge.sh +132 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +553 -0
- package/dist/cli.js.map +1 -0
- package/dist/context/codebase.d.ts +57 -0
- package/dist/context/codebase.d.ts.map +1 -0
- package/dist/context/codebase.js +301 -0
- package/dist/context/codebase.js.map +1 -0
- package/dist/context/injector.d.ts +147 -0
- package/dist/context/injector.d.ts.map +1 -0
- package/dist/context/injector.js +533 -0
- package/dist/context/injector.js.map +1 -0
- package/dist/context/memory.d.ts +32 -0
- package/dist/context/memory.d.ts.map +1 -0
- package/dist/context/memory.js +140 -0
- package/dist/context/memory.js.map +1 -0
- package/dist/context/session-index.d.ts +54 -0
- package/dist/context/session-index.d.ts.map +1 -0
- package/dist/context/session-index.js +265 -0
- package/dist/context/session-index.js.map +1 -0
- package/dist/context/session.d.ts +42 -0
- package/dist/context/session.d.ts.map +1 -0
- package/dist/context/session.js +121 -0
- package/dist/context/session.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/ingestion/chunker.d.ts +19 -0
- package/dist/ingestion/chunker.d.ts.map +1 -0
- package/dist/ingestion/chunker.js +189 -0
- package/dist/ingestion/chunker.js.map +1 -0
- package/dist/ingestion/embedder.d.ts +45 -0
- package/dist/ingestion/embedder.d.ts.map +1 -0
- package/dist/ingestion/embedder.js +152 -0
- package/dist/ingestion/embedder.js.map +1 -0
- package/dist/ingestion/git-analyzer.d.ts +77 -0
- package/dist/ingestion/git-analyzer.d.ts.map +1 -0
- package/dist/ingestion/git-analyzer.js +437 -0
- package/dist/ingestion/git-analyzer.js.map +1 -0
- package/dist/ingestion/indexer.d.ts +79 -0
- package/dist/ingestion/indexer.d.ts.map +1 -0
- package/dist/ingestion/indexer.js +766 -0
- package/dist/ingestion/indexer.js.map +1 -0
- package/dist/ingestion/markdown-chunker.d.ts +19 -0
- package/dist/ingestion/markdown-chunker.d.ts.map +1 -0
- package/dist/ingestion/markdown-chunker.js +243 -0
- package/dist/ingestion/markdown-chunker.js.map +1 -0
- package/dist/ingestion/markdown-knowledge.d.ts +21 -0
- package/dist/ingestion/markdown-knowledge.d.ts.map +1 -0
- package/dist/ingestion/markdown-knowledge.js +129 -0
- package/dist/ingestion/markdown-knowledge.js.map +1 -0
- package/dist/ingestion/parser.d.ts +20 -0
- package/dist/ingestion/parser.d.ts.map +1 -0
- package/dist/ingestion/parser.js +429 -0
- package/dist/ingestion/parser.js.map +1 -0
- package/dist/ingestion/watcher.d.ts +28 -0
- package/dist/ingestion/watcher.d.ts.map +1 -0
- package/dist/ingestion/watcher.js +147 -0
- package/dist/ingestion/watcher.js.map +1 -0
- package/dist/knowledge/hydrator.d.ts +37 -0
- package/dist/knowledge/hydrator.d.ts.map +1 -0
- package/dist/knowledge/hydrator.js +220 -0
- package/dist/knowledge/hydrator.js.map +1 -0
- package/dist/knowledge/registry.d.ts +129 -0
- package/dist/knowledge/registry.d.ts.map +1 -0
- package/dist/knowledge/registry.js +361 -0
- package/dist/knowledge/registry.js.map +1 -0
- package/dist/knowledge/search.d.ts +114 -0
- package/dist/knowledge/search.d.ts.map +1 -0
- package/dist/knowledge/search.js +428 -0
- package/dist/knowledge/search.js.map +1 -0
- package/dist/knowledge/store.d.ts +76 -0
- package/dist/knowledge/store.d.ts.map +1 -0
- package/dist/knowledge/store.js +230 -0
- package/dist/knowledge/store.js.map +1 -0
- package/dist/learning/confidence.d.ts +30 -0
- package/dist/learning/confidence.d.ts.map +1 -0
- package/dist/learning/confidence.js +165 -0
- package/dist/learning/confidence.js.map +1 -0
- package/dist/learning/patterns.d.ts +52 -0
- package/dist/learning/patterns.d.ts.map +1 -0
- package/dist/learning/patterns.js +290 -0
- package/dist/learning/patterns.js.map +1 -0
- package/dist/learning/trajectory.d.ts +55 -0
- package/dist/learning/trajectory.d.ts.map +1 -0
- package/dist/learning/trajectory.js +200 -0
- package/dist/learning/trajectory.js.map +1 -0
- package/dist/memory/memory-compat.d.ts +100 -0
- package/dist/memory/memory-compat.d.ts.map +1 -0
- package/dist/memory/memory-compat.js +146 -0
- package/dist/memory/memory-compat.js.map +1 -0
- package/dist/memory/observation-store.d.ts +57 -0
- package/dist/memory/observation-store.d.ts.map +1 -0
- package/dist/memory/observation-store.js +154 -0
- package/dist/memory/observation-store.js.map +1 -0
- package/dist/memory/session-tracker.d.ts +81 -0
- package/dist/memory/session-tracker.d.ts.map +1 -0
- package/dist/memory/session-tracker.js +262 -0
- package/dist/memory/session-tracker.js.map +1 -0
- package/dist/pipeline/engine.d.ts +179 -0
- package/dist/pipeline/engine.d.ts.map +1 -0
- package/dist/pipeline/engine.js +691 -0
- package/dist/pipeline/engine.js.map +1 -0
- package/dist/pipeline/events.d.ts +54 -0
- package/dist/pipeline/events.d.ts.map +1 -0
- package/dist/pipeline/events.js +157 -0
- package/dist/pipeline/events.js.map +1 -0
- package/dist/pipeline/parallel.d.ts +83 -0
- package/dist/pipeline/parallel.d.ts.map +1 -0
- package/dist/pipeline/parallel.js +277 -0
- package/dist/pipeline/parallel.js.map +1 -0
- package/dist/pipeline/state-machine.d.ts +65 -0
- package/dist/pipeline/state-machine.d.ts.map +1 -0
- package/dist/pipeline/state-machine.js +176 -0
- package/dist/pipeline/state-machine.js.map +1 -0
- package/dist/query/graph-queries.d.ts +84 -0
- package/dist/query/graph-queries.d.ts.map +1 -0
- package/dist/query/graph-queries.js +216 -0
- package/dist/query/graph-queries.js.map +1 -0
- package/dist/query/hybrid-search.d.ts +34 -0
- package/dist/query/hybrid-search.d.ts.map +1 -0
- package/dist/query/hybrid-search.js +263 -0
- package/dist/query/hybrid-search.js.map +1 -0
- package/dist/query/intent-detector.d.ts +35 -0
- package/dist/query/intent-detector.d.ts.map +1 -0
- package/dist/query/intent-detector.js +115 -0
- package/dist/query/intent-detector.js.map +1 -0
- package/dist/query/ranking.d.ts +57 -0
- package/dist/query/ranking.d.ts.map +1 -0
- package/dist/query/ranking.js +109 -0
- package/dist/query/ranking.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +291 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/falkordb-store.d.ts +73 -0
- package/dist/storage/falkordb-store.d.ts.map +1 -0
- package/dist/storage/falkordb-store.js +346 -0
- package/dist/storage/falkordb-store.js.map +1 -0
- package/dist/storage/file-cache.d.ts +32 -0
- package/dist/storage/file-cache.d.ts.map +1 -0
- package/dist/storage/file-cache.js +115 -0
- package/dist/storage/file-cache.js.map +1 -0
- package/dist/storage/interfaces.d.ts +151 -0
- package/dist/storage/interfaces.d.ts.map +1 -0
- package/dist/storage/interfaces.js +7 -0
- package/dist/storage/interfaces.js.map +1 -0
- package/dist/storage/qdrant-store.d.ts +110 -0
- package/dist/storage/qdrant-store.d.ts.map +1 -0
- package/dist/storage/qdrant-store.js +467 -0
- package/dist/storage/qdrant-store.js.map +1 -0
- package/dist/storage/schema.d.ts +4 -0
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/schema.js +136 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/storage/sqlite.d.ts +35 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +132 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/tools/collaboration-tools.d.ts +111 -0
- package/dist/tools/collaboration-tools.d.ts.map +1 -0
- package/dist/tools/collaboration-tools.js +174 -0
- package/dist/tools/collaboration-tools.js.map +1 -0
- package/dist/tools/context-tools.d.ts +293 -0
- package/dist/tools/context-tools.d.ts.map +1 -0
- package/dist/tools/context-tools.js +437 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/graph-tools.d.ts +129 -0
- package/dist/tools/graph-tools.d.ts.map +1 -0
- package/dist/tools/graph-tools.js +237 -0
- package/dist/tools/graph-tools.js.map +1 -0
- package/dist/tools/ingestion-tools.d.ts +96 -0
- package/dist/tools/ingestion-tools.d.ts.map +1 -0
- package/dist/tools/ingestion-tools.js +90 -0
- package/dist/tools/ingestion-tools.js.map +1 -0
- package/dist/tools/learning-tools.d.ts +168 -0
- package/dist/tools/learning-tools.d.ts.map +1 -0
- package/dist/tools/learning-tools.js +158 -0
- package/dist/tools/learning-tools.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +183 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +197 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/phase-tools.d.ts +954 -0
- package/dist/tools/phase-tools.d.ts.map +1 -0
- package/dist/tools/phase-tools.js +1215 -0
- package/dist/tools/phase-tools.js.map +1 -0
- package/dist/tools/pipeline-tools.d.ts +140 -0
- package/dist/tools/pipeline-tools.d.ts.map +1 -0
- package/dist/tools/pipeline-tools.js +162 -0
- package/dist/tools/pipeline-tools.js.map +1 -0
- package/dist/tools/registration-tools.d.ts +220 -0
- package/dist/tools/registration-tools.d.ts.map +1 -0
- package/dist/tools/registration-tools.js +391 -0
- package/dist/tools/registration-tools.js.map +1 -0
- package/dist/util/circuit-breaker.d.ts +75 -0
- package/dist/util/circuit-breaker.d.ts.map +1 -0
- package/dist/util/circuit-breaker.js +159 -0
- package/dist/util/circuit-breaker.js.map +1 -0
- package/dist/util/config.d.ts +23 -0
- package/dist/util/config.d.ts.map +1 -0
- package/dist/util/config.js +164 -0
- package/dist/util/config.js.map +1 -0
- package/dist/util/logger.d.ts +13 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +45 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/util/token-counter.d.ts +24 -0
- package/dist/util/token-counter.d.ts.map +1 -0
- package/dist/util/token-counter.js +48 -0
- package/dist/util/token-counter.js.map +1 -0
- package/dist/util/types.d.ts +525 -0
- package/dist/util/types.d.ts.map +1 -0
- package/dist/util/types.js +5 -0
- package/dist/util/types.js.map +1 -0
- package/docker-compose.yml +20 -0
- package/docs/plans/2026-02-27-swarm-coordination/architecture.md +203 -0
- package/docs/plans/2026-02-27-swarm-coordination/vision.md +57 -0
- package/docs/plans/completed/2026-02-26-forge-plugin-bundling/architecture.md +1 -0
- package/docs/plans/completed/2026-02-26-forge-plugin-bundling/vision.md +300 -0
- package/docs/plans/completed/2026-02-27-forge-swarm-learning/architecture.md +480 -0
- package/docs/plans/completed/2026-02-27-forge-swarm-learning/verification-checklist.md +462 -0
- package/docs/plans/completed/2026-02-27-git-history-atlassian/git-jira-plan.md +181 -0
- package/package.json +39 -0
- package/plugin/.claude-plugin/plugin.json +8 -0
- package/plugin/.mcp.json +15 -0
- package/plugin/README.md +134 -0
- package/plugin/agents/architect.md +367 -0
- package/plugin/agents/backend-specialist.md +263 -0
- package/plugin/agents/brainstormer.md +122 -0
- package/plugin/agents/data-specialist.md +266 -0
- package/plugin/agents/designer.md +408 -0
- package/plugin/agents/frontend-specialist.md +241 -0
- package/plugin/agents/inspector.md +406 -0
- package/plugin/agents/knowledge-keeper.md +443 -0
- package/plugin/agents/platform-engineer.md +326 -0
- package/plugin/agents/product-manager.md +268 -0
- package/plugin/agents/product-owner.md +438 -0
- package/plugin/agents/pulse-checker.md +73 -0
- package/plugin/agents/qa-strategist.md +500 -0
- package/plugin/agents/self-improver.md +310 -0
- package/plugin/agents/strategist.md +360 -0
- package/plugin/agents/supervisor.md +380 -0
- package/plugin/commands/brainstorm.md +25 -0
- package/plugin/commands/forge.md +88 -0
- package/plugin/docs/atlassian-integration.md +110 -0
- package/plugin/docs/workflow.md +126 -0
- package/plugin/skills/agent-development/.skillfish.json +10 -0
- package/plugin/skills/agent-development/SKILL.md +415 -0
- package/plugin/skills/agent-development/examples/agent-creation-prompt.md +238 -0
- package/plugin/skills/agent-development/examples/complete-agent-examples.md +427 -0
- package/plugin/skills/agent-development/references/agent-creation-system-prompt.md +207 -0
- package/plugin/skills/agent-development/references/system-prompt-design.md +411 -0
- package/plugin/skills/agent-development/references/triggering-examples.md +491 -0
- package/plugin/skills/agent-development/scripts/validate-agent.sh +217 -0
- package/plugin/skills/agent-handoff/SKILL.md +335 -0
- package/plugin/skills/anti-stub/SKILL.md +317 -0
- package/plugin/skills/brainstorm/SKILL.md +31 -0
- package/plugin/skills/debugging/SKILL.md +276 -0
- package/plugin/skills/fix/SKILL.md +62 -0
- package/plugin/skills/frontend-design/.skillfish.json +10 -0
- package/plugin/skills/frontend-design/SKILL.md +42 -0
- package/plugin/skills/gotchas/SKILL.md +61 -0
- package/plugin/skills/graph-orchestrator/SKILL.md +38 -0
- package/plugin/skills/history/SKILL.md +58 -0
- package/plugin/skills/impact/SKILL.md +59 -0
- package/plugin/skills/implementation-execution/SKILL.md +291 -0
- package/plugin/skills/index-repo/SKILL.md +55 -0
- package/plugin/skills/interviewing/SKILL.md +225 -0
- package/plugin/skills/knowledge-curation/SKILL.md +393 -0
- package/plugin/skills/learn/SKILL.md +69 -0
- package/plugin/skills/mcp-integration/.skillfish.json +10 -0
- package/plugin/skills/mcp-integration/SKILL.md +554 -0
- package/plugin/skills/mcp-integration/examples/http-server.json +20 -0
- package/plugin/skills/mcp-integration/examples/sse-server.json +19 -0
- package/plugin/skills/mcp-integration/examples/stdio-server.json +26 -0
- package/plugin/skills/mcp-integration/references/authentication.md +549 -0
- package/plugin/skills/mcp-integration/references/server-types.md +536 -0
- package/plugin/skills/mcp-integration/references/tool-usage.md +538 -0
- package/plugin/skills/nestjs/.skillfish.json +10 -0
- package/plugin/skills/nestjs/SKILL.md +669 -0
- package/plugin/skills/nestjs/drizzle-reference.md +1894 -0
- package/plugin/skills/nestjs/reference.md +1447 -0
- package/plugin/skills/nestjs/workflow-optimization.md +229 -0
- package/plugin/skills/parallel-dispatch/SKILL.md +308 -0
- package/plugin/skills/project-discovery/SKILL.md +304 -0
- package/plugin/skills/search/SKILL.md +56 -0
- package/plugin/skills/security-audit/SKILL.md +362 -0
- package/plugin/skills/skill-development/.skillfish.json +10 -0
- package/plugin/skills/skill-development/SKILL.md +637 -0
- package/plugin/skills/skill-development/references/skill-creator-original.md +209 -0
- package/plugin/skills/tdd/SKILL.md +273 -0
- package/plugin/skills/terminal-presentation/SKILL.md +395 -0
- package/plugin/skills/test-strategy/SKILL.md +365 -0
- package/plugin/skills/verification-protocol/SKILL.md +256 -0
- package/plugin/skills/visual-explainer/CHANGELOG.md +97 -0
- package/plugin/skills/visual-explainer/LICENSE +21 -0
- package/plugin/skills/visual-explainer/README.md +137 -0
- package/plugin/skills/visual-explainer/SKILL.md +352 -0
- package/plugin/skills/visual-explainer/banner.png +0 -0
- package/plugin/skills/visual-explainer/package.json +11 -0
- package/plugin/skills/visual-explainer/prompts/diff-review.md +68 -0
- package/plugin/skills/visual-explainer/prompts/fact-check.md +63 -0
- package/plugin/skills/visual-explainer/prompts/generate-slides.md +18 -0
- package/plugin/skills/visual-explainer/prompts/generate-web-diagram.md +10 -0
- package/plugin/skills/visual-explainer/prompts/plan-review.md +86 -0
- package/plugin/skills/visual-explainer/prompts/project-recap.md +61 -0
- package/plugin/skills/visual-explainer/references/css-patterns.md +1188 -0
- package/plugin/skills/visual-explainer/references/libraries.md +470 -0
- package/plugin/skills/visual-explainer/references/responsive-nav.md +212 -0
- package/plugin/skills/visual-explainer/references/slide-patterns.md +1403 -0
- package/plugin/skills/visual-explainer/templates/architecture.html +596 -0
- package/plugin/skills/visual-explainer/templates/data-table.html +540 -0
- package/plugin/skills/visual-explainer/templates/mermaid-flowchart.html +435 -0
- package/plugin/skills/visual-explainer/templates/slide-deck.html +913 -0
- package/src/cli.ts +655 -0
- package/src/context/.gitkeep +0 -0
- package/src/context/codebase.ts +393 -0
- package/src/context/injector.ts +797 -0
- package/src/context/memory.ts +187 -0
- package/src/context/session-index.ts +327 -0
- package/src/context/session.ts +152 -0
- package/src/index.ts +47 -0
- package/src/ingestion/.gitkeep +0 -0
- package/src/ingestion/chunker.ts +277 -0
- package/src/ingestion/embedder.ts +167 -0
- package/src/ingestion/git-analyzer.ts +545 -0
- package/src/ingestion/indexer.ts +984 -0
- package/src/ingestion/markdown-chunker.ts +337 -0
- package/src/ingestion/markdown-knowledge.ts +175 -0
- package/src/ingestion/parser.ts +475 -0
- package/src/ingestion/watcher.ts +182 -0
- package/src/knowledge/.gitkeep +0 -0
- package/src/knowledge/hydrator.ts +246 -0
- package/src/knowledge/registry.ts +463 -0
- package/src/knowledge/search.ts +565 -0
- package/src/knowledge/store.ts +262 -0
- package/src/learning/.gitkeep +0 -0
- package/src/learning/confidence.ts +193 -0
- package/src/learning/patterns.ts +360 -0
- package/src/learning/trajectory.ts +268 -0
- package/src/memory/.gitkeep +0 -0
- package/src/memory/memory-compat.ts +233 -0
- package/src/memory/observation-store.ts +224 -0
- package/src/memory/session-tracker.ts +332 -0
- package/src/pipeline/.gitkeep +0 -0
- package/src/pipeline/engine.ts +1139 -0
- package/src/pipeline/events.ts +253 -0
- package/src/pipeline/parallel.ts +394 -0
- package/src/pipeline/state-machine.ts +199 -0
- package/src/query/.gitkeep +0 -0
- package/src/query/graph-queries.ts +262 -0
- package/src/query/hybrid-search.ts +337 -0
- package/src/query/intent-detector.ts +131 -0
- package/src/query/ranking.ts +161 -0
- package/src/server.ts +352 -0
- package/src/storage/.gitkeep +0 -0
- package/src/storage/falkordb-store.ts +388 -0
- package/src/storage/file-cache.ts +141 -0
- package/src/storage/interfaces.ts +201 -0
- package/src/storage/qdrant-store.ts +557 -0
- package/src/storage/schema.ts +139 -0
- package/src/storage/sqlite.ts +168 -0
- package/src/tools/.gitkeep +0 -0
- package/src/tools/collaboration-tools.ts +208 -0
- package/src/tools/context-tools.ts +493 -0
- package/src/tools/graph-tools.ts +295 -0
- package/src/tools/ingestion-tools.ts +122 -0
- package/src/tools/learning-tools.ts +181 -0
- package/src/tools/memory-tools.ts +234 -0
- package/src/tools/phase-tools.ts +1452 -0
- package/src/tools/pipeline-tools.ts +188 -0
- package/src/tools/registration-tools.ts +450 -0
- package/src/util/.gitkeep +0 -0
- package/src/util/circuit-breaker.ts +193 -0
- package/src/util/config.ts +177 -0
- package/src/util/logger.ts +53 -0
- package/src/util/token-counter.ts +52 -0
- package/src/util/types.ts +710 -0
- package/tests/context/.gitkeep +0 -0
- package/tests/integration/.gitkeep +0 -0
- package/tests/knowledge/.gitkeep +0 -0
- package/tests/learning/.gitkeep +0 -0
- package/tests/pipeline/.gitkeep +0 -0
- package/tests/tools/.gitkeep +0 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +10 -0
- package/vscode-extension/.vscodeignore +7 -0
- package/vscode-extension/README.md +43 -0
- package/vscode-extension/out/edge-collector.js +274 -0
- package/vscode-extension/out/edge-collector.js.map +1 -0
- package/vscode-extension/out/extension.js +264 -0
- package/vscode-extension/out/extension.js.map +1 -0
- package/vscode-extension/out/forge-client.js +318 -0
- package/vscode-extension/out/forge-client.js.map +1 -0
- package/vscode-extension/package-lock.json +59 -0
- package/vscode-extension/package.json +71 -0
- package/vscode-extension/src/edge-collector.ts +320 -0
- package/vscode-extension/src/extension.ts +269 -0
- package/vscode-extension/src/forge-client.ts +364 -0
- package/vscode-extension/tsconfig.json +19 -0
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
// KnowledgeSearch — semantic search over the Qdrant knowledge collection.
|
|
2
|
+
//
|
|
3
|
+
// Architecture notes (ADR-2):
|
|
4
|
+
// - ALL knowledge search goes through Qdrant. There is no SQLite FTS fallback.
|
|
5
|
+
// - When Qdrant is unavailable the search returns [] with a logged warning —
|
|
6
|
+
// it does NOT throw. The pipeline continues; agents just receive no gotchas.
|
|
7
|
+
// - Cross-repo search is opt-in (include_cross_repo defaults to false at the
|
|
8
|
+
// tool layer). Results from the caller's repo get a small score boost to
|
|
9
|
+
// surface local knowledge first without completely filtering out cross-repo
|
|
10
|
+
// items when cross-repo is enabled.
|
|
11
|
+
// - stack_tags filtering uses a Qdrant "should" condition (any tag matches)
|
|
12
|
+
// rather than "must" (all tags must match), because a gotcha tagged with
|
|
13
|
+
// ["nestjs", "swc"] is equally relevant to a query from a project that uses
|
|
14
|
+
// either nestjs or swc.
|
|
15
|
+
//
|
|
16
|
+
// Qdrant filter shape reference:
|
|
17
|
+
// must → all conditions must be satisfied (AND)
|
|
18
|
+
// should→ at least one condition must be satisfied (OR)
|
|
19
|
+
// Values indexed as 'keyword' support match: { value: "..." } for exact match
|
|
20
|
+
// Values indexed as 'float' support range: { gte: 0.3 }
|
|
21
|
+
import { logger } from '../util/logger.js';
|
|
22
|
+
import { embedText } from '../ingestion/embedder.js';
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Score boost applied to results from the same repo as the caller.
|
|
25
|
+
// Set conservatively: local items should surface first but not crowd out
|
|
26
|
+
// highly relevant cross-repo items.
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
const SAME_REPO_SCORE_BOOST = 0.05;
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// KnowledgeSearch
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
export class KnowledgeSearch {
|
|
33
|
+
vectorStore;
|
|
34
|
+
constructor(vectorStore) {
|
|
35
|
+
this.vectorStore = vectorStore;
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Primary search method (spec B4 signature)
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
/**
|
|
41
|
+
* Semantic search across knowledge items stored in the Qdrant knowledge
|
|
42
|
+
* collection.
|
|
43
|
+
*
|
|
44
|
+
* Options:
|
|
45
|
+
* category — filter to a single KnowledgeCategory
|
|
46
|
+
* stack_tags — filter to items that share at least one tag (OR match)
|
|
47
|
+
* repo_id — used for same-repo scoring boost; also hard-filters
|
|
48
|
+
* when include_cross_repo is false
|
|
49
|
+
* limit — max results to return (default 10)
|
|
50
|
+
* include_cross_repo— include items from other repos (default true)
|
|
51
|
+
* min_confidence — minimum confidence score (default 0.3)
|
|
52
|
+
*
|
|
53
|
+
* Returns results sorted descending by relevance_score.
|
|
54
|
+
* Returns [] when Qdrant is unavailable — never throws.
|
|
55
|
+
*/
|
|
56
|
+
async search(query, options) {
|
|
57
|
+
const { category, stack_tags, repo_id, limit = 10, include_cross_repo = true, min_confidence = 0.3, } = options ?? {};
|
|
58
|
+
// Check Qdrant availability first — avoid embedding model init overhead
|
|
59
|
+
// when Qdrant is down.
|
|
60
|
+
const healthy = await this.vectorStore.isHealthy();
|
|
61
|
+
if (!healthy) {
|
|
62
|
+
logger.warn('KnowledgeSearch.search: Qdrant unavailable, returning empty results', {
|
|
63
|
+
query: query.slice(0, 80),
|
|
64
|
+
});
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
let queryVector;
|
|
68
|
+
try {
|
|
69
|
+
queryVector = await embedText(query);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
logger.warn('KnowledgeSearch.search: embedding failed, returning empty results', {
|
|
73
|
+
error: String(err),
|
|
74
|
+
});
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
// Build Qdrant filter.
|
|
78
|
+
// When include_cross_repo is false, hard-filter to repo_id only.
|
|
79
|
+
// When include_cross_repo is true, only include cross-repo items that have
|
|
80
|
+
// sharing = 'team' or 'public' (private repos never leak into other repos'
|
|
81
|
+
// results). Items from the caller's own repo are always included regardless
|
|
82
|
+
// of sharing setting.
|
|
83
|
+
const qdrantFilter = this._buildQdrantFilter({
|
|
84
|
+
category,
|
|
85
|
+
stack_tags,
|
|
86
|
+
repo_id: include_cross_repo ? undefined : repo_id,
|
|
87
|
+
caller_repo_id: include_cross_repo ? repo_id : undefined,
|
|
88
|
+
min_confidence,
|
|
89
|
+
});
|
|
90
|
+
let rawResults;
|
|
91
|
+
try {
|
|
92
|
+
// Fetch more than requested to allow re-ranking after same-repo boost.
|
|
93
|
+
const fetchLimit = Math.min(limit * 3, 100);
|
|
94
|
+
const results = await this.vectorStore.searchKnowledge(queryVector, {
|
|
95
|
+
limit: fetchLimit,
|
|
96
|
+
// We handle min_confidence via the filter's range condition on the
|
|
97
|
+
// confidence payload field rather than scoreThreshold (which applies
|
|
98
|
+
// to the cosine similarity score, a different axis).
|
|
99
|
+
scoreThreshold: 0.0,
|
|
100
|
+
filter: qdrantFilter,
|
|
101
|
+
});
|
|
102
|
+
rawResults = results.map((r) => ({
|
|
103
|
+
id: r.id,
|
|
104
|
+
score: r.score,
|
|
105
|
+
payload: r.payload,
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
logger.warn('KnowledgeSearch.search: Qdrant search failed, returning empty results', {
|
|
110
|
+
error: String(err),
|
|
111
|
+
});
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
// Apply same-repo boost, re-rank, trim to limit.
|
|
115
|
+
const boosted = rawResults.map((r) => {
|
|
116
|
+
const payload = r.payload;
|
|
117
|
+
const boost = repo_id && payload.repo_id === repo_id ? SAME_REPO_SCORE_BOOST : 0;
|
|
118
|
+
return { ...r, boostedScore: r.score + boost };
|
|
119
|
+
});
|
|
120
|
+
boosted.sort((a, b) => b.boostedScore - a.boostedScore);
|
|
121
|
+
const output = [];
|
|
122
|
+
for (const r of boosted) {
|
|
123
|
+
if (output.length >= limit)
|
|
124
|
+
break;
|
|
125
|
+
const p = r.payload;
|
|
126
|
+
if (!p.id || !p.title || !p.content)
|
|
127
|
+
continue;
|
|
128
|
+
output.push({
|
|
129
|
+
id: p.id,
|
|
130
|
+
category: p.category ?? 'pattern',
|
|
131
|
+
title: p.title,
|
|
132
|
+
content: p.content,
|
|
133
|
+
confidence: p.confidence ?? 0,
|
|
134
|
+
stack_tags: Array.isArray(p.stack_tags) ? p.stack_tags : [],
|
|
135
|
+
source_repo: p.repo_id ?? '',
|
|
136
|
+
relevance_score: r.boostedScore,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
logger.debug('KnowledgeSearch.search: completed', {
|
|
140
|
+
query: query.slice(0, 80),
|
|
141
|
+
resultCount: output.length,
|
|
142
|
+
category,
|
|
143
|
+
hadSameRepoBoost: !!repo_id,
|
|
144
|
+
});
|
|
145
|
+
return output;
|
|
146
|
+
}
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
// Confidence boost
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
/**
|
|
151
|
+
* Increment access_count and update accessed_at for a knowledge item.
|
|
152
|
+
* Optionally bumps the confidence score by boostAmount.
|
|
153
|
+
*
|
|
154
|
+
* Called when an agent actively consumes a knowledge item — access signals
|
|
155
|
+
* genuine utility and nudges confidence upward.
|
|
156
|
+
* Silent on Qdrant failure (non-fatal side effect).
|
|
157
|
+
*/
|
|
158
|
+
async boostConfidence(knowledgeId, boostAmount = 0.01) {
|
|
159
|
+
const healthy = await this.vectorStore.isHealthy();
|
|
160
|
+
if (!healthy) {
|
|
161
|
+
logger.debug('KnowledgeSearch.boostConfidence: Qdrant unavailable, skip', { knowledgeId });
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
// Use setKnowledgePayload if the store exposes it; otherwise fall back
|
|
166
|
+
// to a no-op so callers never see an exception from a best-effort call.
|
|
167
|
+
const store = this.vectorStore;
|
|
168
|
+
let currentConfidence = 0;
|
|
169
|
+
let currentAccessCount = 0;
|
|
170
|
+
if (typeof store.getKnowledge === 'function') {
|
|
171
|
+
const existing = await store.getKnowledge(knowledgeId);
|
|
172
|
+
if (existing) {
|
|
173
|
+
currentConfidence = existing['confidence'] ?? 0;
|
|
174
|
+
currentAccessCount = existing['access_count'] ?? 0;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const patch = {
|
|
178
|
+
accessed_at: Date.now(),
|
|
179
|
+
access_count: currentAccessCount + 1,
|
|
180
|
+
confidence: Math.min(1.0, currentConfidence + boostAmount),
|
|
181
|
+
};
|
|
182
|
+
if (typeof store.setKnowledgePayload === 'function') {
|
|
183
|
+
await store.setKnowledgePayload(knowledgeId, patch);
|
|
184
|
+
logger.debug('KnowledgeSearch.boostConfidence: boosted', {
|
|
185
|
+
knowledgeId,
|
|
186
|
+
newAccessCount: patch['access_count'],
|
|
187
|
+
newConfidence: patch['confidence'],
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
logger.debug('KnowledgeSearch.boostConfidence: setKnowledgePayload not available, skipping', { knowledgeId });
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
logger.warn('KnowledgeSearch.boostConfidence: failed (non-fatal)', {
|
|
196
|
+
knowledgeId,
|
|
197
|
+
error: String(err),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
// Typed accessors
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
/**
|
|
205
|
+
* Return gotcha items optionally filtered by stack tags.
|
|
206
|
+
* Uses Qdrant filter (category=gotcha) plus optional stack_tags OR match.
|
|
207
|
+
* Results sorted by confidence descending.
|
|
208
|
+
* Gracefully returns [] on Qdrant unavailability.
|
|
209
|
+
*/
|
|
210
|
+
async getGotchas(stack, limit = 20, minConfidence = 0.3) {
|
|
211
|
+
return this._getByCategory('gotcha', stack, limit, minConfidence);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Return pattern items optionally filtered by domain.
|
|
215
|
+
* `domain` is treated as a stack tag (single-element array) for consistency.
|
|
216
|
+
* Results sorted by confidence descending.
|
|
217
|
+
* Gracefully returns [] on Qdrant unavailability.
|
|
218
|
+
*/
|
|
219
|
+
async getPatterns(domain, limit = 20, minConfidence = 0.3) {
|
|
220
|
+
const tags = domain ? [domain] : undefined;
|
|
221
|
+
return this._getByCategory('pattern', tags, limit, minConfidence);
|
|
222
|
+
}
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
// Backward-compat helpers (camelCase signature from the prior implementation)
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
/** Convenience: search with category=gotcha. Backward-compat camelCase API. */
|
|
227
|
+
async searchGotchas(query, opts) {
|
|
228
|
+
return this.search(query, {
|
|
229
|
+
category: 'gotcha',
|
|
230
|
+
stack_tags: opts?.stackTags,
|
|
231
|
+
repo_id: opts?.repoId,
|
|
232
|
+
limit: opts?.limit,
|
|
233
|
+
min_confidence: opts?.minConfidence,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
/** Convenience: search with category=decision. Backward-compat camelCase API. */
|
|
237
|
+
async searchDecisions(query, opts) {
|
|
238
|
+
return this.search(query, {
|
|
239
|
+
category: 'decision',
|
|
240
|
+
stack_tags: opts?.stackTags,
|
|
241
|
+
repo_id: opts?.repoId,
|
|
242
|
+
limit: opts?.limit,
|
|
243
|
+
min_confidence: opts?.minConfidence,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
/** Convenience: search with category=pattern. Backward-compat camelCase API. */
|
|
247
|
+
async searchPatterns(query, opts) {
|
|
248
|
+
return this.search(query, {
|
|
249
|
+
category: 'pattern',
|
|
250
|
+
stack_tags: opts?.stackTags,
|
|
251
|
+
repo_id: opts?.repoId,
|
|
252
|
+
limit: opts?.limit,
|
|
253
|
+
min_confidence: opts?.minConfidence,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
/** Convenience: search with category=convention. Backward-compat camelCase API. */
|
|
257
|
+
async searchConventions(query, opts) {
|
|
258
|
+
return this.search(query, {
|
|
259
|
+
category: 'convention',
|
|
260
|
+
stack_tags: opts?.stackTags,
|
|
261
|
+
repo_id: opts?.repoId,
|
|
262
|
+
limit: opts?.limit,
|
|
263
|
+
min_confidence: opts?.minConfidence,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
/** True when the vector store is configured and healthy. */
|
|
267
|
+
async isAvailable() {
|
|
268
|
+
return this.vectorStore.isHealthy();
|
|
269
|
+
}
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
// Private helpers
|
|
272
|
+
// ---------------------------------------------------------------------------
|
|
273
|
+
/**
|
|
274
|
+
* Retrieve knowledge items by category using Qdrant filter scroll (no
|
|
275
|
+
* semantic query). Falls back to semantic search when filterKnowledge is
|
|
276
|
+
* not yet available on the store.
|
|
277
|
+
*/
|
|
278
|
+
async _getByCategory(category, stack, limit = 20, minConfidence = 0.3) {
|
|
279
|
+
const healthy = await this.vectorStore.isHealthy();
|
|
280
|
+
if (!healthy) {
|
|
281
|
+
logger.warn(`KnowledgeSearch._getByCategory: Qdrant unavailable`, { category });
|
|
282
|
+
return [];
|
|
283
|
+
}
|
|
284
|
+
try {
|
|
285
|
+
const qdrantFilter = this._buildQdrantFilter({
|
|
286
|
+
category,
|
|
287
|
+
stack_tags: stack,
|
|
288
|
+
min_confidence: minConfidence,
|
|
289
|
+
});
|
|
290
|
+
// Use filterKnowledge (scroll-based, no semantic ranking) if available.
|
|
291
|
+
const store = this.vectorStore;
|
|
292
|
+
if (typeof store.filterKnowledge === 'function') {
|
|
293
|
+
const rawItems = await store.filterKnowledge(qdrantFilter, limit);
|
|
294
|
+
return rawItems
|
|
295
|
+
.map((r) => this._payloadToKnowledgeItem(r.payload))
|
|
296
|
+
.filter((item) => item !== null)
|
|
297
|
+
.sort((a, b) => b.confidence - a.confidence);
|
|
298
|
+
}
|
|
299
|
+
// Fallback: semantic search using the category name as query.
|
|
300
|
+
// Less accurate but functional until filterKnowledge lands.
|
|
301
|
+
logger.debug(`KnowledgeSearch._getByCategory: filterKnowledge unavailable, ` +
|
|
302
|
+
`falling back to semantic search`, { category });
|
|
303
|
+
const results = await this.search(category, {
|
|
304
|
+
category: category,
|
|
305
|
+
stack_tags: stack,
|
|
306
|
+
limit,
|
|
307
|
+
min_confidence: minConfidence,
|
|
308
|
+
});
|
|
309
|
+
return results.map((r) => this._resultToKnowledgeItem(r));
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
logger.warn(`KnowledgeSearch._getByCategory: failed`, {
|
|
313
|
+
category,
|
|
314
|
+
error: String(err),
|
|
315
|
+
});
|
|
316
|
+
return [];
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Build the Qdrant filter object from search option components.
|
|
321
|
+
*
|
|
322
|
+
* We construct the full Qdrant filter shape directly here (not relying on
|
|
323
|
+
* QdrantVectorStore.buildFilter) because we need both "must" (AND) and
|
|
324
|
+
* "should" (OR) conditions which the simple flat-map builder cannot express.
|
|
325
|
+
*
|
|
326
|
+
* Qdrant filter reference:
|
|
327
|
+
* { must: [...], should: [...], must_not: [...] }
|
|
328
|
+
* Each condition: { key: string, match: { value } } or { key, range: { gte } }
|
|
329
|
+
*/
|
|
330
|
+
_buildQdrantFilter(opts) {
|
|
331
|
+
const must = [];
|
|
332
|
+
const should = [];
|
|
333
|
+
if (opts.category) {
|
|
334
|
+
must.push({ key: 'category', match: { value: opts.category } });
|
|
335
|
+
}
|
|
336
|
+
// Hard-filter to a single repo (used when include_cross_repo is false).
|
|
337
|
+
if (opts.repo_id) {
|
|
338
|
+
must.push({ key: 'repo_id', match: { value: opts.repo_id } });
|
|
339
|
+
}
|
|
340
|
+
// Cross-repo sharing enforcement: when searching across repos, only include
|
|
341
|
+
// items that are either (a) from the caller's own repo, or (b) have sharing
|
|
342
|
+
// set to 'team' or 'public'. Private repos never leak into other repos.
|
|
343
|
+
//
|
|
344
|
+
// Qdrant filter logic:
|
|
345
|
+
// must: [{ should: [
|
|
346
|
+
// { repo_id == caller_repo_id }, ← own repo: always included
|
|
347
|
+
// { sharing == 'team' }, ← team-shared repos
|
|
348
|
+
// { sharing == 'public' }, ← public repos
|
|
349
|
+
// ]}]
|
|
350
|
+
if (opts.caller_repo_id && !opts.repo_id) {
|
|
351
|
+
must.push({
|
|
352
|
+
should: [
|
|
353
|
+
{ key: 'repo_id', match: { value: opts.caller_repo_id } },
|
|
354
|
+
{ key: 'sharing', match: { value: 'team' } },
|
|
355
|
+
{ key: 'sharing', match: { value: 'public' } },
|
|
356
|
+
],
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
else if (!opts.repo_id && !opts.caller_repo_id) {
|
|
360
|
+
// No caller repo context — only allow team/public items to prevent
|
|
361
|
+
// accidental exposure of private repo knowledge.
|
|
362
|
+
must.push({
|
|
363
|
+
should: [
|
|
364
|
+
{ key: 'sharing', match: { value: 'team' } },
|
|
365
|
+
{ key: 'sharing', match: { value: 'public' } },
|
|
366
|
+
],
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
if (opts.min_confidence !== undefined && opts.min_confidence > 0) {
|
|
370
|
+
must.push({ key: 'confidence', range: { gte: opts.min_confidence } });
|
|
371
|
+
}
|
|
372
|
+
// stack_tags: require at least one matching tag (OR semantics).
|
|
373
|
+
if (opts.stack_tags && opts.stack_tags.length > 0) {
|
|
374
|
+
for (const tag of opts.stack_tags) {
|
|
375
|
+
should.push({ key: 'stack_tags', match: { value: tag } });
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
if (must.length === 0 && should.length === 0) {
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
const filter = {};
|
|
382
|
+
if (must.length > 0)
|
|
383
|
+
filter['must'] = must;
|
|
384
|
+
if (should.length > 0)
|
|
385
|
+
filter['should'] = should;
|
|
386
|
+
return filter;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Convert a KnowledgePayload from Qdrant into a KnowledgeItem.
|
|
390
|
+
* Returns null if required fields are missing.
|
|
391
|
+
*/
|
|
392
|
+
_payloadToKnowledgeItem(payload) {
|
|
393
|
+
const p = payload;
|
|
394
|
+
if (!p.id || !p.title || !p.content)
|
|
395
|
+
return null;
|
|
396
|
+
return {
|
|
397
|
+
id: p.id,
|
|
398
|
+
title: p.title,
|
|
399
|
+
content: p.content,
|
|
400
|
+
stack_tags: Array.isArray(p.stack_tags) ? p.stack_tags : [],
|
|
401
|
+
confidence: p.confidence ?? 0,
|
|
402
|
+
source: p.source ?? 'manual',
|
|
403
|
+
source_phase: p.source_phase ?? null,
|
|
404
|
+
source_agent: p.source_agent ?? null,
|
|
405
|
+
created_at: p.created_at ?? Date.now(),
|
|
406
|
+
updated_at: p.updated_at ?? Date.now(),
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Convert a KnowledgeSearchResult back to a KnowledgeItem shape.
|
|
411
|
+
* Used as a fallback when filterKnowledge is not available on the store.
|
|
412
|
+
*/
|
|
413
|
+
_resultToKnowledgeItem(result) {
|
|
414
|
+
return {
|
|
415
|
+
id: result.id,
|
|
416
|
+
title: result.title,
|
|
417
|
+
content: result.content,
|
|
418
|
+
stack_tags: result.stack_tags,
|
|
419
|
+
confidence: result.confidence,
|
|
420
|
+
source: 'manual',
|
|
421
|
+
source_phase: null,
|
|
422
|
+
source_agent: null,
|
|
423
|
+
created_at: Date.now(),
|
|
424
|
+
updated_at: Date.now(),
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/knowledge/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { KnowledgeCategory, KnowledgeItem } from '../util/types.js';
|
|
2
|
+
export type { KnowledgeCategory, KnowledgeItem } from '../util/types.js';
|
|
3
|
+
export declare class KnowledgeYamlStore {
|
|
4
|
+
private readonly forgeDir;
|
|
5
|
+
private readonly knowledgeDir;
|
|
6
|
+
constructor(forgeDir: string);
|
|
7
|
+
/**
|
|
8
|
+
* Read all items from a single category file.
|
|
9
|
+
* Returns an empty array if the file does not exist or is empty.
|
|
10
|
+
*/
|
|
11
|
+
readCategory(category: KnowledgeCategory): KnowledgeItem[];
|
|
12
|
+
/**
|
|
13
|
+
* Read all items across every category file, concatenated into one array.
|
|
14
|
+
* Items from each category are returned in file order, categories in the
|
|
15
|
+
* order defined by ALL_CATEGORIES.
|
|
16
|
+
*/
|
|
17
|
+
readAll(): KnowledgeItem[];
|
|
18
|
+
/**
|
|
19
|
+
* Overwrite a category file with the supplied items array.
|
|
20
|
+
* Creates the knowledge directory if it does not exist.
|
|
21
|
+
* Passing an empty array produces a file containing `[]`.
|
|
22
|
+
*/
|
|
23
|
+
writeCategory(category: KnowledgeCategory, items: KnowledgeItem[]): void;
|
|
24
|
+
/**
|
|
25
|
+
* Append a single item to the appropriate category file.
|
|
26
|
+
* The category is derived from the item's id prefix:
|
|
27
|
+
* gotcha-* → gotcha
|
|
28
|
+
* pattern-* → pattern
|
|
29
|
+
* decision-* → decision
|
|
30
|
+
* convention-* → convention
|
|
31
|
+
*
|
|
32
|
+
* If the item does not match any prefix, it falls through to the pattern
|
|
33
|
+
* file as a safe default.
|
|
34
|
+
*/
|
|
35
|
+
addItem(item: KnowledgeItem): void;
|
|
36
|
+
/**
|
|
37
|
+
* Update an existing item by id across all category files.
|
|
38
|
+
* Applies the supplied partial updates to the first matching item.
|
|
39
|
+
* Returns true if an item was found and updated, false otherwise.
|
|
40
|
+
*/
|
|
41
|
+
updateItem(id: string, updates: Partial<KnowledgeItem>): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Remove an item by id across all category files.
|
|
44
|
+
* Returns true if an item was found and removed, false otherwise.
|
|
45
|
+
*/
|
|
46
|
+
removeItem(id: string): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Create the .forge/knowledge/ directory and initialise empty YAML files
|
|
49
|
+
* for every category. Existing files are left untouched — initialize() is
|
|
50
|
+
* safe to call multiple times.
|
|
51
|
+
*/
|
|
52
|
+
initialize(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Compute a SHA-256 hash over the concatenated contents of all category
|
|
55
|
+
* files. Files that do not exist contribute an empty string to the hash.
|
|
56
|
+
* The hash changes whenever any item is added, updated, or removed, making
|
|
57
|
+
* it useful for cheap change detection without re-parsing every item.
|
|
58
|
+
*/
|
|
59
|
+
getContentHash(): string;
|
|
60
|
+
/** Absolute path to the YAML file for a given category. */
|
|
61
|
+
private _filePath;
|
|
62
|
+
/** Ensure the knowledge directory exists. */
|
|
63
|
+
private _ensureDir;
|
|
64
|
+
/**
|
|
65
|
+
* Parse a YAML file and return its items.
|
|
66
|
+
* Returns [] when the file is missing, empty, or contains a YAML null
|
|
67
|
+
* (which is what an empty file or `---` alone produces).
|
|
68
|
+
*/
|
|
69
|
+
private _readFile;
|
|
70
|
+
/**
|
|
71
|
+
* Derive the KnowledgeCategory for a given item based on its id prefix.
|
|
72
|
+
* Falls back to 'pattern' when the id does not match a known prefix.
|
|
73
|
+
*/
|
|
74
|
+
private _categoryFromItem;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/knowledge/store.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIzE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAmBzE,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAET,QAAQ,EAAE,MAAM;IAQ7C;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,iBAAiB,GAAG,aAAa,EAAE;IAK1D;;;;OAIG;IACH,OAAO,IAAI,aAAa,EAAE;IAQ1B;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI;IAWxE;;;;;;;;;;OAUG;IACH,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAelC;;;;OAIG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO;IAkBhE;;;OAGG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAY/B;;;;OAIG;IACH,UAAU,IAAI,IAAI;IAWlB;;;;;OAKG;IACH,cAAc,IAAI,MAAM;IAkBxB,2DAA2D;IAC3D,OAAO,CAAC,SAAS;IAIjB,6CAA6C;IAC7C,OAAO,CAAC,UAAU;IAMlB;;;;OAIG;IACH,OAAO,CAAC,SAAS;IA8BjB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;CAQ1B"}
|