argustack 0.1.34 → 0.3.1
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/README.md +31 -98
- package/dist/adapters/board/board-sync.js +2 -2
- package/dist/adapters/board/board-sync.js.map +1 -1
- package/dist/adapters/board/md-parser.js +3 -3
- package/dist/adapters/board/md-parser.js.map +1 -1
- package/dist/adapters/board/skill-discovery.js +2 -2
- package/dist/adapters/board/skill-discovery.js.map +1 -1
- package/dist/adapters/board/skill-runner.js +2 -2
- package/dist/adapters/board/skill-runner.js.map +1 -1
- package/dist/adapters/board/store.d.ts.map +1 -1
- package/dist/adapters/board/store.js +11 -11
- package/dist/adapters/board/store.js.map +1 -1
- package/dist/adapters/csv/mapper.js +11 -11
- package/dist/adapters/csv/mapper.js.map +1 -1
- package/dist/adapters/csv/parser.d.ts.map +1 -1
- package/dist/adapters/csv/parser.js +8 -7
- package/dist/adapters/csv/parser.js.map +1 -1
- package/dist/adapters/csv/provider.js +4 -4
- package/dist/adapters/csv/provider.js.map +1 -1
- package/dist/adapters/db/client.js +2 -2
- package/dist/adapters/db/client.js.map +1 -1
- package/dist/adapters/db/index.js +1 -0
- package/dist/adapters/db/index.js.map +1 -1
- package/dist/adapters/db/mapper.js +1 -1
- package/dist/adapters/db/mapper.js.map +1 -1
- package/dist/adapters/db/provider.js +4 -4
- package/dist/adapters/db/provider.js.map +1 -1
- package/dist/adapters/db/sql-validator.js +2 -2
- package/dist/adapters/db/sql-validator.js.map +1 -1
- package/dist/adapters/docker/cli-docker-control.d.ts +13 -0
- package/dist/adapters/docker/cli-docker-control.d.ts.map +1 -0
- package/dist/adapters/docker/cli-docker-control.js +70 -0
- package/dist/adapters/docker/cli-docker-control.js.map +1 -0
- package/dist/adapters/docker/index.d.ts +2 -0
- package/dist/adapters/docker/index.d.ts.map +1 -0
- package/dist/adapters/docker/index.js +2 -0
- package/dist/adapters/docker/index.js.map +1 -0
- package/dist/adapters/git/mapper.js +1 -1
- package/dist/adapters/git/mapper.js.map +1 -1
- package/dist/adapters/git/provider.js +4 -4
- package/dist/adapters/git/provider.js.map +1 -1
- package/dist/adapters/github/mapper.js +3 -3
- package/dist/adapters/github/mapper.js.map +1 -1
- package/dist/adapters/github/provider.d.ts.map +1 -1
- package/dist/adapters/github/provider.js +2 -2
- package/dist/adapters/github/provider.js.map +1 -1
- package/dist/adapters/jira/mapper.js +4 -4
- package/dist/adapters/jira/mapper.js.map +1 -1
- package/dist/adapters/jira/provider.js +8 -8
- package/dist/adapters/jira/provider.js.map +1 -1
- package/dist/adapters/jira-proxy/client.js +4 -4
- package/dist/adapters/jira-proxy/client.js.map +1 -1
- package/dist/adapters/jira-proxy/config-loader.d.ts +9 -0
- package/dist/adapters/jira-proxy/config-loader.d.ts.map +1 -1
- package/dist/adapters/jira-proxy/config-loader.js +26 -3
- package/dist/adapters/jira-proxy/config-loader.js.map +1 -1
- package/dist/adapters/jira-proxy/index.d.ts +1 -1
- package/dist/adapters/jira-proxy/index.d.ts.map +1 -1
- package/dist/adapters/jira-proxy/index.js +1 -1
- package/dist/adapters/jira-proxy/index.js.map +1 -1
- package/dist/adapters/jira-proxy/mapper.js +2 -2
- package/dist/adapters/jira-proxy/mapper.js.map +1 -1
- package/dist/adapters/jira-proxy/provider.d.ts.map +1 -1
- package/dist/adapters/jira-proxy/provider.js +19 -8
- package/dist/adapters/jira-proxy/provider.js.map +1 -1
- package/dist/adapters/lmstudio/embedding-provider.d.ts +37 -0
- package/dist/adapters/lmstudio/embedding-provider.d.ts.map +1 -0
- package/dist/adapters/lmstudio/embedding-provider.js +174 -0
- package/dist/adapters/lmstudio/embedding-provider.js.map +1 -0
- package/dist/adapters/lmstudio/index.d.ts +3 -0
- package/dist/adapters/lmstudio/index.d.ts.map +1 -0
- package/dist/adapters/lmstudio/index.js +2 -0
- package/dist/adapters/lmstudio/index.js.map +1 -0
- package/dist/adapters/lsp/index.d.ts +4 -0
- package/dist/adapters/lsp/index.d.ts.map +1 -0
- package/dist/adapters/lsp/index.js +3 -0
- package/dist/adapters/lsp/index.js.map +1 -0
- package/dist/adapters/lsp/jsonrpc.d.ts +12 -0
- package/dist/adapters/lsp/jsonrpc.d.ts.map +1 -0
- package/dist/adapters/lsp/jsonrpc.js +30 -0
- package/dist/adapters/lsp/jsonrpc.js.map +1 -0
- package/dist/adapters/lsp/typescript-lsp.d.ts +25 -0
- package/dist/adapters/lsp/typescript-lsp.d.ts.map +1 -0
- package/dist/adapters/lsp/typescript-lsp.js +131 -0
- package/dist/adapters/lsp/typescript-lsp.js.map +1 -0
- package/dist/adapters/neo4j/client.d.ts +11 -0
- package/dist/adapters/neo4j/client.d.ts.map +1 -0
- package/dist/adapters/neo4j/client.js +14 -0
- package/dist/adapters/neo4j/client.js.map +1 -0
- package/dist/adapters/neo4j/cypher.d.ts +23 -0
- package/dist/adapters/neo4j/cypher.d.ts.map +1 -0
- package/dist/adapters/neo4j/cypher.js +138 -0
- package/dist/adapters/neo4j/cypher.js.map +1 -0
- package/dist/adapters/neo4j/graph-store.d.ts +33 -0
- package/dist/adapters/neo4j/graph-store.d.ts.map +1 -0
- package/dist/adapters/neo4j/graph-store.js +282 -0
- package/dist/adapters/neo4j/graph-store.js.map +1 -0
- package/dist/adapters/neo4j/index.d.ts +4 -0
- package/dist/adapters/neo4j/index.d.ts.map +1 -0
- package/dist/adapters/neo4j/index.js +3 -0
- package/dist/adapters/neo4j/index.js.map +1 -0
- package/dist/adapters/neo4j/mapper.d.ts +5 -0
- package/dist/adapters/neo4j/mapper.d.ts.map +1 -0
- package/dist/adapters/neo4j/mapper.js +49 -0
- package/dist/adapters/neo4j/mapper.js.map +1 -0
- package/dist/adapters/ollama/chat-llm.d.ts +24 -0
- package/dist/adapters/ollama/chat-llm.d.ts.map +1 -0
- package/dist/adapters/ollama/chat-llm.js +53 -0
- package/dist/adapters/ollama/chat-llm.js.map +1 -0
- package/dist/adapters/ollama/embedding-provider.d.ts +30 -0
- package/dist/adapters/ollama/embedding-provider.d.ts.map +1 -0
- package/dist/adapters/ollama/embedding-provider.js +124 -0
- package/dist/adapters/ollama/embedding-provider.js.map +1 -0
- package/dist/adapters/ollama/http-ollama-control.d.ts +24 -0
- package/dist/adapters/ollama/http-ollama-control.d.ts.map +1 -0
- package/dist/adapters/ollama/http-ollama-control.js +224 -0
- package/dist/adapters/ollama/http-ollama-control.js.map +1 -0
- package/dist/adapters/ollama/index.d.ts +6 -0
- package/dist/adapters/ollama/index.d.ts.map +1 -0
- package/dist/adapters/ollama/index.js +4 -0
- package/dist/adapters/ollama/index.js.map +1 -0
- package/dist/adapters/platform/index.d.ts +2 -0
- package/dist/adapters/platform/index.d.ts.map +1 -0
- package/dist/adapters/platform/index.js +2 -0
- package/dist/adapters/platform/index.js.map +1 -0
- package/dist/adapters/platform/node-platform-probe.d.ts +9 -0
- package/dist/adapters/platform/node-platform-probe.d.ts.map +1 -0
- package/dist/adapters/platform/node-platform-probe.js +88 -0
- package/dist/adapters/platform/node-platform-probe.js.map +1 -0
- package/dist/adapters/postgres/code-meta.d.ts +21 -0
- package/dist/adapters/postgres/code-meta.d.ts.map +1 -0
- package/dist/adapters/postgres/code-meta.js +150 -0
- package/dist/adapters/postgres/code-meta.js.map +1 -0
- package/dist/adapters/postgres/index.d.ts +3 -0
- package/dist/adapters/postgres/index.d.ts.map +1 -1
- package/dist/adapters/postgres/index.js +3 -0
- package/dist/adapters/postgres/index.js.map +1 -1
- package/dist/adapters/postgres/migrate-helpers.d.ts +43 -0
- package/dist/adapters/postgres/migrate-helpers.d.ts.map +1 -0
- package/dist/adapters/postgres/migrate-helpers.js +136 -0
- package/dist/adapters/postgres/migrate-helpers.js.map +1 -0
- package/dist/adapters/postgres/readiness-probe.d.ts +22 -0
- package/dist/adapters/postgres/readiness-probe.d.ts.map +1 -0
- package/dist/adapters/postgres/readiness-probe.js +47 -0
- package/dist/adapters/postgres/readiness-probe.js.map +1 -0
- package/dist/adapters/postgres/schema.d.ts +11 -1
- package/dist/adapters/postgres/schema.d.ts.map +1 -1
- package/dist/adapters/postgres/schema.js +192 -108
- package/dist/adapters/postgres/schema.js.map +1 -1
- package/dist/adapters/postgres/storage-commits.d.ts +13 -0
- package/dist/adapters/postgres/storage-commits.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-commits.js +63 -0
- package/dist/adapters/postgres/storage-commits.js.map +1 -0
- package/dist/adapters/postgres/storage-dbschema.d.ts +14 -0
- package/dist/adapters/postgres/storage-dbschema.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-dbschema.js +63 -0
- package/dist/adapters/postgres/storage-dbschema.js.map +1 -0
- package/dist/adapters/postgres/storage-graph.d.ts +18 -0
- package/dist/adapters/postgres/storage-graph.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-graph.js +127 -0
- package/dist/adapters/postgres/storage-graph.js.map +1 -0
- package/dist/adapters/postgres/storage-issues.d.ts +26 -0
- package/dist/adapters/postgres/storage-issues.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-issues.js +233 -0
- package/dist/adapters/postgres/storage-issues.js.map +1 -0
- package/dist/adapters/postgres/storage-prs.d.ts +15 -0
- package/dist/adapters/postgres/storage-prs.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-prs.js +142 -0
- package/dist/adapters/postgres/storage-prs.js.map +1 -0
- package/dist/adapters/postgres/storage-query.d.ts +26 -0
- package/dist/adapters/postgres/storage-query.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-query.js +74 -0
- package/dist/adapters/postgres/storage-query.js.map +1 -0
- package/dist/adapters/postgres/storage-search.d.ts +18 -0
- package/dist/adapters/postgres/storage-search.d.ts.map +1 -0
- package/dist/adapters/postgres/storage-search.js +90 -0
- package/dist/adapters/postgres/storage-search.js.map +1 -0
- package/dist/adapters/postgres/storage.d.ts +49 -33
- package/dist/adapters/postgres/storage.d.ts.map +1 -1
- package/dist/adapters/postgres/storage.js +89 -605
- package/dist/adapters/postgres/storage.js.map +1 -1
- package/dist/adapters/postgres/workspace-store.d.ts +26 -0
- package/dist/adapters/postgres/workspace-store.d.ts.map +1 -0
- package/dist/adapters/postgres/workspace-store.js +94 -0
- package/dist/adapters/postgres/workspace-store.js.map +1 -0
- package/dist/adapters/qdrant/client.d.ts +8 -0
- package/dist/adapters/qdrant/client.d.ts.map +1 -0
- package/dist/adapters/qdrant/client.js +12 -0
- package/dist/adapters/qdrant/client.js.map +1 -0
- package/dist/adapters/qdrant/index.d.ts +4 -0
- package/dist/adapters/qdrant/index.d.ts.map +1 -0
- package/dist/adapters/qdrant/index.js +3 -0
- package/dist/adapters/qdrant/index.js.map +1 -0
- package/dist/adapters/qdrant/mapper.d.ts +16 -0
- package/dist/adapters/qdrant/mapper.d.ts.map +1 -0
- package/dist/adapters/qdrant/mapper.js +59 -0
- package/dist/adapters/qdrant/mapper.js.map +1 -0
- package/dist/adapters/qdrant/vector-store.d.ts +20 -0
- package/dist/adapters/qdrant/vector-store.d.ts.map +1 -0
- package/dist/adapters/qdrant/vector-store.js +144 -0
- package/dist/adapters/qdrant/vector-store.js.map +1 -0
- package/dist/adapters/tree-sitter/index.d.ts +4 -0
- package/dist/adapters/tree-sitter/index.d.ts.map +1 -0
- package/dist/adapters/tree-sitter/index.js +3 -0
- package/dist/adapters/tree-sitter/index.js.map +1 -0
- package/dist/adapters/tree-sitter/parser.d.ts +15 -0
- package/dist/adapters/tree-sitter/parser.d.ts.map +1 -0
- package/dist/adapters/tree-sitter/parser.js +186 -0
- package/dist/adapters/tree-sitter/parser.js.map +1 -0
- package/dist/adapters/tree-sitter/queries.d.ts +14 -0
- package/dist/adapters/tree-sitter/queries.d.ts.map +1 -0
- package/dist/adapters/tree-sitter/queries.js +14 -0
- package/dist/adapters/tree-sitter/queries.js.map +1 -0
- package/dist/adapters/voyage/embedding-provider.d.ts +25 -0
- package/dist/adapters/voyage/embedding-provider.d.ts.map +1 -0
- package/dist/adapters/voyage/embedding-provider.js +105 -0
- package/dist/adapters/voyage/embedding-provider.js.map +1 -0
- package/dist/adapters/voyage/index.d.ts +3 -0
- package/dist/adapters/voyage/index.d.ts.map +1 -0
- package/dist/adapters/voyage/index.js +2 -0
- package/dist/adapters/voyage/index.js.map +1 -0
- package/dist/cli/add/code.d.ts +3 -0
- package/dist/cli/add/code.d.ts.map +1 -0
- package/dist/cli/add/code.js +97 -0
- package/dist/cli/add/code.js.map +1 -0
- package/dist/cli/add/csv.d.ts +3 -0
- package/dist/cli/add/csv.d.ts.map +1 -0
- package/dist/cli/add/csv.js +26 -0
- package/dist/cli/add/csv.js.map +1 -0
- package/dist/cli/add/db.d.ts +3 -0
- package/dist/cli/add/db.d.ts.map +1 -0
- package/dist/cli/add/db.js +46 -0
- package/dist/cli/add/db.js.map +1 -0
- package/dist/cli/add/git.d.ts +3 -0
- package/dist/cli/add/git.d.ts.map +1 -0
- package/dist/cli/add/git.js +26 -0
- package/dist/cli/add/git.js.map +1 -0
- package/dist/cli/add/github.d.ts +3 -0
- package/dist/cli/add/github.d.ts.map +1 -0
- package/dist/cli/add/github.js +32 -0
- package/dist/cli/add/github.js.map +1 -0
- package/dist/cli/add/index.d.ts +3 -0
- package/dist/cli/add/index.d.ts.map +1 -0
- package/dist/cli/add/index.js +18 -0
- package/dist/cli/add/index.js.map +1 -0
- package/dist/cli/add/jira.d.ts +3 -0
- package/dist/cli/add/jira.d.ts.map +1 -0
- package/dist/cli/add/jira.js +45 -0
- package/dist/cli/add/jira.js.map +1 -0
- package/dist/cli/add/shared.d.ts +31 -0
- package/dist/cli/add/shared.d.ts.map +1 -0
- package/dist/cli/add/shared.js +102 -0
- package/dist/cli/add/shared.js.map +1 -0
- package/dist/cli/board-server.js +1 -1
- package/dist/cli/board-server.js.map +1 -1
- package/dist/cli/board.d.ts.map +1 -1
- package/dist/cli/board.js +11 -12
- package/dist/cli/board.js.map +1 -1
- package/dist/cli/code.d.ts +3 -0
- package/dist/cli/code.d.ts.map +1 -0
- package/dist/cli/code.js +467 -0
- package/dist/cli/code.js.map +1 -0
- package/dist/cli/embed.d.ts.map +1 -1
- package/dist/cli/embed.js +21 -26
- package/dist/cli/embed.js.map +1 -1
- package/dist/cli/graph.d.ts.map +1 -1
- package/dist/cli/graph.js +37 -55
- package/dist/cli/graph.js.map +1 -1
- package/dist/cli/index.js +30 -25
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/cleanup.d.ts +11 -0
- package/dist/cli/init/cleanup.d.ts.map +1 -0
- package/dist/cli/init/cleanup.js +39 -0
- package/dist/cli/init/cleanup.js.map +1 -0
- package/dist/cli/init/generators.js +27 -27
- package/dist/cli/init/generators.js.map +1 -1
- package/dist/cli/init/index.d.ts +0 -10
- package/dist/cli/init/index.d.ts.map +1 -1
- package/dist/cli/init/index.js +386 -351
- package/dist/cli/init/index.js.map +1 -1
- package/dist/cli/init/presenter.d.ts +30 -0
- package/dist/cli/init/presenter.d.ts.map +1 -0
- package/dist/cli/init/presenter.js +152 -0
- package/dist/cli/init/presenter.js.map +1 -0
- package/dist/cli/init/prompts.d.ts +28 -0
- package/dist/cli/init/prompts.d.ts.map +1 -0
- package/dist/cli/init/prompts.js +110 -0
- package/dist/cli/init/prompts.js.map +1 -0
- package/dist/cli/init/setup-csv.js +2 -2
- package/dist/cli/init/setup-csv.js.map +1 -1
- package/dist/cli/init/setup-db.d.ts.map +1 -1
- package/dist/cli/init/setup-db.js +17 -14
- package/dist/cli/init/setup-db.js.map +1 -1
- package/dist/cli/init/setup-git.js +16 -16
- package/dist/cli/init/setup-git.js.map +1 -1
- package/dist/cli/init/setup-github.d.ts.map +1 -1
- package/dist/cli/init/setup-github.js +7 -5
- package/dist/cli/init/setup-github.js.map +1 -1
- package/dist/cli/init/setup-jira.d.ts.map +1 -1
- package/dist/cli/init/setup-jira.js +11 -9
- package/dist/cli/init/setup-jira.js.map +1 -1
- package/dist/cli/init/types.d.ts +4 -0
- package/dist/cli/init/types.d.ts.map +1 -1
- package/dist/cli/init/types.js +4 -4
- package/dist/cli/init/types.js.map +1 -1
- package/dist/cli/mcp-install.d.ts +1 -1
- package/dist/cli/mcp-install.d.ts.map +1 -1
- package/dist/cli/mcp-install.js +10 -24
- package/dist/cli/mcp-install.js.map +1 -1
- package/dist/cli/migrate-to-hub-impl.d.ts +51 -0
- package/dist/cli/migrate-to-hub-impl.d.ts.map +1 -0
- package/dist/cli/migrate-to-hub-impl.js +171 -0
- package/dist/cli/migrate-to-hub-impl.js.map +1 -0
- package/dist/cli/migrate-to-hub.d.ts +3 -0
- package/dist/cli/migrate-to-hub.d.ts.map +1 -0
- package/dist/cli/migrate-to-hub.js +90 -0
- package/dist/cli/migrate-to-hub.js.map +1 -0
- package/dist/cli/push.d.ts.map +1 -1
- package/dist/cli/push.js +62 -65
- package/dist/cli/push.js.map +1 -1
- package/dist/cli/sources.d.ts +0 -7
- package/dist/cli/sources.d.ts.map +1 -1
- package/dist/cli/sources.js +47 -112
- package/dist/cli/sources.js.map +1 -1
- package/dist/cli/status.d.ts +0 -3
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +95 -70
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/sync.d.ts +0 -10
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +186 -314
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/workspace/add.d.ts +3 -0
- package/dist/cli/workspace/add.d.ts.map +1 -0
- package/dist/cli/workspace/add.js +38 -0
- package/dist/cli/workspace/add.js.map +1 -0
- package/dist/cli/workspace/index.d.ts +3 -0
- package/dist/cli/workspace/index.d.ts.map +1 -0
- package/dist/cli/workspace/index.js +16 -0
- package/dist/cli/workspace/index.js.map +1 -0
- package/dist/cli/workspace/info.d.ts +3 -0
- package/dist/cli/workspace/info.d.ts.map +1 -0
- package/dist/cli/workspace/info.js +69 -0
- package/dist/cli/workspace/info.js.map +1 -0
- package/dist/cli/workspace/list.d.ts +3 -0
- package/dist/cli/workspace/list.d.ts.map +1 -0
- package/dist/cli/workspace/list.js +36 -0
- package/dist/cli/workspace/list.js.map +1 -0
- package/dist/cli/workspace/remove.d.ts +3 -0
- package/dist/cli/workspace/remove.d.ts.map +1 -0
- package/dist/cli/workspace/remove.js +43 -0
- package/dist/cli/workspace/remove.js.map +1 -0
- package/dist/cli/workspace/shared.d.ts +7 -0
- package/dist/cli/workspace/shared.d.ts.map +1 -0
- package/dist/cli/workspace/shared.js +17 -0
- package/dist/cli/workspace/shared.js.map +1 -0
- package/dist/cli/workspace/use.d.ts +3 -0
- package/dist/cli/workspace/use.d.ts.map +1 -0
- package/dist/cli/workspace/use.js +27 -0
- package/dist/cli/workspace/use.js.map +1 -0
- package/dist/code-intel/chunker.d.ts +15 -0
- package/dist/code-intel/chunker.d.ts.map +1 -0
- package/dist/code-intel/chunker.js +39 -0
- package/dist/code-intel/chunker.js.map +1 -0
- package/dist/code-intel/file-discovery.d.ts +19 -0
- package/dist/code-intel/file-discovery.d.ts.map +1 -0
- package/dist/code-intel/file-discovery.js +80 -0
- package/dist/code-intel/file-discovery.js.map +1 -0
- package/dist/code-intel/hash.d.ts +2 -0
- package/dist/code-intel/hash.d.ts.map +1 -0
- package/dist/code-intel/hash.js +5 -0
- package/dist/code-intel/hash.js.map +1 -0
- package/dist/code-intel/index.d.ts +17 -0
- package/dist/code-intel/index.d.ts.map +1 -0
- package/dist/code-intel/index.js +11 -0
- package/dist/code-intel/index.js.map +1 -0
- package/dist/code-intel/indexer.d.ts +43 -0
- package/dist/code-intel/indexer.d.ts.map +1 -0
- package/dist/code-intel/indexer.js +234 -0
- package/dist/code-intel/indexer.js.map +1 -0
- package/dist/code-intel/job-lock.d.ts +7 -0
- package/dist/code-intel/job-lock.d.ts.map +1 -0
- package/dist/code-intel/job-lock.js +18 -0
- package/dist/code-intel/job-lock.js.map +1 -0
- package/dist/code-intel/layer-detector.d.ts +9 -0
- package/dist/code-intel/layer-detector.d.ts.map +1 -0
- package/dist/code-intel/layer-detector.js +31 -0
- package/dist/code-intel/layer-detector.js.map +1 -0
- package/dist/code-intel/lsp-resolver.d.ts +24 -0
- package/dist/code-intel/lsp-resolver.d.ts.map +1 -0
- package/dist/code-intel/lsp-resolver.js +125 -0
- package/dist/code-intel/lsp-resolver.js.map +1 -0
- package/dist/code-intel/ranker.d.ts +42 -0
- package/dist/code-intel/ranker.d.ts.map +1 -0
- package/dist/code-intel/ranker.js +123 -0
- package/dist/code-intel/ranker.js.map +1 -0
- package/dist/code-intel/resolver.d.ts +14 -0
- package/dist/code-intel/resolver.d.ts.map +1 -0
- package/dist/code-intel/resolver.js +59 -0
- package/dist/code-intel/resolver.js.map +1 -0
- package/dist/code-intel/tsconfig-paths.d.ts +11 -0
- package/dist/code-intel/tsconfig-paths.d.ts.map +1 -0
- package/dist/code-intel/tsconfig-paths.js +67 -0
- package/dist/code-intel/tsconfig-paths.js.map +1 -0
- package/dist/code-intel/watcher.d.ts +27 -0
- package/dist/code-intel/watcher.d.ts.map +1 -0
- package/dist/code-intel/watcher.js +93 -0
- package/dist/code-intel/watcher.js.map +1 -0
- package/dist/core/board/board-column.value-object.js +1 -1
- package/dist/core/board/board-column.value-object.js.map +1 -1
- package/dist/core/board/pipeline.value-object.js +1 -1
- package/dist/core/board/pipeline.value-object.js.map +1 -1
- package/dist/core/board/skill-execution.entity.js +1 -1
- package/dist/core/board/skill-execution.entity.js.map +1 -1
- package/dist/core/board/task-title.value-object.js +1 -1
- package/dist/core/board/task-title.value-object.js.map +1 -1
- package/dist/core/ports/chat-llm.d.ts +36 -0
- package/dist/core/ports/chat-llm.d.ts.map +1 -0
- package/dist/core/ports/chat-llm.js +2 -0
- package/dist/core/ports/chat-llm.js.map +1 -0
- package/dist/core/ports/code-embedding.d.ts +42 -0
- package/dist/core/ports/code-embedding.d.ts.map +1 -0
- package/dist/core/ports/code-embedding.js +2 -0
- package/dist/core/ports/code-embedding.js.map +1 -0
- package/dist/core/ports/code-graph.d.ts +56 -0
- package/dist/core/ports/code-graph.d.ts.map +1 -0
- package/dist/core/ports/code-graph.js +2 -0
- package/dist/core/ports/code-graph.js.map +1 -0
- package/dist/core/ports/code-meta.d.ts +37 -0
- package/dist/core/ports/code-meta.d.ts.map +1 -0
- package/dist/core/ports/code-meta.js +2 -0
- package/dist/core/ports/code-meta.js.map +1 -0
- package/dist/core/ports/code-parser.d.ts +13 -0
- package/dist/core/ports/code-parser.d.ts.map +1 -0
- package/dist/core/ports/code-parser.js +2 -0
- package/dist/core/ports/code-parser.js.map +1 -0
- package/dist/core/ports/code-vector-store.d.ts +42 -0
- package/dist/core/ports/code-vector-store.d.ts.map +1 -0
- package/dist/core/ports/code-vector-store.js +2 -0
- package/dist/core/ports/code-vector-store.js.map +1 -0
- package/dist/core/ports/docker-control.d.ts +44 -0
- package/dist/core/ports/docker-control.d.ts.map +1 -0
- package/dist/core/ports/docker-control.js +8 -0
- package/dist/core/ports/docker-control.js.map +1 -0
- package/dist/core/ports/hub-readiness-probe.d.ts +22 -0
- package/dist/core/ports/hub-readiness-probe.d.ts.map +1 -0
- package/dist/core/ports/hub-readiness-probe.js +2 -0
- package/dist/core/ports/hub-readiness-probe.js.map +1 -0
- package/dist/core/ports/index.d.ts +10 -0
- package/dist/core/ports/index.d.ts.map +1 -1
- package/dist/core/ports/lsp-client.d.ts +22 -0
- package/dist/core/ports/lsp-client.d.ts.map +1 -0
- package/dist/core/ports/lsp-client.js +2 -0
- package/dist/core/ports/lsp-client.js.map +1 -0
- package/dist/core/ports/ollama-control.d.ts +61 -0
- package/dist/core/ports/ollama-control.d.ts.map +1 -0
- package/dist/core/ports/ollama-control.js +7 -0
- package/dist/core/ports/ollama-control.js.map +1 -0
- package/dist/core/ports/platform-probe.d.ts +47 -0
- package/dist/core/ports/platform-probe.d.ts.map +1 -0
- package/dist/core/ports/platform-probe.js +8 -0
- package/dist/core/ports/platform-probe.js.map +1 -0
- package/dist/core/ports/storage.d.ts +62 -29
- package/dist/core/ports/storage.d.ts.map +1 -1
- package/dist/core/ports/workspace-store.d.ts +52 -0
- package/dist/core/ports/workspace-store.d.ts.map +1 -0
- package/dist/core/ports/workspace-store.js +2 -0
- package/dist/core/ports/workspace-store.js.map +1 -0
- package/dist/core/types/code.d.ts +153 -0
- package/dist/core/types/code.d.ts.map +1 -0
- package/dist/core/types/code.js +2 -0
- package/dist/core/types/code.js.map +1 -0
- package/dist/core/types/config.d.ts +1 -1
- package/dist/core/types/config.d.ts.map +1 -1
- package/dist/core/types/config.js +8 -1
- package/dist/core/types/config.js.map +1 -1
- package/dist/core/types/index.d.ts +3 -0
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/init.d.ts +29 -0
- package/dist/core/types/init.d.ts.map +1 -0
- package/dist/core/types/init.js +2 -0
- package/dist/core/types/init.js.map +1 -0
- package/dist/core/types/workspace.d.ts +78 -0
- package/dist/core/types/workspace.d.ts.map +1 -0
- package/dist/core/types/workspace.js +2 -0
- package/dist/core/types/workspace.js.map +1 -0
- package/dist/mcp/helpers.d.ts +131 -19
- package/dist/mcp/helpers.d.ts.map +1 -1
- package/dist/mcp/helpers.js +271 -141
- package/dist/mcp/helpers.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +49 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/code-graph.d.ts +3 -0
- package/dist/mcp/tools/code-graph.d.ts.map +1 -0
- package/dist/mcp/tools/code-graph.js +330 -0
- package/dist/mcp/tools/code-graph.js.map +1 -0
- package/dist/mcp/tools/code-hybrid.d.ts +3 -0
- package/dist/mcp/tools/code-hybrid.d.ts.map +1 -0
- package/dist/mcp/tools/code-hybrid.js +142 -0
- package/dist/mcp/tools/code-hybrid.js.map +1 -0
- package/dist/mcp/tools/code-search.d.ts +3 -0
- package/dist/mcp/tools/code-search.d.ts.map +1 -0
- package/dist/mcp/tools/code-search.js +95 -0
- package/dist/mcp/tools/code-search.js.map +1 -0
- package/dist/mcp/tools/database.d.ts.map +1 -1
- package/dist/mcp/tools/database.js +86 -97
- package/dist/mcp/tools/database.js.map +1 -1
- package/dist/mcp/tools/estimate.d.ts.map +1 -1
- package/dist/mcp/tools/estimate.js +106 -82
- package/dist/mcp/tools/estimate.js.map +1 -1
- package/dist/mcp/tools/graph.d.ts.map +1 -1
- package/dist/mcp/tools/graph.js +142 -157
- package/dist/mcp/tools/graph.js.map +1 -1
- package/dist/mcp/tools/issue.d.ts.map +1 -1
- package/dist/mcp/tools/issue.js +172 -172
- package/dist/mcp/tools/issue.js.map +1 -1
- package/dist/mcp/tools/push.d.ts.map +1 -1
- package/dist/mcp/tools/push.js +70 -100
- package/dist/mcp/tools/push.js.map +1 -1
- package/dist/mcp/tools/query.d.ts.map +1 -1
- package/dist/mcp/tools/query.js +187 -246
- package/dist/mcp/tools/query.js.map +1 -1
- package/dist/mcp/tools/search.d.ts.map +1 -1
- package/dist/mcp/tools/search.js +25 -22
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/mcp/tools/workspace.d.ts.map +1 -1
- package/dist/mcp/tools/workspace.js +120 -73
- package/dist/mcp/tools/workspace.js.map +1 -1
- package/dist/use-cases/build-graph.d.ts +1 -1
- package/dist/use-cases/build-graph.d.ts.map +1 -1
- package/dist/use-cases/build-graph.js +63 -50
- package/dist/use-cases/build-graph.js.map +1 -1
- package/dist/use-cases/code-search.d.ts +60 -0
- package/dist/use-cases/code-search.d.ts.map +1 -0
- package/dist/use-cases/code-search.js +163 -0
- package/dist/use-cases/code-search.js.map +1 -0
- package/dist/use-cases/embed.d.ts +1 -1
- package/dist/use-cases/embed.d.ts.map +1 -1
- package/dist/use-cases/embed.js +5 -5
- package/dist/use-cases/embed.js.map +1 -1
- package/dist/use-cases/index-code.d.ts +24 -0
- package/dist/use-cases/index-code.d.ts.map +1 -0
- package/dist/use-cases/index-code.js +43 -0
- package/dist/use-cases/index-code.js.map +1 -0
- package/dist/use-cases/init/bootstrap-hub.d.ts +55 -0
- package/dist/use-cases/init/bootstrap-hub.d.ts.map +1 -0
- package/dist/use-cases/init/bootstrap-hub.js +116 -0
- package/dist/use-cases/init/bootstrap-hub.js.map +1 -0
- package/dist/use-cases/init/check-dims-conflict.d.ts +33 -0
- package/dist/use-cases/init/check-dims-conflict.d.ts.map +1 -0
- package/dist/use-cases/init/check-dims-conflict.js +39 -0
- package/dist/use-cases/init/check-dims-conflict.js.map +1 -0
- package/dist/use-cases/init/check-hub-exists.d.ts +23 -0
- package/dist/use-cases/init/check-hub-exists.d.ts.map +1 -0
- package/dist/use-cases/init/check-hub-exists.js +39 -0
- package/dist/use-cases/init/check-hub-exists.js.map +1 -0
- package/dist/use-cases/init/check-ports.d.ts +18 -0
- package/dist/use-cases/init/check-ports.d.ts.map +1 -0
- package/dist/use-cases/init/check-ports.js +25 -0
- package/dist/use-cases/init/check-ports.js.map +1 -0
- package/dist/use-cases/init/check-versions.d.ts +37 -0
- package/dist/use-cases/init/check-versions.d.ts.map +1 -0
- package/dist/use-cases/init/check-versions.js +50 -0
- package/dist/use-cases/init/check-versions.js.map +1 -0
- package/dist/use-cases/init/clear-stale-active.d.ts +20 -0
- package/dist/use-cases/init/clear-stale-active.d.ts.map +1 -0
- package/dist/use-cases/init/clear-stale-active.js +26 -0
- package/dist/use-cases/init/clear-stale-active.js.map +1 -0
- package/dist/use-cases/init/ensure-embedding-model.d.ts +20 -0
- package/dist/use-cases/init/ensure-embedding-model.d.ts.map +1 -0
- package/dist/use-cases/init/ensure-embedding-model.js +24 -0
- package/dist/use-cases/init/ensure-embedding-model.js.map +1 -0
- package/dist/use-cases/init/ensure-ollama-running.d.ts +19 -0
- package/dist/use-cases/init/ensure-ollama-running.d.ts.map +1 -0
- package/dist/use-cases/init/ensure-ollama-running.js +24 -0
- package/dist/use-cases/init/ensure-ollama-running.js.map +1 -0
- package/dist/use-cases/init/health-check-existing-llm.d.ts +25 -0
- package/dist/use-cases/init/health-check-existing-llm.d.ts.map +1 -0
- package/dist/use-cases/init/health-check-existing-llm.js +42 -0
- package/dist/use-cases/init/health-check-existing-llm.js.map +1 -0
- package/dist/use-cases/init/install-ollama.d.ts +27 -0
- package/dist/use-cases/init/install-ollama.d.ts.map +1 -0
- package/dist/use-cases/init/install-ollama.js +51 -0
- package/dist/use-cases/init/install-ollama.js.map +1 -0
- package/dist/use-cases/init/probe-llm.d.ts +32 -0
- package/dist/use-cases/init/probe-llm.d.ts.map +1 -0
- package/dist/use-cases/init/probe-llm.js +42 -0
- package/dist/use-cases/init/probe-llm.js.map +1 -0
- package/dist/use-cases/init/resolve-hub-ports.d.ts +46 -0
- package/dist/use-cases/init/resolve-hub-ports.d.ts.map +1 -0
- package/dist/use-cases/init/resolve-hub-ports.js +77 -0
- package/dist/use-cases/init/resolve-hub-ports.js.map +1 -0
- package/dist/use-cases/init/validate-workspace-name.d.ts +26 -0
- package/dist/use-cases/init/validate-workspace-name.d.ts.map +1 -0
- package/dist/use-cases/init/validate-workspace-name.js +39 -0
- package/dist/use-cases/init/validate-workspace-name.js.map +1 -0
- package/dist/use-cases/init/wait-for-docker.d.ts +16 -0
- package/dist/use-cases/init/wait-for-docker.d.ts.map +1 -0
- package/dist/use-cases/init/wait-for-docker.js +16 -0
- package/dist/use-cases/init/wait-for-docker.js.map +1 -0
- package/dist/use-cases/init/write-config-env.d.ts +32 -0
- package/dist/use-cases/init/write-config-env.d.ts.map +1 -0
- package/dist/use-cases/init/write-config-env.js +118 -0
- package/dist/use-cases/init/write-config-env.js.map +1 -0
- package/dist/use-cases/move-task.js +2 -2
- package/dist/use-cases/move-task.js.map +1 -1
- package/dist/use-cases/pull-db.d.ts +1 -1
- package/dist/use-cases/pull-db.d.ts.map +1 -1
- package/dist/use-cases/pull-db.js +3 -3
- package/dist/use-cases/pull-db.js.map +1 -1
- package/dist/use-cases/pull-git.d.ts +1 -1
- package/dist/use-cases/pull-git.d.ts.map +1 -1
- package/dist/use-cases/pull-git.js +5 -5
- package/dist/use-cases/pull-git.js.map +1 -1
- package/dist/use-cases/pull-github.d.ts +1 -1
- package/dist/use-cases/pull-github.d.ts.map +1 -1
- package/dist/use-cases/pull-github.js +6 -6
- package/dist/use-cases/pull-github.js.map +1 -1
- package/dist/use-cases/pull.d.ts +1 -1
- package/dist/use-cases/pull.d.ts.map +1 -1
- package/dist/use-cases/pull.js +6 -6
- package/dist/use-cases/pull.js.map +1 -1
- package/dist/use-cases/push.d.ts +2 -2
- package/dist/use-cases/push.d.ts.map +1 -1
- package/dist/use-cases/push.js +8 -8
- package/dist/use-cases/push.js.map +1 -1
- package/dist/use-cases/register-code-project.d.ts +29 -0
- package/dist/use-cases/register-code-project.d.ts.map +1 -0
- package/dist/use-cases/register-code-project.js +27 -0
- package/dist/use-cases/register-code-project.js.map +1 -0
- package/dist/use-cases/unregister-code-project.d.ts +11 -0
- package/dist/use-cases/unregister-code-project.d.ts.map +1 -0
- package/dist/use-cases/unregister-code-project.js +19 -0
- package/dist/use-cases/unregister-code-project.js.map +1 -0
- package/dist/use-cases/watch-code.d.ts +33 -0
- package/dist/use-cases/watch-code.d.ts.map +1 -0
- package/dist/use-cases/watch-code.js +52 -0
- package/dist/use-cases/watch-code.js.map +1 -0
- package/dist/workspace/active-workspace.d.ts +26 -0
- package/dist/workspace/active-workspace.d.ts.map +1 -0
- package/dist/workspace/active-workspace.js +69 -0
- package/dist/workspace/active-workspace.js.map +1 -0
- package/dist/workspace/adf.d.ts.map +1 -1
- package/dist/workspace/adf.js +20 -19
- package/dist/workspace/adf.js.map +1 -1
- package/dist/workspace/config.d.ts +11 -0
- package/dist/workspace/config.d.ts.map +1 -1
- package/dist/workspace/config.js +76 -22
- package/dist/workspace/config.js.map +1 -1
- package/dist/workspace/hub-config.d.ts +74 -0
- package/dist/workspace/hub-config.d.ts.map +1 -0
- package/dist/workspace/hub-config.js +164 -0
- package/dist/workspace/hub-config.js.map +1 -0
- package/dist/workspace/registry.d.ts +23 -3
- package/dist/workspace/registry.d.ts.map +1 -1
- package/dist/workspace/registry.js +32 -14
- package/dist/workspace/registry.js.map +1 -1
- package/dist/workspace/resolver.d.ts +20 -18
- package/dist/workspace/resolver.d.ts.map +1 -1
- package/dist/workspace/resolver.js +100 -59
- package/dist/workspace/resolver.js.map +1 -1
- package/package.json +13 -4
- package/templates/code-docker-compose.yml +51 -0
- package/templates/env.example +16 -0
- package/templates/hub-config.env +65 -0
- package/templates/hub-docker-compose.yml +88 -0
- package/templates/migrate-to-hub.sql +90 -0
- package/dist/cli/workspaces.d.ts +0 -3
- package/dist/cli/workspaces.d.ts.map +0 -1
- package/dist/cli/workspaces.js +0 -34
- package/dist/cli/workspaces.js.map +0 -1
package/dist/mcp/tools/issue.js
CHANGED
|
@@ -1,49 +1,51 @@
|
|
|
1
1
|
import { z } from 'zod/v4';
|
|
2
|
-
import { loadWorkspace, createAdapters, textResponse, errorResponse, getErrorMessage, str, } from '../helpers.js';
|
|
2
|
+
import { loadWorkspace, createAdapters, textResponse, errorResponse, workspaceNotFoundResponse, getErrorMessage, str, strOr, hasText, ANNOTATIONS, } from '../helpers.js';
|
|
3
3
|
import { groupReviewsByPr, groupFilesByCommit } from './formatters.js';
|
|
4
|
+
const workspaceIdParam = z.string().optional().describe('Workspace id or name (defaults to active workspace)');
|
|
4
5
|
export function registerIssueTools(server) {
|
|
5
6
|
server.registerTool('get_issue', {
|
|
6
|
-
|
|
7
|
+
title: 'Get issue details',
|
|
8
|
+
description: 'Get full details of an issue by key — fields, comments, changelog. For full cross-source timeline use issue_timeline.',
|
|
7
9
|
inputSchema: {
|
|
10
|
+
workspace_id: workspaceIdParam,
|
|
8
11
|
issue_key: z.string().describe('Issue key (e.g. "PROJ-123")'),
|
|
9
12
|
},
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
annotations: ANNOTATIONS.READ_ONLY,
|
|
14
|
+
}, async ({ workspace_id: workspaceIdInput, issue_key: issueKey }) => {
|
|
15
|
+
const ws = await loadWorkspace(workspaceIdInput);
|
|
12
16
|
if (!ws.ok) {
|
|
13
|
-
return
|
|
17
|
+
return workspaceNotFoundResponse(ws.reason);
|
|
14
18
|
}
|
|
15
|
-
const { storage } = await createAdapters(ws.
|
|
19
|
+
const { storage, workspaceId } = await createAdapters(ws.workspaceId);
|
|
16
20
|
const key = issueKey.toUpperCase();
|
|
17
21
|
try {
|
|
18
|
-
const issueResult = await storage.
|
|
22
|
+
const issueResult = await storage.queryForWorkspace(workspaceId, `SELECT * FROM issues WHERE workspace_id = $1 AND issue_key = $2`, [key]);
|
|
19
23
|
if (issueResult.rows.length === 0) {
|
|
20
|
-
|
|
21
|
-
return errorResponse(`Issue ${issueKey} not found in local database.`);
|
|
24
|
+
return errorResponse(`Issue ${issueKey} not found in workspace ${workspaceId}.`);
|
|
22
25
|
}
|
|
23
26
|
const issue = issueResult.rows[0];
|
|
24
|
-
const commentsResult = await storage.
|
|
25
|
-
const changelogsResult = await storage.
|
|
26
|
-
FROM issue_changelogs WHERE
|
|
27
|
-
await storage.close();
|
|
27
|
+
const commentsResult = await storage.queryForWorkspace(workspaceId, `SELECT author, body, created FROM issue_comments WHERE workspace_id = $1 AND issue_key = $2 ORDER BY created`, [key]);
|
|
28
|
+
const changelogsResult = await storage.queryForWorkspace(workspaceId, `SELECT author, field, from_value, to_value, changed_at
|
|
29
|
+
FROM issue_changelogs WHERE workspace_id = $1 AND issue_key = $2 ORDER BY changed_at DESC LIMIT 20`, [key]);
|
|
28
30
|
const sections = [];
|
|
29
31
|
sections.push(`# ${str(issue.issue_key)}: ${str(issue.summary)}`);
|
|
30
32
|
sections.push('');
|
|
31
|
-
sections.push(`Type: ${
|
|
32
|
-
sections.push(`Assignee: ${
|
|
33
|
-
sections.push(`Created: ${
|
|
33
|
+
sections.push(`Type: ${strOr(issue.issue_type, 'N/A')} | Status: ${strOr(issue.status, 'N/A')} | Priority: ${strOr(issue.priority, 'N/A')}`);
|
|
34
|
+
sections.push(`Assignee: ${strOr(issue.assignee, 'Unassigned')} | Reporter: ${strOr(issue.reporter, 'N/A')}`);
|
|
35
|
+
sections.push(`Created: ${strOr(issue.created, 'N/A')} | Updated: ${strOr(issue.updated, 'N/A')}`);
|
|
34
36
|
if (Array.isArray(issue.labels) && issue.labels.length > 0) {
|
|
35
37
|
sections.push(`Labels: ${issue.labels.join(', ')}`);
|
|
36
38
|
}
|
|
37
39
|
if (Array.isArray(issue.components) && issue.components.length > 0) {
|
|
38
40
|
sections.push(`Components: ${issue.components.join(', ')}`);
|
|
39
41
|
}
|
|
40
|
-
if (issue.parent_key) {
|
|
42
|
+
if (hasText(issue.parent_key)) {
|
|
41
43
|
sections.push(`Parent: ${issue.parent_key}`);
|
|
42
44
|
}
|
|
43
45
|
sections.push('');
|
|
44
46
|
sections.push('## Description');
|
|
45
|
-
sections.push(
|
|
46
|
-
if (issue.custom_fields && Object.keys(issue.custom_fields).length > 0) {
|
|
47
|
+
sections.push(strOr(issue.description, '(no description)'));
|
|
48
|
+
if (issue.custom_fields !== undefined && Object.keys(issue.custom_fields).length > 0) {
|
|
47
49
|
sections.push('');
|
|
48
50
|
sections.push('## Custom Fields');
|
|
49
51
|
for (const [field, value] of Object.entries(issue.custom_fields)) {
|
|
@@ -55,18 +57,18 @@ export function registerIssueTools(server) {
|
|
|
55
57
|
if (commentsResult.rows.length > 0) {
|
|
56
58
|
sections.push('');
|
|
57
59
|
sections.push(`## Comments (${String(commentsResult.rows.length)})`);
|
|
58
|
-
for (const
|
|
59
|
-
const c =
|
|
60
|
+
for (const raw of commentsResult.rows) {
|
|
61
|
+
const c = raw;
|
|
60
62
|
sections.push(`--- ${str(c.author)} (${str(c.created)}) ---`);
|
|
61
|
-
sections.push(
|
|
63
|
+
sections.push(strOr(c.body, '(empty)'));
|
|
62
64
|
sections.push('');
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
67
|
if (changelogsResult.rows.length > 0) {
|
|
66
68
|
sections.push('');
|
|
67
69
|
sections.push(`## Recent Changes (${String(changelogsResult.rows.length)})`);
|
|
68
|
-
for (const
|
|
69
|
-
const ch =
|
|
70
|
+
for (const raw of changelogsResult.rows) {
|
|
71
|
+
const ch = raw;
|
|
70
72
|
sections.push(` ${str(ch.changed_at)}: ${str(ch.author)} changed ${str(ch.field)}: "${str(ch.from_value)}" → "${str(ch.to_value)}"`);
|
|
71
73
|
}
|
|
72
74
|
}
|
|
@@ -77,56 +79,54 @@ export function registerIssueTools(server) {
|
|
|
77
79
|
}
|
|
78
80
|
});
|
|
79
81
|
server.registerTool('issue_stats', {
|
|
80
|
-
|
|
82
|
+
title: 'Issue statistics',
|
|
83
|
+
description: 'Aggregate issue statistics for the active workspace — counts by status, type, project, assignee.',
|
|
81
84
|
inputSchema: {
|
|
82
|
-
|
|
85
|
+
workspace_id: workspaceIdParam,
|
|
86
|
+
project: z.string().optional().describe('Filter by project key'),
|
|
83
87
|
},
|
|
84
|
-
|
|
85
|
-
|
|
88
|
+
annotations: ANNOTATIONS.READ_ONLY,
|
|
89
|
+
}, async ({ workspace_id: workspaceIdInput, project }) => {
|
|
90
|
+
const ws = await loadWorkspace(workspaceIdInput);
|
|
86
91
|
if (!ws.ok) {
|
|
87
|
-
return
|
|
92
|
+
return workspaceNotFoundResponse(ws.reason);
|
|
88
93
|
}
|
|
89
|
-
const { storage } = await createAdapters(ws.
|
|
94
|
+
const { storage, workspaceId } = await createAdapters(ws.workspaceId);
|
|
90
95
|
try {
|
|
91
|
-
const
|
|
92
|
-
const
|
|
96
|
+
const projectClause = hasText(project) ? `AND project_key = $2` : '';
|
|
97
|
+
const params = hasText(project) ? [project.toUpperCase()] : [];
|
|
93
98
|
const [total, byStatus, byType, byProject, byAssignee] = await Promise.all([
|
|
94
|
-
storage.
|
|
95
|
-
storage.
|
|
96
|
-
storage.
|
|
97
|
-
storage.
|
|
98
|
-
storage.
|
|
99
|
+
storage.queryForWorkspace(workspaceId, `SELECT COUNT(*) as count FROM issues WHERE workspace_id = $1 ${projectClause}`, params),
|
|
100
|
+
storage.queryForWorkspace(workspaceId, `SELECT status, COUNT(*) as count FROM issues WHERE workspace_id = $1 ${projectClause} GROUP BY status ORDER BY count DESC`, params),
|
|
101
|
+
storage.queryForWorkspace(workspaceId, `SELECT issue_type, COUNT(*) as count FROM issues WHERE workspace_id = $1 ${projectClause} GROUP BY issue_type ORDER BY count DESC`, params),
|
|
102
|
+
storage.queryForWorkspace(workspaceId, `SELECT project_key, COUNT(*) as count FROM issues WHERE workspace_id = $1 ${projectClause} GROUP BY project_key ORDER BY count DESC`, params),
|
|
103
|
+
storage.queryForWorkspace(workspaceId, `SELECT assignee, COUNT(*) as count FROM issues WHERE workspace_id = $1 ${projectClause} GROUP BY assignee ORDER BY count DESC LIMIT 15`, params),
|
|
99
104
|
]);
|
|
100
|
-
await storage.close();
|
|
101
105
|
const sections = [];
|
|
102
106
|
const totalRow = total.rows[0];
|
|
103
|
-
sections.push(`# Issue Statistics${project ? ` (${project})` : ''}`);
|
|
107
|
+
sections.push(`# Issue Statistics${hasText(project) ? ` (${project})` : ''} — workspace ${workspaceId}`);
|
|
104
108
|
sections.push(`Total issues: ${str(totalRow?.count)}`);
|
|
105
|
-
sections.push('');
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
sections.push(` ${str(r.status) || 'null'}: ${str(r.count)}`);
|
|
109
|
+
sections.push('\n## By Status');
|
|
110
|
+
for (const raw of byStatus.rows) {
|
|
111
|
+
const r = raw;
|
|
112
|
+
sections.push(` ${strOr(r.status, 'null')}: ${str(r.count)}`);
|
|
110
113
|
}
|
|
111
|
-
sections.push('');
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
sections.push(` ${str(r.issue_type) || 'null'}: ${str(r.count)}`);
|
|
114
|
+
sections.push('\n## By Type');
|
|
115
|
+
for (const raw of byType.rows) {
|
|
116
|
+
const r = raw;
|
|
117
|
+
sections.push(` ${strOr(r.issue_type, 'null')}: ${str(r.count)}`);
|
|
116
118
|
}
|
|
117
|
-
if (!project) {
|
|
118
|
-
sections.push('');
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
const r = rawRow;
|
|
119
|
+
if (!hasText(project)) {
|
|
120
|
+
sections.push('\n## By Project');
|
|
121
|
+
for (const raw of byProject.rows) {
|
|
122
|
+
const r = raw;
|
|
122
123
|
sections.push(` ${str(r.project_key)}: ${str(r.count)}`);
|
|
123
124
|
}
|
|
124
125
|
}
|
|
125
|
-
sections.push('');
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
sections.push(` ${str(r.assignee) || 'Unassigned'}: ${str(r.count)}`);
|
|
126
|
+
sections.push('\n## Top Assignees');
|
|
127
|
+
for (const raw of byAssignee.rows) {
|
|
128
|
+
const r = raw;
|
|
129
|
+
sections.push(` ${strOr(r.assignee, 'Unassigned')}: ${str(r.count)}`);
|
|
130
130
|
}
|
|
131
131
|
return textResponse(sections.join('\n'));
|
|
132
132
|
}
|
|
@@ -135,44 +135,42 @@ export function registerIssueTools(server) {
|
|
|
135
135
|
}
|
|
136
136
|
});
|
|
137
137
|
server.registerTool('issue_commits', {
|
|
138
|
-
|
|
138
|
+
title: 'Commits for an issue',
|
|
139
|
+
description: 'Git commits mentioning the issue key. Requires Git sync.',
|
|
139
140
|
inputSchema: {
|
|
141
|
+
workspace_id: workspaceIdParam,
|
|
140
142
|
issue_key: z.string().describe('Issue key (e.g. "PROJ-123")'),
|
|
141
|
-
repo_path: z.string().optional().describe('Filter by
|
|
143
|
+
repo_path: z.string().optional().describe('Filter by repo path substring'),
|
|
142
144
|
},
|
|
143
|
-
|
|
144
|
-
|
|
145
|
+
annotations: ANNOTATIONS.READ_ONLY,
|
|
146
|
+
}, async ({ workspace_id: workspaceIdInput, issue_key: issueKey, repo_path: repoPath }) => {
|
|
147
|
+
const ws = await loadWorkspace(workspaceIdInput);
|
|
145
148
|
if (!ws.ok) {
|
|
146
|
-
return
|
|
149
|
+
return workspaceNotFoundResponse(ws.reason);
|
|
147
150
|
}
|
|
148
|
-
const { storage } = await createAdapters(ws.
|
|
151
|
+
const { storage, workspaceId } = await createAdapters(ws.workspaceId);
|
|
149
152
|
const key = issueKey.toUpperCase();
|
|
150
153
|
try {
|
|
151
|
-
const repoFilter = repoPath ? `AND c.repo_path ILIKE $
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
commitsParams.push(`%${repoPath}%`);
|
|
155
|
-
}
|
|
156
|
-
const commitsResult = await storage.query(`SELECT c.hash, c.message, c.author, c.committed_at, c.repo_path
|
|
154
|
+
const repoFilter = hasText(repoPath) ? `AND c.repo_path ILIKE $3` : '';
|
|
155
|
+
const params = hasText(repoPath) ? [key, `%${repoPath}%`] : [key];
|
|
156
|
+
const commitsResult = await storage.queryForWorkspace(workspaceId, `SELECT c.hash, c.message, c.author, c.committed_at, c.repo_path
|
|
157
157
|
FROM commits c
|
|
158
|
-
JOIN commit_issue_refs r ON
|
|
159
|
-
WHERE r.issue_key = $
|
|
160
|
-
ORDER BY c.committed_at DESC`,
|
|
158
|
+
JOIN commit_issue_refs r ON r.workspace_id = c.workspace_id AND r.commit_hash = c.hash
|
|
159
|
+
WHERE c.workspace_id = $1 AND r.issue_key = $2 ${repoFilter}
|
|
160
|
+
ORDER BY c.committed_at DESC`, params);
|
|
161
161
|
if (commitsResult.rows.length === 0) {
|
|
162
|
-
|
|
163
|
-
return textResponse(`No commits found mentioning ${issueKey}. Make sure you've run "argustack sync git".`);
|
|
162
|
+
return textResponse(`No commits mentioning ${issueKey}. Run "argustack sync git" with this workspace.`);
|
|
164
163
|
}
|
|
165
164
|
const hashes = commitsResult.rows.map((r) => r.hash).filter(Boolean);
|
|
166
|
-
const hashPlaceholders = hashes.map((_, i) => `$${String(i +
|
|
167
|
-
const filesResult = await storage.
|
|
168
|
-
FROM commit_files WHERE commit_hash IN (${hashPlaceholders})`, hashes);
|
|
169
|
-
await storage.close();
|
|
165
|
+
const hashPlaceholders = hashes.map((_, i) => `$${String(i + 2)}`).join(',');
|
|
166
|
+
const filesResult = await storage.queryForWorkspace(workspaceId, `SELECT commit_hash, file_path, status, additions, deletions
|
|
167
|
+
FROM commit_files WHERE workspace_id = $1 AND commit_hash IN (${hashPlaceholders})`, hashes);
|
|
170
168
|
const filesByCommit = groupFilesByCommit(filesResult.rows);
|
|
171
169
|
const sections = [];
|
|
172
170
|
sections.push(`# Commits for ${issueKey} (${String(commitsResult.rows.length)})`);
|
|
173
171
|
sections.push('');
|
|
174
|
-
for (const
|
|
175
|
-
const row =
|
|
172
|
+
for (const raw of commitsResult.rows) {
|
|
173
|
+
const row = raw;
|
|
176
174
|
const shortHash = (row.hash ?? '').substring(0, 7);
|
|
177
175
|
sections.push(`## ${shortHash} — ${str(row.author)} (${str(row.committed_at).substring(0, 10)})`);
|
|
178
176
|
sections.push(str(row.message));
|
|
@@ -192,44 +190,47 @@ export function registerIssueTools(server) {
|
|
|
192
190
|
}
|
|
193
191
|
});
|
|
194
192
|
server.registerTool('issue_prs', {
|
|
195
|
-
|
|
193
|
+
title: 'PRs for an issue',
|
|
194
|
+
description: 'GitHub PRs mentioning the issue key. Requires GitHub sync.',
|
|
196
195
|
inputSchema: {
|
|
196
|
+
workspace_id: workspaceIdParam,
|
|
197
197
|
issue_key: z.string().describe('Issue key (e.g. "PROJ-123")'),
|
|
198
198
|
},
|
|
199
|
-
|
|
200
|
-
|
|
199
|
+
annotations: ANNOTATIONS.READ_ONLY,
|
|
200
|
+
}, async ({ workspace_id: workspaceIdInput, issue_key: issueKey }) => {
|
|
201
|
+
const ws = await loadWorkspace(workspaceIdInput);
|
|
201
202
|
if (!ws.ok) {
|
|
202
|
-
return
|
|
203
|
+
return workspaceNotFoundResponse(ws.reason);
|
|
203
204
|
}
|
|
204
|
-
const { storage } = await createAdapters(ws.
|
|
205
|
+
const { storage, workspaceId } = await createAdapters(ws.workspaceId);
|
|
205
206
|
const key = issueKey.toUpperCase();
|
|
206
207
|
try {
|
|
207
|
-
const prsResult = await storage.
|
|
208
|
+
const prsResult = await storage.queryForWorkspace(workspaceId, `SELECT p.number, p.title, p.state, p.author, p.created_at, p.merged_at,
|
|
208
209
|
p.additions, p.deletions, p.base_ref, p.head_ref, p.repo_full_name
|
|
209
210
|
FROM pull_requests p
|
|
210
|
-
JOIN pr_issue_refs r ON
|
|
211
|
-
|
|
211
|
+
JOIN pr_issue_refs r ON r.workspace_id = p.workspace_id
|
|
212
|
+
AND r.repo_full_name = p.repo_full_name AND r.pr_number = p.number
|
|
213
|
+
WHERE p.workspace_id = $1 AND r.issue_key = $2
|
|
212
214
|
ORDER BY p.created_at DESC`, [key]);
|
|
213
215
|
if (prsResult.rows.length === 0) {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
+
return textResponse(`No PRs mentioning ${issueKey}.\n` +
|
|
217
|
+
'If you expected results, run `argustack sync github` to refresh GitHub sync data.');
|
|
216
218
|
}
|
|
217
219
|
const prNumbers = prsResult.rows.map((r) => r.number);
|
|
218
|
-
const repoFullName = prsResult.rows[0].repo_full_name;
|
|
219
|
-
const reviewPlaceholders = prNumbers.map((_, i) => `$${String(i +
|
|
220
|
-
const reviewsResult = await storage.
|
|
221
|
-
WHERE
|
|
220
|
+
const repoFullName = prsResult.rows[0].repo_full_name ?? '';
|
|
221
|
+
const reviewPlaceholders = prNumbers.map((_, i) => `$${String(i + 3)}`).join(',');
|
|
222
|
+
const reviewsResult = await storage.queryForWorkspace(workspaceId, `SELECT pr_number, reviewer, state, submitted_at FROM pr_reviews
|
|
223
|
+
WHERE workspace_id = $1 AND repo_full_name = $2 AND pr_number IN (${reviewPlaceholders})
|
|
222
224
|
ORDER BY submitted_at`, [repoFullName, ...prNumbers]);
|
|
223
|
-
await storage.close();
|
|
224
225
|
const reviewsByPr = groupReviewsByPr(reviewsResult.rows);
|
|
225
226
|
const sections = [];
|
|
226
227
|
sections.push(`# Pull Requests for ${issueKey} (${String(prsResult.rows.length)})`);
|
|
227
228
|
sections.push('');
|
|
228
|
-
for (const
|
|
229
|
-
const pr =
|
|
229
|
+
for (const raw of prsResult.rows) {
|
|
230
|
+
const pr = raw;
|
|
230
231
|
sections.push(`## #${str(pr.number)} — ${str(pr.title)}`);
|
|
231
232
|
sections.push(`State: ${str(pr.state)} | Author: ${str(pr.author)} | ${str(pr.base_ref)} ← ${str(pr.head_ref)}`);
|
|
232
|
-
sections.push(`+${str(pr.additions)} -${str(pr.deletions)} | Created: ${str(pr.created_at ?? '').substring(0, 10)}${pr.merged_at ? ` | Merged: ${str(pr.merged_at).substring(0, 10)}` : ''}`);
|
|
233
|
+
sections.push(`+${str(pr.additions)} -${str(pr.deletions)} | Created: ${str(pr.created_at ?? '').substring(0, 10)}${hasText(pr.merged_at) ? ` | Merged: ${str(pr.merged_at).substring(0, 10)}` : ''}`);
|
|
233
234
|
const reviews = reviewsByPr.get(pr.number ?? 0) ?? [];
|
|
234
235
|
if (reviews.length > 0) {
|
|
235
236
|
sections.push('Reviews:');
|
|
@@ -246,34 +247,40 @@ export function registerIssueTools(server) {
|
|
|
246
247
|
}
|
|
247
248
|
});
|
|
248
249
|
server.registerTool('issue_timeline', {
|
|
249
|
-
|
|
250
|
+
title: 'Cross-source issue timeline',
|
|
251
|
+
description: 'Cross-source timeline for an issue: changelog + commits + PRs in chronological order.',
|
|
250
252
|
inputSchema: {
|
|
253
|
+
workspace_id: workspaceIdParam,
|
|
251
254
|
issue_key: z.string().describe('Issue key (e.g. "PROJ-123")'),
|
|
252
255
|
},
|
|
253
|
-
|
|
254
|
-
|
|
256
|
+
annotations: ANNOTATIONS.READ_ONLY,
|
|
257
|
+
}, async ({ workspace_id: workspaceIdInput, issue_key: issueKey }) => {
|
|
258
|
+
const ws = await loadWorkspace(workspaceIdInput);
|
|
255
259
|
if (!ws.ok) {
|
|
256
|
-
return
|
|
260
|
+
return workspaceNotFoundResponse(ws.reason);
|
|
257
261
|
}
|
|
258
|
-
const { storage } = await createAdapters(ws.
|
|
262
|
+
const { storage, workspaceId } = await createAdapters(ws.workspaceId);
|
|
259
263
|
const key = issueKey.toUpperCase();
|
|
260
264
|
try {
|
|
261
265
|
const [issueResult, changelogsResult, commitsResult, prsResult, commitFilesResult] = await Promise.all([
|
|
262
|
-
storage.
|
|
263
|
-
|
|
264
|
-
storage.
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
266
|
+
storage.queryForWorkspace(workspaceId, `SELECT issue_key, summary, status, issue_type, assignee, reporter, created, updated, resolved
|
|
267
|
+
FROM issues WHERE workspace_id = $1 AND issue_key = $2`, [key]),
|
|
268
|
+
storage.queryForWorkspace(workspaceId, `SELECT author, field, from_value, to_value, changed_at FROM issue_changelogs
|
|
269
|
+
WHERE workspace_id = $1 AND issue_key = $2 ORDER BY changed_at`, [key]),
|
|
270
|
+
storage.queryForWorkspace(workspaceId, `SELECT c.hash, c.message, c.author, c.email, c.committed_at
|
|
271
|
+
FROM commits c JOIN commit_issue_refs r ON r.workspace_id = c.workspace_id AND r.commit_hash = c.hash
|
|
272
|
+
WHERE c.workspace_id = $1 AND r.issue_key = $2 ORDER BY c.committed_at`, [key]),
|
|
273
|
+
storage.queryForWorkspace(workspaceId, `SELECT p.number, p.title, p.state, p.author, p.created_at, p.merged_at, p.base_ref,
|
|
268
274
|
p.additions, p.deletions, p.repo_full_name
|
|
269
|
-
FROM pull_requests p JOIN pr_issue_refs r ON
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
275
|
+
FROM pull_requests p JOIN pr_issue_refs r ON r.workspace_id = p.workspace_id
|
|
276
|
+
AND r.repo_full_name = p.repo_full_name AND r.pr_number = p.number
|
|
277
|
+
WHERE p.workspace_id = $1 AND r.issue_key = $2 ORDER BY p.created_at`, [key]),
|
|
278
|
+
storage.queryForWorkspace(workspaceId, `SELECT cf.commit_hash, cf.file_path, cf.status, cf.additions, cf.deletions
|
|
279
|
+
FROM commit_files cf
|
|
280
|
+
JOIN commit_issue_refs r ON r.workspace_id = cf.workspace_id AND r.commit_hash = cf.commit_hash
|
|
281
|
+
WHERE cf.workspace_id = $1 AND r.issue_key = $2`, [key]),
|
|
274
282
|
]);
|
|
275
283
|
if (issueResult.rows.length === 0) {
|
|
276
|
-
await storage.close();
|
|
277
284
|
return textResponse(`Issue ${key} not found.`);
|
|
278
285
|
}
|
|
279
286
|
const issue = issueResult.rows[0];
|
|
@@ -281,62 +288,56 @@ export function registerIssueTools(server) {
|
|
|
281
288
|
let reviewsByPr = new Map();
|
|
282
289
|
if (prRows.length > 0) {
|
|
283
290
|
const prNumbers = prRows.map((pr) => pr.number);
|
|
284
|
-
const repoFullName = prRows[0]?.repo_full_name;
|
|
285
|
-
const reviewPlaceholders = prNumbers.map((_, i) => `$${String(i +
|
|
286
|
-
const reviewsResult = await storage.
|
|
287
|
-
WHERE
|
|
291
|
+
const repoFullName = prRows[0]?.repo_full_name ?? '';
|
|
292
|
+
const reviewPlaceholders = prNumbers.map((_, i) => `$${String(i + 3)}`).join(',');
|
|
293
|
+
const reviewsResult = await storage.queryForWorkspace(workspaceId, `SELECT pr_number, reviewer, state, submitted_at FROM pr_reviews
|
|
294
|
+
WHERE workspace_id = $1 AND repo_full_name = $2 AND pr_number IN (${reviewPlaceholders})
|
|
288
295
|
ORDER BY submitted_at`, [repoFullName, ...prNumbers]);
|
|
289
296
|
reviewsByPr = groupReviewsByPr(reviewsResult.rows);
|
|
290
297
|
}
|
|
291
|
-
await storage.close();
|
|
292
298
|
const filesByCommit = groupFilesByCommit(commitFilesResult.rows);
|
|
293
299
|
const events = [];
|
|
294
|
-
if (issue.created) {
|
|
300
|
+
if (hasText(issue.created)) {
|
|
295
301
|
events.push({ date: str(issue.created), type: 'created', text: 'Issue created' });
|
|
296
302
|
}
|
|
297
303
|
for (const raw of changelogsResult.rows) {
|
|
298
304
|
const ch = raw;
|
|
299
|
-
if (ch.changed_at) {
|
|
305
|
+
if (hasText(ch.changed_at)) {
|
|
300
306
|
events.push({
|
|
301
|
-
date: str(ch.changed_at),
|
|
302
|
-
type: 'changelog',
|
|
307
|
+
date: str(ch.changed_at), type: 'changelog',
|
|
303
308
|
text: `${str(ch.author)} changed ${str(ch.field)}: "${str(ch.from_value)}" → "${str(ch.to_value)}"`,
|
|
304
309
|
});
|
|
305
310
|
}
|
|
306
311
|
}
|
|
307
312
|
for (const raw of commitsResult.rows) {
|
|
308
313
|
const c = raw;
|
|
309
|
-
if (c.committed_at) {
|
|
314
|
+
if (hasText(c.committed_at)) {
|
|
310
315
|
const firstLine = (c.message ?? '').split('\n')[0];
|
|
311
316
|
events.push({
|
|
312
|
-
date: str(c.committed_at),
|
|
313
|
-
type: 'commit',
|
|
317
|
+
date: str(c.committed_at), type: 'commit',
|
|
314
318
|
text: `Commit ${c.hash.substring(0, 7)} — "${firstLine}" (${str(c.author)})`,
|
|
315
319
|
});
|
|
316
320
|
}
|
|
317
321
|
}
|
|
318
322
|
for (const pr of prRows) {
|
|
319
|
-
if (pr.created_at) {
|
|
323
|
+
if (hasText(pr.created_at)) {
|
|
320
324
|
events.push({
|
|
321
|
-
date: str(pr.created_at),
|
|
322
|
-
type: 'pr_opened',
|
|
325
|
+
date: str(pr.created_at), type: 'pr_opened',
|
|
323
326
|
text: `PR #${String(pr.number)} opened — "${str(pr.title)}" (${str(pr.author)})`,
|
|
324
327
|
});
|
|
325
328
|
}
|
|
326
329
|
const reviews = reviewsByPr.get(pr.number) ?? [];
|
|
327
330
|
for (const r of reviews) {
|
|
328
|
-
if (r.submitted_at) {
|
|
331
|
+
if (hasText(r.submitted_at)) {
|
|
329
332
|
events.push({
|
|
330
|
-
date: str(r.submitted_at),
|
|
331
|
-
type: 'pr_reviewed',
|
|
333
|
+
date: str(r.submitted_at), type: 'pr_reviewed',
|
|
332
334
|
text: `PR #${String(pr.number)} reviewed — ${str(r.state)} (${str(r.reviewer)})`,
|
|
333
335
|
});
|
|
334
336
|
}
|
|
335
337
|
}
|
|
336
|
-
if (pr.merged_at) {
|
|
338
|
+
if (hasText(pr.merged_at)) {
|
|
337
339
|
events.push({
|
|
338
|
-
date: str(pr.merged_at),
|
|
339
|
-
type: 'pr_merged',
|
|
340
|
+
date: str(pr.merged_at), type: 'pr_merged',
|
|
340
341
|
text: `PR #${String(pr.number)} merged into ${str(pr.base_ref)}`,
|
|
341
342
|
});
|
|
342
343
|
}
|
|
@@ -346,7 +347,7 @@ export function registerIssueTools(server) {
|
|
|
346
347
|
sections.push(`=== ISSUE: ${key} ===`);
|
|
347
348
|
sections.push(`Summary: ${str(issue.summary)}`);
|
|
348
349
|
sections.push(`Status: ${str(issue.status)} | Type: ${str(issue.issue_type)} | Assignee: ${str(issue.assignee)}`);
|
|
349
|
-
sections.push(`Created: ${str(issue.created ?? '').substring(0, 10)} | Resolved: ${str(issue.resolved ?? '').substring(0, 10)
|
|
350
|
+
sections.push(`Created: ${str(issue.created ?? '').substring(0, 10)} | Resolved: ${strOr(str(issue.resolved ?? '').substring(0, 10), 'n/a')}`);
|
|
350
351
|
sections.push('');
|
|
351
352
|
sections.push(`--- TIMELINE (${String(events.length)} events) ---`);
|
|
352
353
|
for (const ev of events) {
|
|
@@ -382,70 +383,69 @@ export function registerIssueTools(server) {
|
|
|
382
383
|
}
|
|
383
384
|
});
|
|
384
385
|
server.registerTool('commit_stats', {
|
|
385
|
-
|
|
386
|
+
title: 'Git commit statistics',
|
|
387
|
+
description: 'Aggregate Git commit statistics for the active workspace.',
|
|
386
388
|
inputSchema: {
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
389
|
+
workspace_id: workspaceIdParam,
|
|
390
|
+
since: z.string().optional(),
|
|
391
|
+
author: z.string().optional(),
|
|
392
|
+
repo_path: z.string().optional(),
|
|
390
393
|
},
|
|
391
|
-
|
|
392
|
-
|
|
394
|
+
annotations: ANNOTATIONS.READ_ONLY,
|
|
395
|
+
}, async ({ workspace_id: workspaceIdInput, since, author, repo_path: repoPath }) => {
|
|
396
|
+
const ws = await loadWorkspace(workspaceIdInput);
|
|
393
397
|
if (!ws.ok) {
|
|
394
|
-
return
|
|
398
|
+
return workspaceNotFoundResponse(ws.reason);
|
|
395
399
|
}
|
|
396
|
-
const { storage } = await createAdapters(ws.
|
|
400
|
+
const { storage, workspaceId } = await createAdapters(ws.workspaceId);
|
|
397
401
|
try {
|
|
398
|
-
const conditions = [];
|
|
399
|
-
const joinConditions = [];
|
|
402
|
+
const conditions = ['workspace_id = $1'];
|
|
403
|
+
const joinConditions = ['c.workspace_id = $1'];
|
|
400
404
|
const params = [];
|
|
401
|
-
let paramIdx =
|
|
402
|
-
if (since) {
|
|
405
|
+
let paramIdx = 2;
|
|
406
|
+
if (hasText(since)) {
|
|
403
407
|
conditions.push(`committed_at >= $${String(paramIdx)}`);
|
|
404
408
|
joinConditions.push(`c.committed_at >= $${String(paramIdx)}`);
|
|
405
409
|
params.push(since);
|
|
406
410
|
paramIdx++;
|
|
407
411
|
}
|
|
408
|
-
if (author) {
|
|
412
|
+
if (hasText(author)) {
|
|
409
413
|
conditions.push(`author ILIKE $${String(paramIdx)}`);
|
|
410
414
|
joinConditions.push(`c.author ILIKE $${String(paramIdx)}`);
|
|
411
415
|
params.push(`%${author}%`);
|
|
412
416
|
paramIdx++;
|
|
413
417
|
}
|
|
414
|
-
if (repoPath) {
|
|
418
|
+
if (hasText(repoPath)) {
|
|
415
419
|
conditions.push(`repo_path ILIKE $${String(paramIdx)}`);
|
|
416
420
|
joinConditions.push(`c.repo_path ILIKE $${String(paramIdx)}`);
|
|
417
421
|
params.push(`%${repoPath}%`);
|
|
418
422
|
paramIdx++;
|
|
419
423
|
}
|
|
420
|
-
const where =
|
|
421
|
-
const joinWhere =
|
|
424
|
+
const where = `WHERE ${conditions.join(' AND ')}`;
|
|
425
|
+
const joinWhere = `WHERE ${joinConditions.join(' AND ')}`;
|
|
422
426
|
const [total, byAuthor, hotFiles, issueRefCount] = await Promise.all([
|
|
423
|
-
storage.
|
|
424
|
-
storage.
|
|
425
|
-
storage.
|
|
426
|
-
FROM commit_files cf
|
|
427
|
-
JOIN commits c ON cf.commit_hash = c.hash
|
|
427
|
+
storage.queryForWorkspace(workspaceId, `SELECT COUNT(*) as count FROM commits ${where}`, params),
|
|
428
|
+
storage.queryForWorkspace(workspaceId, `SELECT author, COUNT(*) as count FROM commits ${where} GROUP BY author ORDER BY count DESC LIMIT 15`, params),
|
|
429
|
+
storage.queryForWorkspace(workspaceId, `SELECT cf.file_path, COUNT(*) as changes
|
|
430
|
+
FROM commit_files cf JOIN commits c ON c.workspace_id = cf.workspace_id AND c.hash = cf.commit_hash
|
|
428
431
|
${joinWhere}
|
|
429
432
|
GROUP BY cf.file_path ORDER BY changes DESC LIMIT 15`, params),
|
|
430
|
-
storage.
|
|
433
|
+
storage.queryForWorkspace(workspaceId, `SELECT COUNT(DISTINCT issue_key) as count FROM commit_issue_refs WHERE workspace_id = $1`, []),
|
|
431
434
|
]);
|
|
432
|
-
await storage.close();
|
|
433
435
|
const sections = [];
|
|
434
436
|
const totalRow = total.rows[0];
|
|
435
437
|
const refsRow = issueRefCount.rows[0];
|
|
436
|
-
sections.push(`# Git Statistics${since ? ` (since ${since})` : ''}${author ? ` (author: ${author})` : ''}`);
|
|
438
|
+
sections.push(`# Git Statistics${hasText(since) ? ` (since ${since})` : ''}${hasText(author) ? ` (author: ${author})` : ''} — workspace ${workspaceId}`);
|
|
437
439
|
sections.push(`Total commits: ${str(totalRow?.count)}`);
|
|
438
440
|
sections.push(`Linked issue keys: ${str(refsRow?.count)}`);
|
|
439
|
-
sections.push('');
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
sections.push(` ${str(r.author) || 'unknown'}: ${str(r.count)}`);
|
|
441
|
+
sections.push('\n## Top Authors');
|
|
442
|
+
for (const raw of byAuthor.rows) {
|
|
443
|
+
const r = raw;
|
|
444
|
+
sections.push(` ${strOr(r.author, 'unknown')}: ${str(r.count)}`);
|
|
444
445
|
}
|
|
445
|
-
sections.push('');
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
const r = rawRow;
|
|
446
|
+
sections.push('\n## Most Changed Files');
|
|
447
|
+
for (const raw of hotFiles.rows) {
|
|
448
|
+
const r = raw;
|
|
449
449
|
sections.push(` ${str(r.file_path)}: ${str(r.changes)} changes`);
|
|
450
450
|
}
|
|
451
451
|
return textResponse(sections.join('\n'));
|