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,462 @@
|
|
|
1
|
+
# Forge Swarm Learning — Inspector Verification Checklist
|
|
2
|
+
|
|
3
|
+
> **ACTIVE VERIFICATION DOCUMENT** — This checklist is currently being used for the inspector pass on the swarm learning implementation. Do not archive or remove until inspection is complete.
|
|
4
|
+
|
|
5
|
+
This checklist is for the inspector agent to systematically verify the swarm learning implementation across all 5 phases of the architecture plan.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Build Checks
|
|
10
|
+
|
|
11
|
+
- [ ] `npm run build` succeeds with zero errors and zero warnings
|
|
12
|
+
- [ ] No circular dependency warnings in the tsc output
|
|
13
|
+
- [ ] All new imports use `.js` extensions (ESM requirement — `tsconfig.json` uses `module: ESNext`, `moduleResolution: bundler`)
|
|
14
|
+
- [ ] `dist/` directory is rebuilt and matches source (the project commits dist/ to git for zero-build plugin install)
|
|
15
|
+
- [ ] No `any` type suppressions introduced (grep for `as any` or `// eslint-disable.*@typescript-eslint/no-explicit-any` in new code — existing `context-tools.ts:358` is a known exception)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 2. Type Checks
|
|
20
|
+
|
|
21
|
+
### 2.1 Factory Signatures vs Call Sites in `src/server.ts`
|
|
22
|
+
|
|
23
|
+
- [ ] `createPhaseTools(engine, contextInjector, vectorStore, graphStore)` — call at line 201 matches signature `(PipelineEngine, ContextInjector, VectorStore | null, GraphStore | null)` at `phase-tools.ts:209`
|
|
24
|
+
- [ ] `createContextTools(knowledgeSearch, codebaseCtx, engine, memoryBridge, vectorStore, graphStore)` — call at line 202-204 matches signature `(KnowledgeSearch, CodebaseContext, PipelineEngine, MemoryBridge?, VectorStore?, GraphStore?)` at `context-tools.ts:52`
|
|
25
|
+
- [ ] `createLearningTools(knowledgeSearch, confidenceManager, vectorStore)` — call at line 211-214 matches signature `(KnowledgeSearch, ConfidenceManager?, QdrantVectorStore?)` at `learning-tools.ts:41`
|
|
26
|
+
- [ ] `createMemoryTools(memoryBridge, vectorStore, graphStore)` — call at line 219 matches signature `(MemoryBridge, VectorStore | null, GraphStore | null)` at `memory-tools.ts:49`
|
|
27
|
+
- [ ] `createGraphTools(graphStore)` — call at line 220 matches signature `(GraphStore | null)` at `graph-tools.ts:36`
|
|
28
|
+
- [ ] `createCollaborationTools(vectorStore, graphStore, db)` — call at line 221 matches signature `(VectorStore | null, GraphStore | null, PipelineDB)` at `collaboration-tools.ts:35`
|
|
29
|
+
- [ ] `createIngestionTools(graphStore)` — call at line 216 matches signature `(GraphStore | null)` at `ingestion-tools.ts:32`
|
|
30
|
+
- [ ] `createPipelineTools(engine, registry)` — call at line 200 matches signature `(PipelineEngine, RepoRegistry)` at `pipeline-tools.ts:34`
|
|
31
|
+
- [ ] `createRegistrationTools(registry, stores)` — call at line 206-210 matches signature `(RepoRegistry, RegistrationToolStores?)` at `registration-tools.ts:61`
|
|
32
|
+
- [ ] `ContextInjector` constructor at line 186-193 matches `(KnowledgeSearch, CodebaseContext, MemoryBridge, PipelineDB, ConfidenceManager?, QdrantVectorStore?)` at `injector.ts:145-152`
|
|
33
|
+
|
|
34
|
+
### 2.2 New Types in `src/util/types.ts`
|
|
35
|
+
|
|
36
|
+
- [ ] `FileChangeStats` type exists with fields: `commitCount`, `stabilityScore`, `changeVelocity`, `lastCommitHash`, `lastCommitTs`, `recentMessages[]`
|
|
37
|
+
- [ ] `CommitRecord` type exists with fields: `hash`, `message`, `author`, `timestamp`, `files[]`
|
|
38
|
+
- [ ] `GitCommitPayload` type exists for Qdrant: `repo_id`, `commit_hash`, `message`, `author`, `timestamp`, `file_paths[]`
|
|
39
|
+
- [ ] `ObservationPayload` type is used correctly in `collaboration-tools.ts` (imported at line 10)
|
|
40
|
+
- [ ] `QueryIntent` type includes all 4 values: `read`, `modify`, `debug`, `refactor`
|
|
41
|
+
- [ ] `IndexStatusOutput` type used in `registration-tools.ts:366` exists and is correct
|
|
42
|
+
|
|
43
|
+
### 2.3 No `any` Types in New Code
|
|
44
|
+
|
|
45
|
+
- [ ] `src/tools/memory-tools.ts` — no untyped `any`
|
|
46
|
+
- [ ] `src/tools/graph-tools.ts` — no untyped `any`
|
|
47
|
+
- [ ] `src/tools/collaboration-tools.ts` — no untyped `any`
|
|
48
|
+
- [ ] `src/tools/ingestion-tools.ts` — no untyped `any`
|
|
49
|
+
- [ ] `src/query/ranking.ts` — no untyped `any`
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 3. New Tool Verification
|
|
54
|
+
|
|
55
|
+
### Expected Tool Count: 34 total
|
|
56
|
+
|
|
57
|
+
Baseline 22 + 12 new tools. Verify `Object.keys(allTools).length` logged at server startup matches 34.
|
|
58
|
+
|
|
59
|
+
### 3.1 Phase 1 Tools (6 new)
|
|
60
|
+
|
|
61
|
+
#### `save_observation`
|
|
62
|
+
- [ ] Registered in `allTools` via `...memoryTools` spread (server.ts:230)
|
|
63
|
+
- [ ] Schema: `{ content: string, symbols?: string[], repo_id?: string, importance?: number [0-1, default 0.5], tags?: string[], category?: string, type?: 'episodic'|'semantic'|'procedural'|'working' }`
|
|
64
|
+
- [ ] Returns: `{ id, stored, linked_symbols, unresolved_symbols }` on success
|
|
65
|
+
- [ ] Graceful degradation: returns `{ error: 'VECTOR_STORE_UNAVAILABLE', stored: false }` when vectorStore is null
|
|
66
|
+
- [ ] Uses no-op graph store when graphStore is null (does NOT throw)
|
|
67
|
+
|
|
68
|
+
#### `search_memory`
|
|
69
|
+
- [ ] Registered in `allTools` via `...memoryTools` spread
|
|
70
|
+
- [ ] Schema: `{ query: string, repo_id?: string, session_id?: string, limit?: number [1-50, default 10], score_threshold?: number [0-1, default 0.3] }`
|
|
71
|
+
- [ ] Returns: `{ results: [{ content, created_at, relevance_score, session_id }] }`
|
|
72
|
+
- [ ] Graceful degradation: catches errors and returns `{ error, results: [] }`
|
|
73
|
+
|
|
74
|
+
#### `get_session_context`
|
|
75
|
+
- [ ] Registered in `allTools` via `...memoryTools` spread
|
|
76
|
+
- [ ] Schema: `{ query?: string, session_count?: number [1-10, default 3], limit?: number [1-50, default 20] }`
|
|
77
|
+
- [ ] Returns: `{ current_session: { session_id, started_at, uptime_seconds, observation_count }, recent_sessions: [...] }`
|
|
78
|
+
- [ ] Graceful degradation: returns `{ error: 'VECTOR_STORE_UNAVAILABLE', current_session: null, recent_sessions: [] }` when vectorStore is null
|
|
79
|
+
- [ ] Calls `persistSessionMarker()` before querying
|
|
80
|
+
|
|
81
|
+
#### `get_impact_graph`
|
|
82
|
+
- [ ] Registered in `allTools` via `...graphTools` spread (server.ts:231)
|
|
83
|
+
- [ ] Schema: `{ symbol: string, repo_id: string, direction: 'inbound'|'outbound'|'both' [default 'both'], depth?: number [1-5, default 3] }`
|
|
84
|
+
- [ ] Returns: `{ symbol, direction, nodes: [...], edges: [...], total_nodes, total_edges }`
|
|
85
|
+
- [ ] Graceful degradation: returns `{ error: 'GRAPH_UNAVAILABLE' }` when graphStore is null OR unhealthy
|
|
86
|
+
- [ ] Uses both `QUERY_INBOUND_IMPACT` and `QUERY_OUTBOUND_IMPACT` from `graph-queries.ts`
|
|
87
|
+
|
|
88
|
+
#### `search_logic_flow`
|
|
89
|
+
- [ ] Registered in `allTools` via `...graphTools` spread
|
|
90
|
+
- [ ] Schema: `{ from_symbol: string, to_symbol: string, repo_id: string, max_depth?: number [1-10, default 5] }`
|
|
91
|
+
- [ ] Returns: `{ from_symbol, to_symbol, paths: [{ nodes, edges, length }], connected: boolean }`
|
|
92
|
+
- [ ] Graceful degradation: returns `{ error: 'GRAPH_UNAVAILABLE' }` when graphStore is null OR unhealthy
|
|
93
|
+
- [ ] Uses `QUERY_SHORTEST_PATH` from `graph-queries.ts`
|
|
94
|
+
|
|
95
|
+
#### `get_index_status`
|
|
96
|
+
- [ ] Registered in `allTools` via `...registrationTools` spread
|
|
97
|
+
- [ ] Schema: `{ repo_id?: string }`
|
|
98
|
+
- [ ] Returns: `{ repos, graph: { total_nodes, total_edges, node_counts }, vector: { code_chunks_count, observations_count }, cache, health: 'healthy'|'degraded'|'unavailable', embedding_model, uptime_seconds }`
|
|
99
|
+
- [ ] Graceful degradation: returns status for available backends only, reports health accurately
|
|
100
|
+
|
|
101
|
+
### 3.2 Phase 2 Tools (2 new)
|
|
102
|
+
|
|
103
|
+
#### `boost_knowledge`
|
|
104
|
+
- [ ] Registered in `allTools` via `...learningTools` spread (server.ts:228)
|
|
105
|
+
- [ ] Schema: `{ knowledge_id: string, amount?: number [0-1, default 0.05], reason?: string }`
|
|
106
|
+
- [ ] Returns: `{ knowledge_id, boosted: true, amount, reason }` on success
|
|
107
|
+
- [ ] Graceful degradation: returns `{ error: 'CONFIDENCE_UNAVAILABLE' }` when confidenceManager or vectorStore is missing
|
|
108
|
+
|
|
109
|
+
#### `decay_knowledge`
|
|
110
|
+
- [ ] Registered in `allTools` via `...learningTools` spread
|
|
111
|
+
- [ ] Schema: `{ decay_rate?: number [0-1, default 0.01] }`
|
|
112
|
+
- [ ] Returns: `{ decayed_count, decay_rate }`
|
|
113
|
+
- [ ] Graceful degradation: returns `{ error: 'CONFIDENCE_UNAVAILABLE' }` when confidenceManager or vectorStore is missing
|
|
114
|
+
|
|
115
|
+
### 3.3 Phase 3 Tools (1 new)
|
|
116
|
+
|
|
117
|
+
#### `get_git_context`
|
|
118
|
+
- [ ] Registered in `allTools` via `...contextTools` spread (server.ts:227)
|
|
119
|
+
- [ ] Schema: `{ mode: 'hotspots'|'commit_search'|'file_history', repo_id?: string, query?: string, file_path?: string, limit?: number [1-100, default 20] }`
|
|
120
|
+
- [ ] Mode `hotspots` returns: `{ mode: 'hotspots', results: [{ file_path, commit_count, stability_score, change_velocity }], total }`
|
|
121
|
+
- [ ] Mode `commit_search` returns: `{ mode: 'commit_search', results: [...], total }`
|
|
122
|
+
- [ ] Mode `file_history` returns: `{ mode: 'file_history', results: [{ file_path, commit_count, stability_score, change_velocity, last_commit_hash, last_commit_ts }], total }`
|
|
123
|
+
- [ ] Graceful degradation: `hotspots` requires graphStore, `commit_search` requires vectorStore + `searchGitCommits` method, `file_history` requires graphStore
|
|
124
|
+
- [ ] Returns descriptive error objects (not throws) when backends unavailable
|
|
125
|
+
|
|
126
|
+
### 3.4 Phase 4 Tools (1 new)
|
|
127
|
+
|
|
128
|
+
#### `submit_lsp_edges`
|
|
129
|
+
- [ ] Registered in `allTools` via `...ingestionTools` spread (server.ts:229)
|
|
130
|
+
- [ ] Schema: `{ repo_id: string, edges: [{ from_file: string, from_symbol: string, to_file: string, to_symbol: string, edge_type: string }] }`
|
|
131
|
+
- [ ] Returns: `{ accepted: number, failed: number, errors?: string[] }`
|
|
132
|
+
- [ ] Graceful degradation: returns `{ error: 'GRAPH_UNAVAILABLE' }` when graphStore is null OR unhealthy
|
|
133
|
+
- [ ] Upserts both source and target Symbol nodes before creating the edge
|
|
134
|
+
- [ ] Sets `source: 'lsp'` on nodes to distinguish from AST-parsed nodes
|
|
135
|
+
|
|
136
|
+
### 3.5 Phase 5 Tools (2 new)
|
|
137
|
+
|
|
138
|
+
#### `broadcast_finding`
|
|
139
|
+
- [ ] Registered in `allTools` via `...collaborationTools` spread (server.ts:232)
|
|
140
|
+
- [ ] Schema: `{ project_id: string, content: string, severity: 'info'|'warning'|'critical' [default 'info'], target_agents?: string[], symbols?: string[] }`
|
|
141
|
+
- [ ] Returns: `{ broadcast: true, observation_id, severity, project_id }`
|
|
142
|
+
- [ ] Saves observation to Qdrant (when available) with `category: 'agent_broadcast'`, `type: 'working'`
|
|
143
|
+
- [ ] Records in SQLite `pipeline_events` as `event_type: 'agent_broadcast'`
|
|
144
|
+
- [ ] Importance scaled by severity: critical=0.9, warning=0.7, info=0.5
|
|
145
|
+
|
|
146
|
+
#### `get_broadcasts`
|
|
147
|
+
- [ ] Registered in `allTools` via `...collaborationTools` spread
|
|
148
|
+
- [ ] Schema: `{ project_id: string, since?: number, severity?: 'info'|'warning'|'critical' }`
|
|
149
|
+
- [ ] Returns: `{ project_id, broadcasts: [...], count }`
|
|
150
|
+
- [ ] Queries SQLite `pipeline_events` table with `event_type = 'agent_broadcast'`
|
|
151
|
+
- [ ] Supports filtering by `since` timestamp and `severity`
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 4. Integration Points
|
|
156
|
+
|
|
157
|
+
### 4.1 server.ts Wiring
|
|
158
|
+
|
|
159
|
+
- [ ] All 9 tool factory imports present (lines 35-43): `createPipelineTools`, `createPhaseTools`, `createContextTools`, `createRegistrationTools`, `createLearningTools`, `createIngestionTools`, `createMemoryTools`, `createGraphTools`, `createCollaborationTools`
|
|
160
|
+
- [ ] `ConfidenceManager` imported from `./learning/confidence.js` (line 45)
|
|
161
|
+
- [ ] `ConfidenceManager` instantiated at line 134
|
|
162
|
+
- [ ] `confidenceManager` passed to `ContextInjector` constructor (line 191)
|
|
163
|
+
- [ ] `confidenceManager` passed to `createLearningTools` (line 213)
|
|
164
|
+
- [ ] `vectorStore` passed as `QdrantVectorStore` to `ContextInjector` (line 192)
|
|
165
|
+
- [ ] `vectorStore` passed as `QdrantVectorStore | null` to `createLearningTools` (line 214)
|
|
166
|
+
- [ ] All tool objects spread into `allTools`: `pipelineTools`, `phaseTools`, `contextTools`, `registrationTools`, `learningTools`, `ingestionTools`, `memoryTools`, `graphTools`, `collaborationTools` (lines 223-233)
|
|
167
|
+
- [ ] Periodic confidence decay interval set at 24 hours (line 303-309)
|
|
168
|
+
- [ ] Decay interval calls `confidenceManager.decayAll(vectorStore)` with proper null guard (line 305)
|
|
169
|
+
|
|
170
|
+
### 4.2 Auto-Observation in Phase Handlers (Phase 2)
|
|
171
|
+
|
|
172
|
+
- [ ] `phase-tools.ts` imports `saveObservation` from `observation-store.ts` (line 11)
|
|
173
|
+
- [ ] `phase-tools.ts` imports `getCurrentSessionId` from `session-tracker.ts` (line 12)
|
|
174
|
+
- [ ] `autoObserve` helper defined with null guards (line 170-202)
|
|
175
|
+
- [ ] `autoObserve` guards against `vectorStore === null` (line 181)
|
|
176
|
+
- [ ] `autoObserve` uses `noOpGraphStore` when graphStore is null (line 196)
|
|
177
|
+
- [ ] `autoObserve` wraps in `.catch()` — NEVER blocks phase transition (line 197-202)
|
|
178
|
+
- [ ] `submit_vision` calls `autoObserve` with `category: 'vision'`, `importance: 0.6` (line 302)
|
|
179
|
+
- [ ] `submit_plan` calls `autoObserve` with `category: 'architecture'`, `importance: 0.6` (line 442)
|
|
180
|
+
- [ ] `submit_design` calls `autoObserve` with `category: 'design'`, `importance: 0.5` (line 557)
|
|
181
|
+
- [ ] `submit_test_plan` calls `autoObserve` with `category: 'test_plan'`, `importance: 0.5` (line 672)
|
|
182
|
+
- [ ] `submit_implementation` calls `autoObserve` with `category: 'implementation'`, `importance: 0.5` (line 811)
|
|
183
|
+
- [ ] `submit_verdict` calls `autoObserve` with `category: 'inspection'`, `importance: 0.7` (line 947)
|
|
184
|
+
- [ ] All auto-observations tagged with `['auto_observation', phase_name, project_id]`
|
|
185
|
+
|
|
186
|
+
### 4.3 Intent Detection in `get_codebase_context` (Phase 1)
|
|
187
|
+
|
|
188
|
+
- [ ] `context-tools.ts` imports `detectIntent` and `getIntentStrategy` from `intent-detector.ts` (line 11)
|
|
189
|
+
- [ ] `detectIntent(input.query)` called in `get_codebase_context` handler (line 115)
|
|
190
|
+
- [ ] `getIntentStrategy(queryIntent)` called to get weight adjustments (line 116)
|
|
191
|
+
- [ ] `strategy.vectorWeight` passed to `codebaseContext.getContext()` (line 125)
|
|
192
|
+
- [ ] `strategy.graphWeight` passed to `codebaseContext.getContext()` (line 126)
|
|
193
|
+
- [ ] `strategy.includeTests` used as fallback for include_tests (line 122)
|
|
194
|
+
- [ ] `queryIntent` returned in response (not hardcoded `'read'`) (line 175)
|
|
195
|
+
|
|
196
|
+
### 4.4 Related Memories in `get_codebase_context`
|
|
197
|
+
|
|
198
|
+
- [ ] `memoryBridge` parameter accepted in `createContextTools` (line 56)
|
|
199
|
+
- [ ] `memoryBridge` passed from server.ts (line 203)
|
|
200
|
+
- [ ] `memoryBridge.searchMemories(input.query, ...)` called in handler (line 136)
|
|
201
|
+
- [ ] Results mapped to `relatedMemories` array (line 140-143)
|
|
202
|
+
- [ ] `related_memories` field populated in response (line 174)
|
|
203
|
+
- [ ] Memory search failure is non-fatal (wrapped in try/catch, logged at debug level) (line 144-148)
|
|
204
|
+
|
|
205
|
+
### 4.5 Confidence Boost in ContextInjector
|
|
206
|
+
|
|
207
|
+
- [ ] `ContextInjector` accepts `ConfidenceManager` as optional constructor param (line 150)
|
|
208
|
+
- [ ] `ContextInjector` accepts `QdrantVectorStore` as optional constructor param (line 151)
|
|
209
|
+
- [ ] `boostConsumedKnowledge()` method defined as fire-and-forget (line 158-166)
|
|
210
|
+
- [ ] Boost called after knowledge search results are consumed during phase context assembly
|
|
211
|
+
- [ ] Boost is guarded against null `confidenceManager` or `vectorStore` (line 165)
|
|
212
|
+
|
|
213
|
+
### 4.6 Hotspot Signal in Hybrid Search (Phase 3)
|
|
214
|
+
|
|
215
|
+
- [ ] `ranking.ts` has 5-signal scoring: vector (0.55), graph (0.20), recency (0.05), hotspot (0.10), observation (0.10) (lines 11-15)
|
|
216
|
+
- [ ] `ScoredResult` interface includes `hotspotScore` and `observationScore` fields (lines 26-27)
|
|
217
|
+
- [ ] `computeScore()` accepts `hotspotScore`, `hotspotWeight`, `observationScore`, `observationWeight` parameters with backward-compatible defaults (lines 52-55)
|
|
218
|
+
- [ ] `hybrid-search.ts` imports `QUERY_FILE_HOTSPOTS` from `graph-queries.ts` (line 15)
|
|
219
|
+
- [ ] `HybridSearchOptions` includes `intent?: QueryIntent` (line 27)
|
|
220
|
+
|
|
221
|
+
### 4.7 Git Commits Collection in Qdrant (Phase 3)
|
|
222
|
+
|
|
223
|
+
- [ ] `qdrant-store.ts` has `ensureGitCommitsCollection()` method
|
|
224
|
+
- [ ] `qdrant-store.ts` has `upsertGitCommits()` method
|
|
225
|
+
- [ ] `qdrant-store.ts` has `searchGitCommits()` method
|
|
226
|
+
- [ ] `qdrant-store.ts` has `deleteGitCommitsByRepo()` method
|
|
227
|
+
- [ ] `context-tools.ts` checks for `'searchGitCommits' in vectorStore` before calling (line 337)
|
|
228
|
+
|
|
229
|
+
### 4.8 Staleness Detection (Phase 2)
|
|
230
|
+
|
|
231
|
+
- [ ] `indexer.ts` calls `MARK_SYMBOL_OBSERVATIONS_STALE` when entities change on re-index
|
|
232
|
+
- [ ] Stale observations appear with `is_stale` flag in search results
|
|
233
|
+
|
|
234
|
+
### 4.9 Pipeline-Tools Jira Fields (Phase 5)
|
|
235
|
+
|
|
236
|
+
- [ ] `createProjectSchema` includes `jira_ticket: z.string().optional()` (line 23)
|
|
237
|
+
- [ ] `createProjectSchema` includes `jira_epic: z.string().optional()` (line 24)
|
|
238
|
+
- [ ] Jira fields stored in project metadata JSON (line 91-93)
|
|
239
|
+
- [ ] Jira fields returned by `get_state` via project metadata
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## 5. Agent Prompt Checks
|
|
244
|
+
|
|
245
|
+
### 5.1 Memory & Observation Section (all 12 agents)
|
|
246
|
+
|
|
247
|
+
- [ ] `plugin/agents/architect.md` has `## Memory & Observation Tools` section (line 245)
|
|
248
|
+
- [ ] `plugin/agents/backend-specialist.md` has `## Memory & Observation Tools` section (line 153)
|
|
249
|
+
- [ ] `plugin/agents/data-specialist.md` has `## Memory & Observation Tools` section (line 156)
|
|
250
|
+
- [ ] `plugin/agents/designer.md` has `## Memory & Observation Tools` section (line 322)
|
|
251
|
+
- [ ] `plugin/agents/frontend-specialist.md` has `## Memory & Observation Tools` section (line 131)
|
|
252
|
+
- [ ] `plugin/agents/inspector.md` has `## Memory & Observation Tools` section (line 341)
|
|
253
|
+
- [ ] `plugin/agents/knowledge-keeper.md` has `## Memory & Observation Tools` section (line 313)
|
|
254
|
+
- [ ] `plugin/agents/platform-engineer.md` has `## Memory & Observation Tools` section (line 205)
|
|
255
|
+
- [ ] `plugin/agents/product-manager.md` has `## Memory & Observation Tools` section (line 240)
|
|
256
|
+
- [ ] `plugin/agents/qa-strategist.md` has `## Memory & Observation Tools` section (line 314)
|
|
257
|
+
- [ ] `plugin/agents/strategist.md` has `## Memory & Observation Tools` section (line 274)
|
|
258
|
+
- [ ] `plugin/agents/supervisor.md` has `## Memory & Observation Tools` section (line 212)
|
|
259
|
+
|
|
260
|
+
### 5.2 Graph Analysis Section (7 agents)
|
|
261
|
+
|
|
262
|
+
- [ ] `plugin/agents/architect.md` has `## Graph Analysis Tools` section (line 258)
|
|
263
|
+
- [ ] `plugin/agents/backend-specialist.md` has `## Graph Analysis Tools` section (line 166)
|
|
264
|
+
- [ ] `plugin/agents/data-specialist.md` has `## Graph Analysis Tools` section (line 169)
|
|
265
|
+
- [ ] `plugin/agents/frontend-specialist.md` has `## Graph Analysis Tools` section (line 144)
|
|
266
|
+
- [ ] `plugin/agents/inspector.md` has `## Graph Analysis Tools` section (line 354)
|
|
267
|
+
- [ ] `plugin/agents/knowledge-keeper.md` has `## Graph Analysis Tools` section (line 326)
|
|
268
|
+
- [ ] `plugin/agents/platform-engineer.md` has `## Graph Analysis Tools` section (line 219)
|
|
269
|
+
- [ ] Agents WITHOUT Graph Analysis: `designer.md`, `product-manager.md`, `qa-strategist.md`, `strategist.md`, `supervisor.md` (5 agents -- confirm these do NOT have the section)
|
|
270
|
+
|
|
271
|
+
### 5.3 Atlassian Section (7 agents)
|
|
272
|
+
|
|
273
|
+
- [ ] `plugin/agents/architect.md` has `## Atlassian Context (Optional)` section (line 278)
|
|
274
|
+
- [ ] `plugin/agents/inspector.md` has `## Atlassian Context (Optional)` section (line 374)
|
|
275
|
+
- [ ] `plugin/agents/knowledge-keeper.md` has `## Atlassian Context (Optional)` section (line 340)
|
|
276
|
+
- [ ] `plugin/agents/platform-engineer.md` has `## Atlassian Context (Optional)` section (line 239)
|
|
277
|
+
- [ ] `plugin/agents/product-manager.md` has `## Atlassian Context (Optional)` section (line 260)
|
|
278
|
+
- [ ] `plugin/agents/strategist.md` has `## Atlassian Context (Optional)` section (line 294)
|
|
279
|
+
- [ ] `plugin/agents/supervisor.md` has `## Atlassian Context (Optional)` section (line 238)
|
|
280
|
+
- [ ] All Atlassian sections include "If unavailable, skip without error" language
|
|
281
|
+
- [ ] Agents WITHOUT Atlassian: `backend-specialist.md`, `data-specialist.md`, `designer.md`, `frontend-specialist.md`, `qa-strategist.md` (5 agents -- confirm these do NOT have the section)
|
|
282
|
+
|
|
283
|
+
### 5.4 Cross-Agent Collaboration Section (all 12 agents)
|
|
284
|
+
|
|
285
|
+
- [ ] `plugin/agents/architect.md` has `## Cross-Agent Collaboration` section (line 271)
|
|
286
|
+
- [ ] `plugin/agents/backend-specialist.md` has `## Cross-Agent Collaboration` section (line 179)
|
|
287
|
+
- [ ] `plugin/agents/data-specialist.md` has `## Cross-Agent Collaboration` section (line 182)
|
|
288
|
+
- [ ] `plugin/agents/designer.md` has `## Cross-Agent Collaboration` section (line 335)
|
|
289
|
+
- [ ] `plugin/agents/frontend-specialist.md` has `## Cross-Agent Collaboration` section (line 157)
|
|
290
|
+
- [ ] `plugin/agents/inspector.md` has `## Cross-Agent Collaboration` section (line 367)
|
|
291
|
+
- [ ] `plugin/agents/knowledge-keeper.md` has `## Cross-Agent Collaboration` section (line 333)
|
|
292
|
+
- [ ] `plugin/agents/platform-engineer.md` has `## Cross-Agent Collaboration` section (line 232)
|
|
293
|
+
- [ ] `plugin/agents/product-manager.md` has `## Cross-Agent Collaboration` section (line 253)
|
|
294
|
+
- [ ] `plugin/agents/qa-strategist.md` has `## Cross-Agent Collaboration` section (line 327)
|
|
295
|
+
- [ ] `plugin/agents/strategist.md` has `## Cross-Agent Collaboration` section (line 287)
|
|
296
|
+
- [ ] `plugin/agents/supervisor.md` has `## Cross-Agent Collaboration` section (line 231)
|
|
297
|
+
- [ ] All Collaboration sections reference `broadcast_finding` and `get_broadcasts`
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## 6. Plugin Config
|
|
302
|
+
|
|
303
|
+
### 6.1 `.mcp.json`
|
|
304
|
+
|
|
305
|
+
- [ ] `plugin/.mcp.json` has `dk-forge` server entry with correct args (line 2-5)
|
|
306
|
+
- [ ] `plugin/.mcp.json` has `atlassian` server entry (line 6-14)
|
|
307
|
+
- [ ] Atlassian entry uses `uvx` command with `mcp-atlassian` arg
|
|
308
|
+
- [ ] Atlassian entry references env vars: `JIRA_URL`, `JIRA_USERNAME`, `JIRA_API_TOKEN`
|
|
309
|
+
- [ ] Env var references use `${VAR}` syntax
|
|
310
|
+
|
|
311
|
+
### 6.2 Atlassian Integration Docs
|
|
312
|
+
|
|
313
|
+
- [ ] `plugin/docs/atlassian-integration.md` exists
|
|
314
|
+
- [ ] Doc covers prerequisites (Python 3.10+, uvx, Jira Cloud)
|
|
315
|
+
- [ ] Doc covers environment variables table
|
|
316
|
+
- [ ] Doc covers graceful degradation behavior
|
|
317
|
+
- [ ] Doc lists which 7 agents use Jira and which 5 do not
|
|
318
|
+
- [ ] Doc covers troubleshooting (MCP start failure, auth errors, env var issues)
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## 7. VS Code Extension (`vscode-extension/`)
|
|
323
|
+
|
|
324
|
+
### 7.1 Project Structure
|
|
325
|
+
|
|
326
|
+
- [ ] `vscode-extension/package.json` exists
|
|
327
|
+
- [ ] `vscode-extension/tsconfig.json` exists
|
|
328
|
+
- [ ] `vscode-extension/src/extension.ts` exists
|
|
329
|
+
- [ ] `vscode-extension/src/edge-collector.ts` exists
|
|
330
|
+
- [ ] `vscode-extension/src/forge-client.ts` exists
|
|
331
|
+
|
|
332
|
+
### 7.2 Extension Manifest (`package.json`)
|
|
333
|
+
|
|
334
|
+
- [ ] Name is `forge-lsp-bridge`
|
|
335
|
+
- [ ] Activates on `typescript`, `javascript`, `typescriptreact`, `javascriptreact` files
|
|
336
|
+
- [ ] `main` points to `./out/extension.js`
|
|
337
|
+
- [ ] Configuration contributes: `forge.lspBridge.enabled` (boolean, default true)
|
|
338
|
+
- [ ] Configuration contributes: `forge.lspBridge.repoId` (string, auto-detected from manifest)
|
|
339
|
+
- [ ] Configuration contributes: `forge.lspBridge.debounceMs` (number, default 5000, min 1000, max 30000)
|
|
340
|
+
- [ ] Configuration contributes: `forge.lspBridge.mcpServerPath` (string, path to dist/index.js)
|
|
341
|
+
- [ ] Commands: `forge.lspBridge.toggle` and `forge.lspBridge.flush`
|
|
342
|
+
- [ ] VS Code engine: `^1.85.0`
|
|
343
|
+
|
|
344
|
+
### 7.3 TypeScript Config (`tsconfig.json`)
|
|
345
|
+
|
|
346
|
+
- [ ] `module: "commonjs"` (required for VS Code extensions)
|
|
347
|
+
- [ ] `target: "ES2022"`
|
|
348
|
+
- [ ] `outDir: "out"`
|
|
349
|
+
- [ ] `rootDir: "src"`
|
|
350
|
+
- [ ] `strict: true`
|
|
351
|
+
- [ ] Does NOT conflict with the main project tsconfig (separate tsconfig in vscode-extension/)
|
|
352
|
+
|
|
353
|
+
### 7.4 Extension Entry Point (`extension.ts`)
|
|
354
|
+
|
|
355
|
+
- [ ] Exports `activate` and `deactivate` functions
|
|
356
|
+
- [ ] Creates `EdgeCollector` with debounce callback
|
|
357
|
+
- [ ] Creates `ForgeClient` for MCP communication
|
|
358
|
+
- [ ] Auto-detects `repoId` from `.forge/manifest.yaml` in workspace root
|
|
359
|
+
- [ ] Registers save listener on TS/JS files only (`SUPPORTED_LANGUAGES` set)
|
|
360
|
+
- [ ] Status bar item shows enabled/disabled state
|
|
361
|
+
- [ ] Toggle command registered (`forge.lspBridge.toggle`)
|
|
362
|
+
- [ ] Flush command registered (`forge.lspBridge.flush`)
|
|
363
|
+
- [ ] Configuration change watcher updates debounce, repoId, and enabled state
|
|
364
|
+
- [ ] Deactivation flushes pending edges and disposes client
|
|
365
|
+
|
|
366
|
+
### 7.5 Edge Collector (`edge-collector.ts`)
|
|
367
|
+
|
|
368
|
+
- [ ] Uses `vscode.commands.executeCommand('vscode.prepareCallHierarchy')` for call hierarchy API
|
|
369
|
+
- [ ] Uses `vscode.commands.executeCommand('vscode.provideOutgoingCalls')` for outgoing calls
|
|
370
|
+
- [ ] Uses `vscode.commands.executeCommand('vscode.executeDocumentSymbolProvider')` for symbol discovery
|
|
371
|
+
- [ ] Filters to callable symbols only: Function, Method, Constructor
|
|
372
|
+
- [ ] Builds qualified symbol names (e.g. `ClassName.methodName`)
|
|
373
|
+
- [ ] Collects `CALLS` edge type
|
|
374
|
+
- [ ] Skips self-references and `node_modules` targets
|
|
375
|
+
- [ ] Implements debounced flushing (configurable interval)
|
|
376
|
+
- [ ] `flushNow()` method for manual/deactivation flush
|
|
377
|
+
- [ ] Deduplicates edges within a batch before flushing
|
|
378
|
+
- [ ] Re-queues edges on flush failure
|
|
379
|
+
|
|
380
|
+
### 7.6 Forge Client (`forge-client.ts`)
|
|
381
|
+
|
|
382
|
+
- [ ] Spawns dk-forge-server as child process on stdio
|
|
383
|
+
- [ ] Uses JSON-RPC 2.0 protocol with Content-Length framing
|
|
384
|
+
- [ ] Sends MCP `initialize` handshake with protocol version `2024-11-05`
|
|
385
|
+
- [ ] Sends `notifications/initialized` after handshake
|
|
386
|
+
- [ ] Calls `tools/call` with `name: 'submit_lsp_edges'` to submit edges
|
|
387
|
+
- [ ] Parses MCP tool response content blocks
|
|
388
|
+
- [ ] 30-second request timeout
|
|
389
|
+
- [ ] Lazy initialization (spawns server on first use)
|
|
390
|
+
- [ ] Proper cleanup on dispose (kills child process, clears pending requests)
|
|
391
|
+
- [ ] Sets `FORGE_LOG_LEVEL=warn` to prevent server log pollution on stdout
|
|
392
|
+
- [ ] Default server path resolves to `../../dist/index.js` relative to extension
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## 8. Cross-Cutting Checks
|
|
397
|
+
|
|
398
|
+
### 8.1 Graceful Degradation Matrix
|
|
399
|
+
|
|
400
|
+
| Tool | vectorStore=null | graphStore=null | Both null |
|
|
401
|
+
|------|-----------------|-----------------|-----------|
|
|
402
|
+
| `save_observation` | [ ] Returns error, stored: false | [ ] Uses noOpGraphStore | [ ] Returns error |
|
|
403
|
+
| `search_memory` | [ ] MemoryBridge handles internally | [ ] N/A | [ ] Returns empty |
|
|
404
|
+
| `get_session_context` | [ ] Returns error | [ ] N/A | [ ] Returns error |
|
|
405
|
+
| `get_impact_graph` | [ ] N/A | [ ] Returns GRAPH_UNAVAILABLE | [ ] Returns error |
|
|
406
|
+
| `search_logic_flow` | [ ] N/A | [ ] Returns GRAPH_UNAVAILABLE | [ ] Returns error |
|
|
407
|
+
| `get_index_status` | [ ] Reports degraded health | [ ] Reports degraded health | [ ] Reports unavailable |
|
|
408
|
+
| `boost_knowledge` | [ ] Returns CONFIDENCE_UNAVAILABLE | [ ] N/A | [ ] Returns error |
|
|
409
|
+
| `decay_knowledge` | [ ] Returns CONFIDENCE_UNAVAILABLE | [ ] N/A | [ ] Returns error |
|
|
410
|
+
| `get_git_context` (hotspots) | [ ] N/A | [ ] Returns GRAPH_UNAVAILABLE | [ ] Returns error |
|
|
411
|
+
| `get_git_context` (commit_search) | [ ] Returns GIT_COMMITS_UNAVAILABLE | [ ] N/A | [ ] Returns error |
|
|
412
|
+
| `get_git_context` (file_history) | [ ] N/A | [ ] Returns GRAPH_UNAVAILABLE | [ ] Returns error |
|
|
413
|
+
| `submit_lsp_edges` | [ ] N/A | [ ] Returns GRAPH_UNAVAILABLE | [ ] Returns error |
|
|
414
|
+
| `broadcast_finding` | [ ] Saves to SQLite only, skips observation | [ ] Uses noOpGraphStore | [ ] SQLite-only |
|
|
415
|
+
| `get_broadcasts` | [ ] Queries SQLite only | [ ] N/A | [ ] Queries SQLite only |
|
|
416
|
+
| Auto-observations (phase) | [ ] Skipped silently (debug log) | [ ] Uses noOpGraphStore | [ ] Skipped silently |
|
|
417
|
+
|
|
418
|
+
### 8.2 No Blocking on Failure
|
|
419
|
+
|
|
420
|
+
- [ ] All `autoObserve` calls use `.catch()` (fire-and-forget pattern)
|
|
421
|
+
- [ ] All confidence boost calls in `ContextInjector` are fire-and-forget (line 158-160)
|
|
422
|
+
- [ ] Periodic decay interval uses `.catch()` (server.ts line 307)
|
|
423
|
+
- [ ] `broadcast_finding` observation save failure is non-fatal (collaboration-tools.ts line 75-77)
|
|
424
|
+
- [ ] Memory search in `get_codebase_context` is non-fatal (context-tools.ts line 144-148)
|
|
425
|
+
|
|
426
|
+
### 8.3 Anti-Stub Checks
|
|
427
|
+
|
|
428
|
+
- [ ] No placeholder/TODO comments in new tool handlers that skip actual implementation
|
|
429
|
+
- [ ] All Zod schemas are complete (no `z.any()` or `z.unknown()` placeholders)
|
|
430
|
+
- [ ] All handler functions have real return values (not `return {}` stubs)
|
|
431
|
+
- [ ] `autoObserve` actually calls `saveObservation` (not stubbed)
|
|
432
|
+
- [ ] `ContextInjector.boostConsumedKnowledge` actually calls `confidenceManager.boost` (not stubbed)
|
|
433
|
+
- [ ] `ForgeClient.submitLspEdges` actually sends JSON-RPC request (not stubbed)
|
|
434
|
+
- [ ] `EdgeCollector.collectFromDocument` actually queries VS Code APIs (not stubbed)
|
|
435
|
+
|
|
436
|
+
### 8.4 Security
|
|
437
|
+
|
|
438
|
+
- [ ] Cypher queries in `context-tools.ts` use `escCypher()` to prevent injection (line 488-494)
|
|
439
|
+
- [ ] No raw user input concatenated into SQL queries (SQLite uses parameterized queries in collaboration-tools.ts)
|
|
440
|
+
- [ ] No secrets/credentials hardcoded in any source file
|
|
441
|
+
- [ ] Atlassian credentials referenced only via `${ENV_VAR}` syntax in `.mcp.json`
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
## 9. Functional Verification (Manual Test Plan)
|
|
446
|
+
|
|
447
|
+
### After Build Succeeds
|
|
448
|
+
|
|
449
|
+
1. [ ] Start forge server: `npm start` — verify tool count in startup log matches expected (34)
|
|
450
|
+
2. [ ] Call `save_observation` with `{ content: "test", symbols: ["createForgeServer"] }` — verify `stored: true`
|
|
451
|
+
3. [ ] Call `search_memory` with `{ query: "test" }` — verify the saved observation appears
|
|
452
|
+
4. [ ] Call `get_session_context` — verify `current_session` has valid `session_id` and `uptime_seconds`
|
|
453
|
+
5. [ ] Call `get_impact_graph` with `{ symbol: "createForgeServer", repo_id: "...", direction: "inbound" }` (requires FalkorDB running)
|
|
454
|
+
6. [ ] Call `search_logic_flow` with two known connected symbols (requires FalkorDB)
|
|
455
|
+
7. [ ] Call `get_codebase_context` with a debug-style query (e.g. "why is the build failing") — verify `query_intent` is `'debug'`, NOT `'read'`
|
|
456
|
+
8. [ ] Call `get_codebase_context` — verify `related_memories` is populated (not `[]`) if observations exist
|
|
457
|
+
9. [ ] Call `get_index_status` — verify health reflects actual backend connectivity
|
|
458
|
+
10. [ ] Call `get_git_context` with `mode: 'hotspots'` — verify returns files sorted by commit count (requires indexed repo + FalkorDB)
|
|
459
|
+
11. [ ] Call `broadcast_finding` with `{ project_id: "test", content: "test finding", severity: "warning" }` — verify `broadcast: true`
|
|
460
|
+
12. [ ] Call `get_broadcasts` with `{ project_id: "test" }` — verify the broadcast appears
|
|
461
|
+
13. [ ] Run a full pipeline through `submit_verdict` — verify auto-observations created (search for `tags: ['auto_observation']`)
|
|
462
|
+
14. [ ] Verify `boost_knowledge` and `decay_knowledge` work with valid knowledge IDs
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# Plan: Git History Enrichment + Atlassian Integration for dk-forge-server
|
|
2
|
+
|
|
3
|
+
**Date**: 2026-02-27
|
|
4
|
+
**Status**: ABSORBED — This plan was incorporated into the forge-swarm-learning architecture (`docs/plans/completed/2026-02-27-forge-swarm-learning/architecture.md`). Git enrichment was implemented as Phase 3 and Atlassian integration as Phase 5 of that plan. Both are now complete.
|
|
5
|
+
**Author**: Architect (on behalf of Adam Reynolds)
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
The dk-forge-server indexes code for semantic search but **barely uses the git history it already captures**. The `git-analyzer.ts` extracts CO_MODIFIED edges (files changed together) but misses change frequency, hotspots, commit messages, and stability metrics. Meanwhile, agents have no access to Jira tickets, PR feedback, or sprint context — despite heavy Jira usage.
|
|
10
|
+
|
|
11
|
+
**Goal**: Make agents smarter by giving them (1) enriched git history signals and (2) Atlassian project context.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Part 1: Git History Enrichment (Server Code Changes)
|
|
16
|
+
|
|
17
|
+
### What's new (beyond existing CO_MODIFIED edges)
|
|
18
|
+
|
|
19
|
+
| Signal | Storage | Used By |
|
|
20
|
+
|--------|---------|---------|
|
|
21
|
+
| Per-file commit count | FalkorDB File node property | Hybrid search hotspot boost |
|
|
22
|
+
| Stability score (0-1) | FalkorDB File node property | Architect, Inspector context |
|
|
23
|
+
| Change velocity (-1 to +1) | FalkorDB File node property | Supervisor routing |
|
|
24
|
+
| Last commit hash + timestamp | FalkorDB File node property | Recency awareness |
|
|
25
|
+
| Recent commit messages (per file) | New Qdrant `git_commits` collection | Semantic commit search |
|
|
26
|
+
|
|
27
|
+
### Files to modify
|
|
28
|
+
|
|
29
|
+
**1. `src/util/types.ts`** — Add types
|
|
30
|
+
- `FileChangeStats` interface (commitCount, stabilityScore, changeVelocity, lastCommitHash, lastCommitTs, recentMessages)
|
|
31
|
+
- `CommitRecord` interface (hash, message, author, timestamp, files)
|
|
32
|
+
- `GitCommitPayload` interface for Qdrant (repo_id, commit_hash, message, author, timestamp, file_paths)
|
|
33
|
+
- Extend `GitAnalysisResult` → `EnrichedGitAnalysisResult` with `fileStats` and `commits`
|
|
34
|
+
|
|
35
|
+
**2. `src/ingestion/git-analyzer.ts`** — Enrich git log parsing
|
|
36
|
+
- Change `git log --format="%H"` → `git log --format="%H|%s|%an|%aI"` (add subject, author, date)
|
|
37
|
+
- Add `analyzeFileStats()` — compute per-file: commit count, stability score, velocity (recent half vs. older half of history), last commit info
|
|
38
|
+
- Add `extractCommitRecords()` — parse into `CommitRecord[]` (filter merge commits + bulk reformats >50 files)
|
|
39
|
+
- Update `runGitAnalysis()` to return enriched result + upsert file stats onto FalkorDB File nodes
|
|
40
|
+
|
|
41
|
+
**3. `src/storage/qdrant-store.ts`** — New `git_commits` collection
|
|
42
|
+
- Add `ensureGitCommitsCollection()` to `ensureCollections()`
|
|
43
|
+
- Payload indexes: `repo_id` (keyword), `commit_hash` (keyword), `author` (keyword), `timestamp` (integer), `file_paths` (keyword)
|
|
44
|
+
- Add `upsertGitCommits()`, `searchGitCommits()`, `deleteGitCommitsByRepo()`
|
|
45
|
+
|
|
46
|
+
**4. `src/ingestion/indexer.ts`** — Embed commit messages during indexing
|
|
47
|
+
- After `runGitAnalysis()`, batch-embed commit messages via `embedBatch()`
|
|
48
|
+
- Store as Qdrant points in `git_commits` collection with `GitCommitPayload`
|
|
49
|
+
- ~300-400 commits after filtering → ~2-3s extra indexing time
|
|
50
|
+
|
|
51
|
+
**5. `src/query/ranking.ts`** — Add hotspot signal to scoring
|
|
52
|
+
- Change weights: 0.6/0.3/0.1 → 0.55/0.25/0.10/0.10
|
|
53
|
+
- Add `hotspotScore` and `hotspotWeight` params to `computeScore()` (defaults to 0/0.10 — backward compatible)
|
|
54
|
+
- Add `hotspotScore` to `ScoredResult` interface
|
|
55
|
+
- Extend `buildMatchReason()` to include "hotspot (frequently changed)" when score > 0.5
|
|
56
|
+
|
|
57
|
+
**6. `src/query/hybrid-search.ts`** — Integrate hotspot into search pipeline
|
|
58
|
+
- After graph neighbor expansion, fetch file hotspot scores from FalkorDB
|
|
59
|
+
- Normalize: `hotspot = file.commit_count / max_commit_count_in_results`
|
|
60
|
+
- Pass to `computeScore()` as 4th signal
|
|
61
|
+
- For `modify`/`debug`/`refactor` intent: hotspot boosts volatile files. For `read` intent: no boost
|
|
62
|
+
|
|
63
|
+
**7. `src/query/graph-queries.ts`** — New graph queries
|
|
64
|
+
- `QUERY_FILE_HOTSPOTS(repoId)` — top 100 files by commit_count
|
|
65
|
+
- `QUERY_FILE_STATS(filePath, repoId)` — single file stats
|
|
66
|
+
|
|
67
|
+
**8. `src/tools/context-tools.ts`** — New `get_git_context` MCP tool
|
|
68
|
+
- Modes: `hotspots` | `commit_search` | `file_history`
|
|
69
|
+
- `hotspots`: top N files by change frequency + stability + velocity
|
|
70
|
+
- `commit_search`: semantic search over commit messages in Qdrant
|
|
71
|
+
- `file_history`: last N commits for a specific file
|
|
72
|
+
- Falls back to raw `git log` when FalkorDB/Qdrant unavailable
|
|
73
|
+
|
|
74
|
+
**9. `src/server.ts`** — Wire new tool
|
|
75
|
+
- Pass `vectorStore` to `createContextTools()`
|
|
76
|
+
- Register `get_git_context` tool
|
|
77
|
+
|
|
78
|
+
### Graceful degradation
|
|
79
|
+
- No git → empty results (existing pattern)
|
|
80
|
+
- No FalkorDB → hotspot score = 0, `hotspots` mode falls back to raw git
|
|
81
|
+
- No Qdrant → `commit_search` returns empty, `file_history` falls back to raw git
|
|
82
|
+
- All three down → all git features silently degrade, existing functionality unaffected
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Part 2: Atlassian Integration (Plugin-Level, No Server Code in Phase 1)
|
|
87
|
+
|
|
88
|
+
### Architecture
|
|
89
|
+
|
|
90
|
+
MCP is client→server only — dk-forge **cannot** call Atlassian MCP tools. But the plugin's `.mcp.json` can declare multiple servers. Claude (the client) mediates.
|
|
91
|
+
|
|
92
|
+
### MCP server configuration
|
|
93
|
+
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"dk-forge": {
|
|
97
|
+
"command": "node",
|
|
98
|
+
"args": ["${CLAUDE_PLUGIN_ROOT}/../dist/index.js"]
|
|
99
|
+
},
|
|
100
|
+
"atlassian": {
|
|
101
|
+
"command": "uvx",
|
|
102
|
+
"args": ["mcp-atlassian"],
|
|
103
|
+
"env": {
|
|
104
|
+
"JIRA_URL": "${JIRA_URL}",
|
|
105
|
+
"JIRA_USERNAME": "${JIRA_USERNAME}",
|
|
106
|
+
"JIRA_API_TOKEN": "${JIRA_API_TOKEN}"
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Using [sooperset/mcp-atlassian](https://github.com/sooperset/mcp-atlassian) (68 tools: 52 Jira + 16 Confluence). Bitbucket can be added separately if needed.
|
|
113
|
+
|
|
114
|
+
**Note**: Env vars use `${VAR}` interpolation — users set these in their environment. If vars are missing, the server fails to start but dk-forge works fine alone.
|
|
115
|
+
|
|
116
|
+
### Agent prompt modifications (7 agents)
|
|
117
|
+
|
|
118
|
+
| Agent | What to add | Tools referenced |
|
|
119
|
+
|-------|------------|-----------------|
|
|
120
|
+
| **Strategist** | Pre-interview: pull linked Jira issue, sprint context. Post-vision: comment on ticket | `jira_get_issue`, `jira_search`, `jira_get_sprint_issues`, `jira_add_comment` |
|
|
121
|
+
| **Architect** | Check blocking issues, linked PRs, review feedback. Post-plan: comment on ticket | `jira_get_issue`, `jira_get_issue_development_info`, `jira_search`, `jira_add_comment` |
|
|
122
|
+
| **Inspector** | Check acceptance criteria from ticket. Post-verdict: comment pass/fail on ticket | `jira_get_issue`, `jira_add_comment`, `jira_transition_issue` |
|
|
123
|
+
| **Knowledge Keeper** | Pull ticket changelog for decision history. Post-extraction: comment summary | `jira_batch_get_changelogs`, `jira_add_comment` |
|
|
124
|
+
| **Product Manager** | Pull existing stories/epics to avoid duplicate requirements | `jira_search`, `jira_get_issue` |
|
|
125
|
+
| **Supervisor** | Check sprint capacity for routing priority | `jira_get_sprint_issues` |
|
|
126
|
+
| **Platform Engineer** | Check CI pipeline status via Bitbucket (if configured) | Bitbucket tools (Phase 2) |
|
|
127
|
+
|
|
128
|
+
**NOT modified**: Backend/Frontend/Data Specialists, Designer, QA Strategist — they receive context from upstream planning agents. Adding Jira calls to implementation agents = latency + token waste.
|
|
129
|
+
|
|
130
|
+
### Graceful degradation pattern
|
|
131
|
+
|
|
132
|
+
Every Atlassian section in agent prompts uses this pattern:
|
|
133
|
+
```
|
|
134
|
+
## Atlassian Context (Optional)
|
|
135
|
+
These tools are OPTIONAL. If unavailable, skip without error and proceed normally.
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Strategist probes `jira_search` on pipeline start. If it fails → sets `atlassian_available: false` in session state → all downstream agents skip Atlassian calls.
|
|
139
|
+
|
|
140
|
+
### New documentation
|
|
141
|
+
|
|
142
|
+
- `plugin/docs/atlassian-integration.md` — Setup guide, expected server names, what each agent does with Jira context
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Part 3: Phase 2 Server Changes for Atlassian (Future)
|
|
147
|
+
|
|
148
|
+
Not in this implementation, but designed for:
|
|
149
|
+
- Add `jira_ticket` and `jira_epic` optional fields to `create_project` schema
|
|
150
|
+
- Store in project metadata → returned by `get_state` → agents auto-discover ticket key
|
|
151
|
+
- Knowledge Keeper indexes closed ticket resolutions as knowledge items during `collect_knowledge`
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Implementation Order
|
|
156
|
+
|
|
157
|
+
| Step | What | Parallelizable? |
|
|
158
|
+
|------|------|----------------|
|
|
159
|
+
| 1 | Types (`types.ts`) + ranking weights (`ranking.ts`) | Yes — independent |
|
|
160
|
+
| 2 | Git analyzer enrichment + Qdrant git_commits collection | Yes — both in parallel |
|
|
161
|
+
| 3 | Indexer integration (embed commits, store file stats) | After step 2 |
|
|
162
|
+
| 4 | Hybrid search hotspot integration | After step 1 |
|
|
163
|
+
| 5 | `get_git_context` MCP tool + server wiring | After steps 3+4 |
|
|
164
|
+
| 6 | Agent prompt updates (git context references) | After step 5 |
|
|
165
|
+
| 7 | `.mcp.json` Atlassian server + agent Atlassian sections | **Parallel with steps 1-5** |
|
|
166
|
+
| 8 | `plugin/docs/atlassian-integration.md` | After step 7 |
|
|
167
|
+
| 9 | Rebuild dist/, test end-to-end | After all |
|
|
168
|
+
|
|
169
|
+
Steps 1-6 (git) and step 7 (Atlassian prompts) are fully independent — can be dispatched to parallel specialists.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Verification
|
|
174
|
+
|
|
175
|
+
1. **Build**: `npm run build` succeeds
|
|
176
|
+
2. **Existing tests**: `npm test` passes (no regressions)
|
|
177
|
+
3. **Git indexing**: Run `forge index --path . --force` on this repo → verify git_commits collection populated in Qdrant, File nodes have commit_count/stability_score in FalkorDB
|
|
178
|
+
4. **New tool**: Call `mcp__dk-forge__get_git_context` with mode=hotspots → returns file list sorted by commit count
|
|
179
|
+
5. **Commit search**: Call `mcp__dk-forge__get_git_context` with mode=commit_search, query="rebrand forge pipeline" → returns relevant commits
|
|
180
|
+
6. **Hybrid search**: Call `mcp__dk-forge__get_codebase_context` → verify match_reason includes hotspot info for volatile files
|
|
181
|
+
7. **Atlassian**: With `mcp-atlassian` configured, run `/forge new test-feature` and verify strategist attempts `jira_search`. Without it configured, verify no errors.
|