@noyrax/5d-database-plugin 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/ADR_VORSCHLAEGE.md +247 -0
- package/CHROMADB_SETUP.md +69 -0
- package/IMPROVEMENT_ROADMAP.md +435 -0
- package/INSTALLATION_READINESS.md +150 -0
- package/KNOWN_ISSUES.md +210 -0
- package/LICENSE +21 -0
- package/MCP_SERVER_SETUP.md +359 -0
- package/MCP_SERVER_TEST_REPORT.md +206 -0
- package/NOYRAX_INTEGRATION.md +224 -0
- package/QUICK_START.md +316 -0
- package/README.md +240 -0
- package/SETUP_NEW_PROJECT.md +260 -0
- package/SYSTEM_ANALYSIS_REPORT.md +341 -0
- package/out/api/adr-api.d.ts +22 -0
- package/out/api/adr-api.d.ts.map +1 -0
- package/out/api/adr-api.js +38 -0
- package/out/api/adr-api.js.map +1 -0
- package/out/api/bootstrap-api.d.ts +43 -0
- package/out/api/bootstrap-api.d.ts.map +1 -0
- package/out/api/bootstrap-api.js +88 -0
- package/out/api/bootstrap-api.js.map +1 -0
- package/out/api/change-api.d.ts +30 -0
- package/out/api/change-api.d.ts.map +1 -0
- package/out/api/change-api.js +54 -0
- package/out/api/change-api.js.map +1 -0
- package/out/api/context-builder.d.ts +81 -0
- package/out/api/context-builder.d.ts.map +1 -0
- package/out/api/context-builder.js +288 -0
- package/out/api/context-builder.js.map +1 -0
- package/out/api/cross-dimension-api.d.ts +43 -0
- package/out/api/cross-dimension-api.d.ts.map +1 -0
- package/out/api/cross-dimension-api.js +55 -0
- package/out/api/cross-dimension-api.js.map +1 -0
- package/out/api/dependency-api.d.ts +26 -0
- package/out/api/dependency-api.d.ts.map +1 -0
- package/out/api/dependency-api.js +46 -0
- package/out/api/dependency-api.js.map +1 -0
- package/out/api/learning-path-api.d.ts +49 -0
- package/out/api/learning-path-api.d.ts.map +1 -0
- package/out/api/learning-path-api.js +174 -0
- package/out/api/learning-path-api.js.map +1 -0
- package/out/api/module-api.d.ts +26 -0
- package/out/api/module-api.d.ts.map +1 -0
- package/out/api/module-api.js +46 -0
- package/out/api/module-api.js.map +1 -0
- package/out/api/search-api.d.ts +64 -0
- package/out/api/search-api.d.ts.map +1 -0
- package/out/api/search-api.js +235 -0
- package/out/api/search-api.js.map +1 -0
- package/out/api/self-explanation-api.d.ts +71 -0
- package/out/api/self-explanation-api.d.ts.map +1 -0
- package/out/api/self-explanation-api.js +153 -0
- package/out/api/self-explanation-api.js.map +1 -0
- package/out/api/semantic-search-api.d.ts +64 -0
- package/out/api/semantic-search-api.d.ts.map +1 -0
- package/out/api/semantic-search-api.js +205 -0
- package/out/api/semantic-search-api.js.map +1 -0
- package/out/api/symbol-api.d.ts +22 -0
- package/out/api/symbol-api.d.ts.map +1 -0
- package/out/api/symbol-api.js +38 -0
- package/out/api/symbol-api.js.map +1 -0
- package/out/api/vector-api.d.ts +26 -0
- package/out/api/vector-api.d.ts.map +1 -0
- package/out/api/vector-api.js +49 -0
- package/out/api/vector-api.js.map +1 -0
- package/out/cli/embedding-cli.d.ts +3 -0
- package/out/cli/embedding-cli.d.ts.map +1 -0
- package/out/cli/embedding-cli.js +151 -0
- package/out/cli/embedding-cli.js.map +1 -0
- package/out/cli/ingest-cli.d.ts +3 -0
- package/out/cli/ingest-cli.d.ts.map +1 -0
- package/out/cli/ingest-cli.js +145 -0
- package/out/cli/ingest-cli.js.map +1 -0
- package/out/cli/mcp-server-cli.d.ts +3 -0
- package/out/cli/mcp-server-cli.d.ts.map +1 -0
- package/out/cli/mcp-server-cli.js +159 -0
- package/out/cli/mcp-server-cli.js.map +1 -0
- package/out/cli/query-cli.d.ts +3 -0
- package/out/cli/query-cli.d.ts.map +1 -0
- package/out/cli/query-cli.js +217 -0
- package/out/cli/query-cli.js.map +1 -0
- package/out/cli/semantic-search-cli.d.ts +3 -0
- package/out/cli/semantic-search-cli.d.ts.map +1 -0
- package/out/cli/semantic-search-cli.js +196 -0
- package/out/cli/semantic-search-cli.js.map +1 -0
- package/out/cli/test-chromadb.d.ts +3 -0
- package/out/cli/test-chromadb.d.ts.map +1 -0
- package/out/cli/test-chromadb.js +204 -0
- package/out/cli/test-chromadb.js.map +1 -0
- package/out/cli/test-v-dimension.d.ts +3 -0
- package/out/cli/test-v-dimension.d.ts.map +1 -0
- package/out/cli/test-v-dimension.js +330 -0
- package/out/cli/test-v-dimension.js.map +1 -0
- package/out/cli/tool-cli.d.ts +3 -0
- package/out/cli/tool-cli.d.ts.map +1 -0
- package/out/cli/tool-cli.js +237 -0
- package/out/cli/tool-cli.js.map +1 -0
- package/out/cli/verify-openai-key.d.ts +3 -0
- package/out/cli/verify-openai-key.d.ts.map +1 -0
- package/out/cli/verify-openai-key.js +141 -0
- package/out/cli/verify-openai-key.js.map +1 -0
- package/out/cli/verify-vss-status.d.ts +3 -0
- package/out/cli/verify-vss-status.d.ts.map +1 -0
- package/out/cli/verify-vss-status.js +185 -0
- package/out/cli/verify-vss-status.js.map +1 -0
- package/out/core/chromadb-vector-database.d.ts +52 -0
- package/out/core/chromadb-vector-database.d.ts.map +1 -0
- package/out/core/chromadb-vector-database.js +276 -0
- package/out/core/chromadb-vector-database.js.map +1 -0
- package/out/core/docs-path-resolver.d.ts +43 -0
- package/out/core/docs-path-resolver.d.ts.map +1 -0
- package/out/core/docs-path-resolver.js +137 -0
- package/out/core/docs-path-resolver.js.map +1 -0
- package/out/core/id-mapper.d.ts +68 -0
- package/out/core/id-mapper.d.ts.map +1 -0
- package/out/core/id-mapper.js +132 -0
- package/out/core/id-mapper.js.map +1 -0
- package/out/core/migration-manager.d.ts +75 -0
- package/out/core/migration-manager.d.ts.map +1 -0
- package/out/core/migration-manager.js +212 -0
- package/out/core/migration-manager.js.map +1 -0
- package/out/core/multi-db-manager.d.ts +84 -0
- package/out/core/multi-db-manager.d.ts.map +1 -0
- package/out/core/multi-db-manager.js +206 -0
- package/out/core/multi-db-manager.js.map +1 -0
- package/out/core/transaction-manager.d.ts +69 -0
- package/out/core/transaction-manager.d.ts.map +1 -0
- package/out/core/transaction-manager.js +138 -0
- package/out/core/transaction-manager.js.map +1 -0
- package/out/core/vector-database-factory.d.ts +25 -0
- package/out/core/vector-database-factory.d.ts.map +1 -0
- package/out/core/vector-database-factory.js +82 -0
- package/out/core/vector-database-factory.js.map +1 -0
- package/out/core/vector-database-interface.d.ts +50 -0
- package/out/core/vector-database-interface.d.ts.map +1 -0
- package/out/core/vector-database-interface.js +3 -0
- package/out/core/vector-database-interface.js.map +1 -0
- package/out/core/vss-loader.d.ts +29 -0
- package/out/core/vss-loader.d.ts.map +1 -0
- package/out/core/vss-loader.js +150 -0
- package/out/core/vss-loader.js.map +1 -0
- package/out/core/vss-manager.d.ts +81 -0
- package/out/core/vss-manager.d.ts.map +1 -0
- package/out/core/vss-manager.js +323 -0
- package/out/core/vss-manager.js.map +1 -0
- package/out/core/vss-vector-database.d.ts +71 -0
- package/out/core/vss-vector-database.d.ts.map +1 -0
- package/out/core/vss-vector-database.js +284 -0
- package/out/core/vss-vector-database.js.map +1 -0
- package/out/embedding/embedding-generator.d.ts +45 -0
- package/out/embedding/embedding-generator.d.ts.map +1 -0
- package/out/embedding/embedding-generator.js +143 -0
- package/out/embedding/embedding-generator.js.map +1 -0
- package/out/embedding/embedding-pipeline.d.ts +42 -0
- package/out/embedding/embedding-pipeline.d.ts.map +1 -0
- package/out/embedding/embedding-pipeline.js +290 -0
- package/out/embedding/embedding-pipeline.js.map +1 -0
- package/out/extension.d.ts +10 -0
- package/out/extension.d.ts.map +1 -0
- package/out/extension.js +164 -0
- package/out/extension.js.map +1 -0
- package/out/ingestors/adr-ingestor.d.ts +41 -0
- package/out/ingestors/adr-ingestor.d.ts.map +1 -0
- package/out/ingestors/adr-ingestor.js +329 -0
- package/out/ingestors/adr-ingestor.js.map +1 -0
- package/out/ingestors/base-ingestor.d.ts +30 -0
- package/out/ingestors/base-ingestor.d.ts.map +1 -0
- package/out/ingestors/base-ingestor.js +3 -0
- package/out/ingestors/base-ingestor.js.map +1 -0
- package/out/ingestors/change-ingestor.d.ts +36 -0
- package/out/ingestors/change-ingestor.d.ts.map +1 -0
- package/out/ingestors/change-ingestor.js +216 -0
- package/out/ingestors/change-ingestor.js.map +1 -0
- package/out/ingestors/dependency-ingestor.d.ts +32 -0
- package/out/ingestors/dependency-ingestor.d.ts.map +1 -0
- package/out/ingestors/dependency-ingestor.js +194 -0
- package/out/ingestors/dependency-ingestor.js.map +1 -0
- package/out/ingestors/module-ingestor.d.ts +27 -0
- package/out/ingestors/module-ingestor.d.ts.map +1 -0
- package/out/ingestors/module-ingestor.js +137 -0
- package/out/ingestors/module-ingestor.js.map +1 -0
- package/out/ingestors/symbol-ingestor.d.ts +26 -0
- package/out/ingestors/symbol-ingestor.d.ts.map +1 -0
- package/out/ingestors/symbol-ingestor.js +183 -0
- package/out/ingestors/symbol-ingestor.js.map +1 -0
- package/out/mcp/resources/adrs.d.ts +13 -0
- package/out/mcp/resources/adrs.d.ts.map +1 -0
- package/out/mcp/resources/adrs.js +26 -0
- package/out/mcp/resources/adrs.js.map +1 -0
- package/out/mcp/resources/changes.d.ts +13 -0
- package/out/mcp/resources/changes.d.ts.map +1 -0
- package/out/mcp/resources/changes.js +26 -0
- package/out/mcp/resources/changes.js.map +1 -0
- package/out/mcp/resources/dependencies.d.ts +13 -0
- package/out/mcp/resources/dependencies.d.ts.map +1 -0
- package/out/mcp/resources/dependencies.js +26 -0
- package/out/mcp/resources/dependencies.js.map +1 -0
- package/out/mcp/resources/modules.d.ts +13 -0
- package/out/mcp/resources/modules.d.ts.map +1 -0
- package/out/mcp/resources/modules.js +26 -0
- package/out/mcp/resources/modules.js.map +1 -0
- package/out/mcp/resources/symbols.d.ts +13 -0
- package/out/mcp/resources/symbols.d.ts.map +1 -0
- package/out/mcp/resources/symbols.js +26 -0
- package/out/mcp/resources/symbols.js.map +1 -0
- package/out/mcp/server.d.ts +29 -0
- package/out/mcp/server.d.ts.map +1 -0
- package/out/mcp/server.js +300 -0
- package/out/mcp/server.js.map +1 -0
- package/out/mcp/tools/architecture-mining.d.ts +46 -0
- package/out/mcp/tools/architecture-mining.d.ts.map +1 -0
- package/out/mcp/tools/architecture-mining.js +272 -0
- package/out/mcp/tools/architecture-mining.js.map +1 -0
- package/out/mcp/tools/bootstrap.d.ts +9 -0
- package/out/mcp/tools/bootstrap.d.ts.map +1 -0
- package/out/mcp/tools/bootstrap.js +14 -0
- package/out/mcp/tools/bootstrap.js.map +1 -0
- package/out/mcp/tools/cross-analysis.d.ts +18 -0
- package/out/mcp/tools/cross-analysis.d.ts.map +1 -0
- package/out/mcp/tools/cross-analysis.js +23 -0
- package/out/mcp/tools/cross-analysis.js.map +1 -0
- package/out/mcp/tools/gap-analysis.d.ts +34 -0
- package/out/mcp/tools/gap-analysis.d.ts.map +1 -0
- package/out/mcp/tools/gap-analysis.js +106 -0
- package/out/mcp/tools/gap-analysis.js.map +1 -0
- package/out/mcp/tools/learning-path.d.ts +10 -0
- package/out/mcp/tools/learning-path.d.ts.map +1 -0
- package/out/mcp/tools/learning-path.js +18 -0
- package/out/mcp/tools/learning-path.js.map +1 -0
- package/out/mcp/tools/query-dependencies.d.ts +18 -0
- package/out/mcp/tools/query-dependencies.d.ts.map +1 -0
- package/out/mcp/tools/query-dependencies.js +31 -0
- package/out/mcp/tools/query-dependencies.js.map +1 -0
- package/out/mcp/tools/query-modules.d.ts +17 -0
- package/out/mcp/tools/query-modules.d.ts.map +1 -0
- package/out/mcp/tools/query-modules.js +22 -0
- package/out/mcp/tools/query-modules.js.map +1 -0
- package/out/mcp/tools/query-symbols.d.ts +18 -0
- package/out/mcp/tools/query-symbols.d.ts.map +1 -0
- package/out/mcp/tools/query-symbols.js +32 -0
- package/out/mcp/tools/query-symbols.js.map +1 -0
- package/out/mcp/tools/semantic-discovery.d.ts +12 -0
- package/out/mcp/tools/semantic-discovery.d.ts.map +1 -0
- package/out/mcp/tools/semantic-discovery.js +35 -0
- package/out/mcp/tools/semantic-discovery.js.map +1 -0
- package/out/mcp/tools/system-explanation.d.ts +9 -0
- package/out/mcp/tools/system-explanation.d.ts.map +1 -0
- package/out/mcp/tools/system-explanation.js +14 -0
- package/out/mcp/tools/system-explanation.js.map +1 -0
- package/out/mcp/types.d.ts +19 -0
- package/out/mcp/types.d.ts.map +1 -0
- package/out/mcp/types.js +6 -0
- package/out/mcp/types.js.map +1 -0
- package/out/models/adr.d.ts +26 -0
- package/out/models/adr.d.ts.map +1 -0
- package/out/models/adr.js +3 -0
- package/out/models/adr.js.map +1 -0
- package/out/models/change.d.ts +42 -0
- package/out/models/change.d.ts.map +1 -0
- package/out/models/change.js +3 -0
- package/out/models/change.js.map +1 -0
- package/out/models/dependency.d.ts +37 -0
- package/out/models/dependency.d.ts.map +1 -0
- package/out/models/dependency.js +3 -0
- package/out/models/dependency.js.map +1 -0
- package/out/models/entity-reference.d.ts +20 -0
- package/out/models/entity-reference.d.ts.map +1 -0
- package/out/models/entity-reference.js +19 -0
- package/out/models/entity-reference.js.map +1 -0
- package/out/models/module.d.ts +26 -0
- package/out/models/module.d.ts.map +1 -0
- package/out/models/module.js +3 -0
- package/out/models/module.js.map +1 -0
- package/out/models/symbol.d.ts +31 -0
- package/out/models/symbol.d.ts.map +1 -0
- package/out/models/symbol.js +3 -0
- package/out/models/symbol.js.map +1 -0
- package/out/repositories/adr-repository.d.ts +41 -0
- package/out/repositories/adr-repository.d.ts.map +1 -0
- package/out/repositories/adr-repository.js +128 -0
- package/out/repositories/adr-repository.js.map +1 -0
- package/out/repositories/base-repository.d.ts +86 -0
- package/out/repositories/base-repository.d.ts.map +1 -0
- package/out/repositories/base-repository.js +66 -0
- package/out/repositories/base-repository.js.map +1 -0
- package/out/repositories/change-repository.d.ts +40 -0
- package/out/repositories/change-repository.d.ts.map +1 -0
- package/out/repositories/change-repository.js +150 -0
- package/out/repositories/change-repository.js.map +1 -0
- package/out/repositories/dependency-repository.d.ts +40 -0
- package/out/repositories/dependency-repository.d.ts.map +1 -0
- package/out/repositories/dependency-repository.js +129 -0
- package/out/repositories/dependency-repository.js.map +1 -0
- package/out/repositories/embedding-repository.d.ts +64 -0
- package/out/repositories/embedding-repository.d.ts.map +1 -0
- package/out/repositories/embedding-repository.js +126 -0
- package/out/repositories/embedding-repository.js.map +1 -0
- package/out/repositories/importance-repository.d.ts +63 -0
- package/out/repositories/importance-repository.d.ts.map +1 -0
- package/out/repositories/importance-repository.js +117 -0
- package/out/repositories/importance-repository.js.map +1 -0
- package/out/repositories/module-repository.d.ts +37 -0
- package/out/repositories/module-repository.d.ts.map +1 -0
- package/out/repositories/module-repository.js +122 -0
- package/out/repositories/module-repository.js.map +1 -0
- package/out/repositories/navigation-repository.d.ts +117 -0
- package/out/repositories/navigation-repository.d.ts.map +1 -0
- package/out/repositories/navigation-repository.js +211 -0
- package/out/repositories/navigation-repository.js.map +1 -0
- package/out/repositories/symbol-repository.d.ts +37 -0
- package/out/repositories/symbol-repository.d.ts.map +1 -0
- package/out/repositories/symbol-repository.js +136 -0
- package/out/repositories/symbol-repository.js.map +1 -0
- package/out/services/cross-dimension-linker.d.ts +45 -0
- package/out/services/cross-dimension-linker.d.ts.map +1 -0
- package/out/services/cross-dimension-linker.js +98 -0
- package/out/services/cross-dimension-linker.js.map +1 -0
- package/out/services/importance-scorer.d.ts +47 -0
- package/out/services/importance-scorer.d.ts.map +1 -0
- package/out/services/importance-scorer.js +188 -0
- package/out/services/importance-scorer.js.map +1 -0
- package/out/services/ingestion-orchestrator.d.ts +49 -0
- package/out/services/ingestion-orchestrator.d.ts.map +1 -0
- package/out/services/ingestion-orchestrator.js +140 -0
- package/out/services/ingestion-orchestrator.js.map +1 -0
- package/out/services/navigation-builder.d.ts +29 -0
- package/out/services/navigation-builder.d.ts.map +1 -0
- package/out/services/navigation-builder.js +229 -0
- package/out/services/navigation-builder.js.map +1 -0
- package/out/services/system-model-builder.d.ts +40 -0
- package/out/services/system-model-builder.d.ts.map +1 -0
- package/out/services/system-model-builder.js +88 -0
- package/out/services/system-model-builder.js.map +1 -0
- package/out/ui/commands.d.ts +9 -0
- package/out/ui/commands.d.ts.map +1 -0
- package/out/ui/commands.js +123 -0
- package/out/ui/commands.js.map +1 -0
- package/out/ui/database-explorer.d.ts +27 -0
- package/out/ui/database-explorer.d.ts.map +1 -0
- package/out/ui/database-explorer.js +169 -0
- package/out/ui/database-explorer.js.map +1 -0
- package/out/ui/detail-view-provider.d.ts +86 -0
- package/out/ui/detail-view-provider.d.ts.map +1 -0
- package/out/ui/detail-view-provider.js +1037 -0
- package/out/ui/detail-view-provider.js.map +1 -0
- package/out/ui/search-provider.d.ts +30 -0
- package/out/ui/search-provider.d.ts.map +1 -0
- package/out/ui/search-provider.js +240 -0
- package/out/ui/search-provider.js.map +1 -0
- package/out/ui/status-provider.d.ts +17 -0
- package/out/ui/status-provider.d.ts.map +1 -0
- package/out/ui/status-provider.js +76 -0
- package/out/ui/status-provider.js.map +1 -0
- package/out/validators/consistency-validator.d.ts +37 -0
- package/out/validators/consistency-validator.d.ts.map +1 -0
- package/out/validators/consistency-validator.js +93 -0
- package/out/validators/consistency-validator.js.map +1 -0
- package/out/validators/integrity-validator.d.ts +45 -0
- package/out/validators/integrity-validator.d.ts.map +1 -0
- package/out/validators/integrity-validator.js +115 -0
- package/out/validators/integrity-validator.js.map +1 -0
- package/package.json +173 -0
- package/schemas/sqlite/001_initial_modules.sql +39 -0
- package/schemas/sqlite/002_initial_symbols.sql +46 -0
- package/schemas/sqlite/003_initial_dependencies.sql +51 -0
- package/schemas/sqlite/004_initial_adrs.sql +41 -0
- package/schemas/sqlite/005_initial_changes.sql +54 -0
- package/schemas/sqlite/006_initial_ingestion.sql +34 -0
- package/schemas/sqlite/006_vectors_schema.sql +73 -0
|
@@ -0,0 +1,1037 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.DetailViewProvider = void 0;
|
|
37
|
+
const vscode = __importStar(require("vscode"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const module_api_1 = require("../api/module-api");
|
|
40
|
+
const symbol_api_1 = require("../api/symbol-api");
|
|
41
|
+
const adr_api_1 = require("../api/adr-api");
|
|
42
|
+
const dependency_api_1 = require("../api/dependency-api");
|
|
43
|
+
const change_api_1 = require("../api/change-api");
|
|
44
|
+
const symbol_repository_1 = require("../repositories/symbol-repository");
|
|
45
|
+
const adr_repository_1 = require("../repositories/adr-repository");
|
|
46
|
+
const cross_dimension_api_1 = require("../api/cross-dimension-api");
|
|
47
|
+
const id_mapper_1 = require("../core/id-mapper");
|
|
48
|
+
/**
|
|
49
|
+
* Provider for detail views in VS Code WebView.
|
|
50
|
+
* Shows detailed information for Modules, Symbols, ADRs, Dependencies, and Change Reports.
|
|
51
|
+
*/
|
|
52
|
+
class DetailViewProvider {
|
|
53
|
+
constructor(dbManager) {
|
|
54
|
+
this.panels = new Map();
|
|
55
|
+
this.dbManager = dbManager;
|
|
56
|
+
this.pluginId = dbManager.getPluginId();
|
|
57
|
+
const idMapper = new id_mapper_1.IdMapper(dbManager);
|
|
58
|
+
this.crossDimensionApi = new cross_dimension_api_1.CrossDimensionApi(dbManager, idMapper);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Shows module detail view.
|
|
62
|
+
*/
|
|
63
|
+
async showModuleDetail(moduleId) {
|
|
64
|
+
const moduleApi = new module_api_1.ModuleApi(this.dbManager);
|
|
65
|
+
// Try to get by ID first (moduleId is typically an ID)
|
|
66
|
+
let module = await moduleApi.getModuleById(moduleId, this.pluginId);
|
|
67
|
+
if (!module) {
|
|
68
|
+
// Try to get by file path if moduleId is actually a file path
|
|
69
|
+
module = await moduleApi.getModuleByPath(moduleId, this.pluginId);
|
|
70
|
+
}
|
|
71
|
+
if (!module) {
|
|
72
|
+
vscode.window.showErrorMessage(`Module not found: ${moduleId}`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
await this.createModulePanel(module);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Shows symbol detail view.
|
|
79
|
+
*/
|
|
80
|
+
async showSymbolDetail(symbolId) {
|
|
81
|
+
const symbolApi = new symbol_api_1.SymbolApi(this.dbManager);
|
|
82
|
+
const symbol = await symbolApi.getSymbolById(symbolId, this.pluginId);
|
|
83
|
+
if (!symbol) {
|
|
84
|
+
vscode.window.showErrorMessage(`Symbol not found: ${symbolId}`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
await this.createSymbolPanel(symbol);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Shows ADR detail view.
|
|
91
|
+
*/
|
|
92
|
+
async showAdrDetail(adrId) {
|
|
93
|
+
const adrApi = new adr_api_1.AdrApi(this.dbManager);
|
|
94
|
+
// Try to get by ADR number first
|
|
95
|
+
const adr = await adrApi.getAdrByNumber(adrId, this.pluginId);
|
|
96
|
+
if (!adr) {
|
|
97
|
+
// Try to get by ID if adrId is actually an ID
|
|
98
|
+
const db = await this.dbManager.getDatabase('W');
|
|
99
|
+
const repo = new adr_repository_1.AdrRepository(db);
|
|
100
|
+
const adrById = await repo.getById(adrId, this.pluginId);
|
|
101
|
+
if (!adrById) {
|
|
102
|
+
vscode.window.showErrorMessage(`ADR not found: ${adrId}`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
await this.createAdrPanel(adrById);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
await this.createAdrPanel(adr);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Shows dependency detail view.
|
|
113
|
+
*/
|
|
114
|
+
async showDependencyDetail(dependencyId) {
|
|
115
|
+
const dependencyApi = new dependency_api_1.DependencyApi(this.dbManager);
|
|
116
|
+
const dependency = await dependencyApi.getDependencyById(dependencyId, this.pluginId);
|
|
117
|
+
if (!dependency) {
|
|
118
|
+
vscode.window.showErrorMessage(`Dependency not found: ${dependencyId}`);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
await this.createDependencyPanel(dependency);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Shows change report detail view.
|
|
125
|
+
*/
|
|
126
|
+
async showChangeDetail(reportId) {
|
|
127
|
+
const changeApi = new change_api_1.ChangeApi(this.dbManager);
|
|
128
|
+
const report = await changeApi.getChangeReportById(reportId, this.pluginId);
|
|
129
|
+
if (!report) {
|
|
130
|
+
vscode.window.showErrorMessage(`Change report not found: ${reportId}`);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const symbolChanges = await changeApi.getSymbolChanges(reportId);
|
|
134
|
+
const dependencyChanges = await changeApi.getDependencyChanges(reportId);
|
|
135
|
+
await this.createChangePanel(report, symbolChanges, dependencyChanges);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Creates a WebView panel for module detail.
|
|
139
|
+
*/
|
|
140
|
+
async createModulePanel(module) {
|
|
141
|
+
const panelKey = `module-${module.id}`;
|
|
142
|
+
// Reuse existing panel if available
|
|
143
|
+
const existingPanel = this.panels.get(panelKey);
|
|
144
|
+
if (existingPanel) {
|
|
145
|
+
existingPanel.reveal();
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Get related symbols
|
|
149
|
+
const relatedSymbols = await this.crossDimensionApi.getSymbolsForModule(module.file_path, this.pluginId);
|
|
150
|
+
const panel = vscode.window.createWebviewPanel('5d-database-module-detail', `Module: ${path.basename(module.file_path)}`, vscode.ViewColumn.One, {
|
|
151
|
+
enableScripts: true,
|
|
152
|
+
retainContextWhenHidden: true
|
|
153
|
+
});
|
|
154
|
+
panel.webview.html = this.getModuleHtml(module, relatedSymbols.map(s => ({ external_id: s.external_id, label: s.external_id })));
|
|
155
|
+
// Handle messages from webview (for command links)
|
|
156
|
+
panel.webview.onDidReceiveMessage(async (message) => {
|
|
157
|
+
if (message.command === 'executeCommand') {
|
|
158
|
+
const command = message.commandName;
|
|
159
|
+
const args = message.args || [];
|
|
160
|
+
await vscode.commands.executeCommand(command, ...args);
|
|
161
|
+
}
|
|
162
|
+
}, null, []);
|
|
163
|
+
panel.onDidDispose(() => {
|
|
164
|
+
this.panels.delete(panelKey);
|
|
165
|
+
});
|
|
166
|
+
this.panels.set(panelKey, panel);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Creates a WebView panel for symbol detail.
|
|
170
|
+
*/
|
|
171
|
+
async createSymbolPanel(symbol) {
|
|
172
|
+
const panelKey = `symbol-${symbol.id}`;
|
|
173
|
+
// Reuse existing panel if available
|
|
174
|
+
const existingPanel = this.panels.get(panelKey);
|
|
175
|
+
if (existingPanel) {
|
|
176
|
+
existingPanel.reveal();
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// Get symbol dependencies
|
|
180
|
+
const db = await this.dbManager.getDatabase('Y');
|
|
181
|
+
const symbolRepo = new symbol_repository_1.SymbolRepository(db);
|
|
182
|
+
const dependencies = await symbolRepo.getSymbolDependencies(symbol.id);
|
|
183
|
+
// Get related module
|
|
184
|
+
const relatedModule = await this.crossDimensionApi.resolveSymbolToModule(symbol.symbol_id, this.pluginId);
|
|
185
|
+
const panel = vscode.window.createWebviewPanel('5d-database-symbol-detail', `Symbol: ${symbol.name}`, vscode.ViewColumn.One, {
|
|
186
|
+
enableScripts: true,
|
|
187
|
+
retainContextWhenHidden: true
|
|
188
|
+
});
|
|
189
|
+
panel.webview.html = this.getSymbolHtml(symbol, dependencies, relatedModule ? { external_id: relatedModule.external_id, label: relatedModule.external_id } : null);
|
|
190
|
+
// Handle messages from webview (for command links)
|
|
191
|
+
panel.webview.onDidReceiveMessage(async (message) => {
|
|
192
|
+
if (message.command === 'executeCommand') {
|
|
193
|
+
const command = message.commandName;
|
|
194
|
+
const args = message.args || [];
|
|
195
|
+
await vscode.commands.executeCommand(command, ...args);
|
|
196
|
+
}
|
|
197
|
+
}, null, []);
|
|
198
|
+
panel.onDidDispose(() => {
|
|
199
|
+
this.panels.delete(panelKey);
|
|
200
|
+
});
|
|
201
|
+
this.panels.set(panelKey, panel);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Creates a WebView panel for ADR detail.
|
|
205
|
+
*/
|
|
206
|
+
async createAdrPanel(adr) {
|
|
207
|
+
const panelKey = `adr-${adr.id}`;
|
|
208
|
+
// Reuse existing panel if available
|
|
209
|
+
const existingPanel = this.panels.get(panelKey);
|
|
210
|
+
if (existingPanel) {
|
|
211
|
+
existingPanel.reveal();
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
// Get ADR file mappings
|
|
215
|
+
const db = await this.dbManager.getDatabase('W');
|
|
216
|
+
const adrRepo = new adr_repository_1.AdrRepository(db);
|
|
217
|
+
const fileMappings = await adrRepo.getAdrFileMappings(adr.id);
|
|
218
|
+
// Get ADRs for each file (inverse mapping)
|
|
219
|
+
const relatedAdrs = [];
|
|
220
|
+
for (const mapping of fileMappings) {
|
|
221
|
+
const adrsForFile = await this.crossDimensionApi.getAdrsForFilePath(mapping.file_path, this.pluginId);
|
|
222
|
+
if (adrsForFile.length > 0) {
|
|
223
|
+
// Get ADR details to get title
|
|
224
|
+
const adrApi = new adr_api_1.AdrApi(this.dbManager);
|
|
225
|
+
const adrDetails = await Promise.all(adrsForFile.map(a => adrApi.getAdrByNumber(a.external_id, this.pluginId)));
|
|
226
|
+
relatedAdrs.push({
|
|
227
|
+
file_path: mapping.file_path,
|
|
228
|
+
adrs: adrDetails
|
|
229
|
+
.filter((a) => a !== null)
|
|
230
|
+
.map(a => ({ adr_number: a.adr_number, title: a.title }))
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const panel = vscode.window.createWebviewPanel('5d-database-adr-detail', `ADR-${adr.adr_number}: ${adr.title}`, vscode.ViewColumn.One, {
|
|
235
|
+
enableScripts: true,
|
|
236
|
+
retainContextWhenHidden: true
|
|
237
|
+
});
|
|
238
|
+
panel.webview.html = this.getAdrHtml(adr, fileMappings, relatedAdrs);
|
|
239
|
+
// Handle messages from webview (for command links)
|
|
240
|
+
panel.webview.onDidReceiveMessage(async (message) => {
|
|
241
|
+
if (message.command === 'executeCommand') {
|
|
242
|
+
const command = message.commandName;
|
|
243
|
+
const args = message.args || [];
|
|
244
|
+
await vscode.commands.executeCommand(command, ...args);
|
|
245
|
+
}
|
|
246
|
+
}, null, []);
|
|
247
|
+
panel.onDidDispose(() => {
|
|
248
|
+
this.panels.delete(panelKey);
|
|
249
|
+
});
|
|
250
|
+
this.panels.set(panelKey, panel);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Creates a WebView panel for dependency detail.
|
|
254
|
+
*/
|
|
255
|
+
async createDependencyPanel(dependency) {
|
|
256
|
+
const panelKey = `dependency-${dependency.id}`;
|
|
257
|
+
// Reuse existing panel if available
|
|
258
|
+
const existingPanel = this.panels.get(panelKey);
|
|
259
|
+
if (existingPanel) {
|
|
260
|
+
existingPanel.reveal();
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
// Get related modules
|
|
264
|
+
const moduleApi = new module_api_1.ModuleApi(this.dbManager);
|
|
265
|
+
const fromModule = await moduleApi.getModuleByPath(dependency.from_module, this.pluginId);
|
|
266
|
+
const toModule = await moduleApi.getModuleByPath(dependency.to_module, this.pluginId);
|
|
267
|
+
const panel = vscode.window.createWebviewPanel('5d-database-dependency-detail', `Dependency: ${path.basename(dependency.from_module)} → ${path.basename(dependency.to_module)}`, vscode.ViewColumn.One, {
|
|
268
|
+
enableScripts: true,
|
|
269
|
+
retainContextWhenHidden: true
|
|
270
|
+
});
|
|
271
|
+
panel.webview.html = this.getDependencyHtml(dependency, fromModule, toModule);
|
|
272
|
+
// Handle messages from webview (for command links)
|
|
273
|
+
panel.webview.onDidReceiveMessage(async (message) => {
|
|
274
|
+
if (message.command === 'executeCommand') {
|
|
275
|
+
const command = message.commandName;
|
|
276
|
+
const args = message.args || [];
|
|
277
|
+
await vscode.commands.executeCommand(command, ...args);
|
|
278
|
+
}
|
|
279
|
+
}, null, []);
|
|
280
|
+
panel.onDidDispose(() => {
|
|
281
|
+
this.panels.delete(panelKey);
|
|
282
|
+
});
|
|
283
|
+
this.panels.set(panelKey, panel);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Creates a WebView panel for change report detail.
|
|
287
|
+
*/
|
|
288
|
+
async createChangePanel(report, symbolChanges, dependencyChanges) {
|
|
289
|
+
const panelKey = `change-${report.id}`;
|
|
290
|
+
// Reuse existing panel if available
|
|
291
|
+
const existingPanel = this.panels.get(panelKey);
|
|
292
|
+
if (existingPanel) {
|
|
293
|
+
existingPanel.reveal();
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const panel = vscode.window.createWebviewPanel('5d-database-change-detail', `Change Report: ${report.run_type} - ${report.created_at.toLocaleDateString()}`, vscode.ViewColumn.One, {
|
|
297
|
+
enableScripts: true,
|
|
298
|
+
retainContextWhenHidden: true
|
|
299
|
+
});
|
|
300
|
+
panel.webview.html = this.getChangeHtml(report, symbolChanges, dependencyChanges);
|
|
301
|
+
// Handle messages from webview (for command links)
|
|
302
|
+
panel.webview.onDidReceiveMessage(async (message) => {
|
|
303
|
+
if (message.command === 'executeCommand') {
|
|
304
|
+
const command = message.commandName;
|
|
305
|
+
const args = message.args || [];
|
|
306
|
+
await vscode.commands.executeCommand(command, ...args);
|
|
307
|
+
}
|
|
308
|
+
}, null, []);
|
|
309
|
+
panel.onDidDispose(() => {
|
|
310
|
+
this.panels.delete(panelKey);
|
|
311
|
+
});
|
|
312
|
+
this.panels.set(panelKey, panel);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Generates HTML for module detail view.
|
|
316
|
+
*/
|
|
317
|
+
getModuleHtml(module, relatedSymbols) {
|
|
318
|
+
const markdown = module.content_markdown || '*No content available*';
|
|
319
|
+
const openFileCommand = JSON.stringify(['5d-database.openSourceFile', [module.file_path]]);
|
|
320
|
+
return `<!DOCTYPE html>
|
|
321
|
+
<html lang="en">
|
|
322
|
+
<head>
|
|
323
|
+
<meta charset="UTF-8">
|
|
324
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
325
|
+
<title>Module: ${this.escapeHtml(module.file_path)}</title>
|
|
326
|
+
<style>
|
|
327
|
+
body {
|
|
328
|
+
font-family: var(--vscode-font-family);
|
|
329
|
+
padding: 20px;
|
|
330
|
+
color: var(--vscode-foreground);
|
|
331
|
+
background-color: var(--vscode-editor-background);
|
|
332
|
+
}
|
|
333
|
+
h1 {
|
|
334
|
+
color: var(--vscode-textLink-foreground);
|
|
335
|
+
border-bottom: 2px solid var(--vscode-panel-border);
|
|
336
|
+
padding-bottom: 10px;
|
|
337
|
+
}
|
|
338
|
+
.metadata {
|
|
339
|
+
background-color: var(--vscode-editor-inactiveSelectionBackground);
|
|
340
|
+
padding: 15px;
|
|
341
|
+
border-radius: 5px;
|
|
342
|
+
margin-bottom: 20px;
|
|
343
|
+
}
|
|
344
|
+
.metadata-item {
|
|
345
|
+
margin: 5px 0;
|
|
346
|
+
}
|
|
347
|
+
.metadata-label {
|
|
348
|
+
font-weight: bold;
|
|
349
|
+
color: var(--vscode-textLink-foreground);
|
|
350
|
+
}
|
|
351
|
+
.content {
|
|
352
|
+
margin-top: 20px;
|
|
353
|
+
}
|
|
354
|
+
pre {
|
|
355
|
+
background-color: var(--vscode-textCodeBlock-background);
|
|
356
|
+
padding: 10px;
|
|
357
|
+
border-radius: 5px;
|
|
358
|
+
overflow-x: auto;
|
|
359
|
+
}
|
|
360
|
+
code {
|
|
361
|
+
font-family: var(--vscode-editor-font-family);
|
|
362
|
+
}
|
|
363
|
+
</style>
|
|
364
|
+
<script>
|
|
365
|
+
const vscode = acquireVsCodeApi();
|
|
366
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
367
|
+
document.querySelectorAll('a[data-command]').forEach(link => {
|
|
368
|
+
link.addEventListener('click', (e) => {
|
|
369
|
+
e.preventDefault();
|
|
370
|
+
const command = link.getAttribute('data-command');
|
|
371
|
+
const argsJson = link.getAttribute('data-args');
|
|
372
|
+
const args = argsJson ? JSON.parse(argsJson) : [];
|
|
373
|
+
vscode.postMessage({
|
|
374
|
+
command: 'executeCommand',
|
|
375
|
+
commandName: command,
|
|
376
|
+
args: args
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
</script>
|
|
382
|
+
</head>
|
|
383
|
+
<body>
|
|
384
|
+
<h1>Module: ${this.escapeHtml(module.file_path)}</h1>
|
|
385
|
+
|
|
386
|
+
<div class="metadata">
|
|
387
|
+
<div class="metadata-item">
|
|
388
|
+
<span class="metadata-label">File Path:</span>
|
|
389
|
+
<a href="#" data-command="5d-database.openSourceFile" data-args="${this.escapeHtml(JSON.stringify([module.file_path]))}" style="color: var(--vscode-textLink-foreground); text-decoration: underline; cursor: pointer;">${this.escapeHtml(module.file_path)}</a>
|
|
390
|
+
<span style="margin-left: 10px; color: var(--vscode-descriptionForeground);">(click to open)</span>
|
|
391
|
+
</div>
|
|
392
|
+
<div class="metadata-item">
|
|
393
|
+
<span class="metadata-label">Content Hash:</span> <code>${this.escapeHtml(module.content_hash)}</code>
|
|
394
|
+
</div>
|
|
395
|
+
<div class="metadata-item">
|
|
396
|
+
<span class="metadata-label">Created:</span> ${module.created_at.toLocaleString()}
|
|
397
|
+
</div>
|
|
398
|
+
<div class="metadata-item">
|
|
399
|
+
<span class="metadata-label">Updated:</span> ${module.updated_at.toLocaleString()}
|
|
400
|
+
</div>
|
|
401
|
+
</div>
|
|
402
|
+
|
|
403
|
+
<div class="content">
|
|
404
|
+
${this.markdownToHtml(markdown)}
|
|
405
|
+
</div>
|
|
406
|
+
</body>
|
|
407
|
+
</html>`;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Generates HTML for symbol detail view.
|
|
411
|
+
*/
|
|
412
|
+
getSymbolHtml(symbol, dependencies, relatedModule) {
|
|
413
|
+
let signature;
|
|
414
|
+
try {
|
|
415
|
+
const sigJson = JSON.parse(symbol.signature_json);
|
|
416
|
+
signature = typeof sigJson === 'string' ? sigJson : JSON.stringify(sigJson, null, 2);
|
|
417
|
+
}
|
|
418
|
+
catch {
|
|
419
|
+
signature = symbol.signature_json;
|
|
420
|
+
}
|
|
421
|
+
const depsHtml = dependencies.length > 0
|
|
422
|
+
? dependencies.map(dep => {
|
|
423
|
+
let symbolsList = '';
|
|
424
|
+
if (dep.dependency_symbols_json) {
|
|
425
|
+
try {
|
|
426
|
+
const symbols = JSON.parse(dep.dependency_symbols_json);
|
|
427
|
+
if (Array.isArray(symbols) && symbols.length > 0) {
|
|
428
|
+
symbolsList = ` (${symbols.join(', ')})`;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
// Ignore parse errors
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
const flags = [];
|
|
436
|
+
if (dep.is_type_only)
|
|
437
|
+
flags.push('type-only');
|
|
438
|
+
if (dep.is_reexport)
|
|
439
|
+
flags.push('reexport');
|
|
440
|
+
const flagsStr = flags.length > 0 ? ` [${flags.join(', ')}]` : '';
|
|
441
|
+
const depArgs = this.escapeHtml(JSON.stringify([dep.dependency_module]));
|
|
442
|
+
return `<li><a href="#" data-command="5d-database.openSourceFile" data-args="${depArgs}" style="cursor: pointer;"><code>${this.escapeHtml(dep.dependency_module)}</code></a>${symbolsList}${flagsStr}</li>`;
|
|
443
|
+
}).join('\n')
|
|
444
|
+
: '<li><em>No dependencies</em></li>';
|
|
445
|
+
return `<!DOCTYPE html>
|
|
446
|
+
<html lang="en">
|
|
447
|
+
<head>
|
|
448
|
+
<meta charset="UTF-8">
|
|
449
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
450
|
+
<title>Symbol: ${this.escapeHtml(symbol.name)}</title>
|
|
451
|
+
<style>
|
|
452
|
+
body {
|
|
453
|
+
font-family: var(--vscode-font-family);
|
|
454
|
+
padding: 20px;
|
|
455
|
+
color: var(--vscode-foreground);
|
|
456
|
+
background-color: var(--vscode-editor-background);
|
|
457
|
+
}
|
|
458
|
+
h1 {
|
|
459
|
+
color: var(--vscode-textLink-foreground);
|
|
460
|
+
border-bottom: 2px solid var(--vscode-panel-border);
|
|
461
|
+
padding-bottom: 10px;
|
|
462
|
+
}
|
|
463
|
+
.metadata {
|
|
464
|
+
background-color: var(--vscode-editor-inactiveSelectionBackground);
|
|
465
|
+
padding: 15px;
|
|
466
|
+
border-radius: 5px;
|
|
467
|
+
margin-bottom: 20px;
|
|
468
|
+
}
|
|
469
|
+
.metadata-item {
|
|
470
|
+
margin: 5px 0;
|
|
471
|
+
}
|
|
472
|
+
.metadata-label {
|
|
473
|
+
font-weight: bold;
|
|
474
|
+
color: var(--vscode-textLink-foreground);
|
|
475
|
+
}
|
|
476
|
+
.signature {
|
|
477
|
+
background-color: var(--vscode-textCodeBlock-background);
|
|
478
|
+
padding: 10px;
|
|
479
|
+
border-radius: 5px;
|
|
480
|
+
margin: 10px 0;
|
|
481
|
+
overflow-x: auto;
|
|
482
|
+
}
|
|
483
|
+
.dependencies {
|
|
484
|
+
margin-top: 20px;
|
|
485
|
+
}
|
|
486
|
+
.dependencies ul {
|
|
487
|
+
list-style-type: none;
|
|
488
|
+
padding-left: 0;
|
|
489
|
+
}
|
|
490
|
+
.dependencies li {
|
|
491
|
+
margin: 5px 0;
|
|
492
|
+
padding: 5px;
|
|
493
|
+
background-color: var(--vscode-editor-inactiveSelectionBackground);
|
|
494
|
+
border-radius: 3px;
|
|
495
|
+
}
|
|
496
|
+
a {
|
|
497
|
+
color: var(--vscode-textLink-foreground);
|
|
498
|
+
text-decoration: underline;
|
|
499
|
+
cursor: pointer;
|
|
500
|
+
}
|
|
501
|
+
a:hover {
|
|
502
|
+
color: var(--vscode-textLink-activeForeground);
|
|
503
|
+
}
|
|
504
|
+
code {
|
|
505
|
+
font-family: var(--vscode-editor-font-family);
|
|
506
|
+
}
|
|
507
|
+
</style>
|
|
508
|
+
<script>
|
|
509
|
+
const vscode = acquireVsCodeApi();
|
|
510
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
511
|
+
document.querySelectorAll('a[data-command]').forEach(link => {
|
|
512
|
+
link.addEventListener('click', (e) => {
|
|
513
|
+
e.preventDefault();
|
|
514
|
+
const command = link.getAttribute('data-command');
|
|
515
|
+
const argsJson = link.getAttribute('data-args');
|
|
516
|
+
const args = argsJson ? JSON.parse(argsJson) : [];
|
|
517
|
+
vscode.postMessage({
|
|
518
|
+
command: 'executeCommand',
|
|
519
|
+
commandName: command,
|
|
520
|
+
args: args
|
|
521
|
+
});
|
|
522
|
+
});
|
|
523
|
+
});
|
|
524
|
+
});
|
|
525
|
+
</script>
|
|
526
|
+
</head>
|
|
527
|
+
<body>
|
|
528
|
+
<h1>Symbol: ${this.escapeHtml(symbol.name)}</h1>
|
|
529
|
+
|
|
530
|
+
<div class="metadata">
|
|
531
|
+
<div class="metadata-item">
|
|
532
|
+
<span class="metadata-label">Name:</span> ${this.escapeHtml(symbol.name)}
|
|
533
|
+
</div>
|
|
534
|
+
<div class="metadata-item">
|
|
535
|
+
<span class="metadata-label">Kind:</span> ${this.escapeHtml(symbol.kind)}
|
|
536
|
+
</div>
|
|
537
|
+
<div class="metadata-item">
|
|
538
|
+
<span class="metadata-label">Path:</span>
|
|
539
|
+
<a href="#" data-command="5d-database.openSourceFile" data-args="${this.escapeHtml(JSON.stringify([symbol.path]))}" style="color: var(--vscode-textLink-foreground); text-decoration: underline; cursor: pointer;">${this.escapeHtml(symbol.path)}</a>
|
|
540
|
+
<span style="margin-left: 10px; color: var(--vscode-descriptionForeground);">(click to open)</span>
|
|
541
|
+
</div>
|
|
542
|
+
<div class="metadata-item">
|
|
543
|
+
<span class="metadata-label">Symbol ID:</span> <code>${this.escapeHtml(symbol.symbol_id)}</code>
|
|
544
|
+
</div>
|
|
545
|
+
${symbol.summary ? `<div class="metadata-item"><span class="metadata-label">Summary:</span> ${this.escapeHtml(symbol.summary)}</div>` : ''}
|
|
546
|
+
<div class="metadata-item">
|
|
547
|
+
<span class="metadata-label">Created:</span> ${symbol.created_at.toLocaleString()}
|
|
548
|
+
</div>
|
|
549
|
+
<div class="metadata-item">
|
|
550
|
+
<span class="metadata-label">Updated:</span> ${symbol.updated_at.toLocaleString()}
|
|
551
|
+
</div>
|
|
552
|
+
</div>
|
|
553
|
+
|
|
554
|
+
<div class="signature">
|
|
555
|
+
<strong>Signature:</strong>
|
|
556
|
+
<pre><code>${this.escapeHtml(signature)}</code></pre>
|
|
557
|
+
</div>
|
|
558
|
+
|
|
559
|
+
<div class="dependencies">
|
|
560
|
+
<h2>Dependencies</h2>
|
|
561
|
+
<ul>
|
|
562
|
+
${depsHtml}
|
|
563
|
+
</ul>
|
|
564
|
+
</div>
|
|
565
|
+
|
|
566
|
+
${relatedModule ? `
|
|
567
|
+
<div class="related">
|
|
568
|
+
<h2>Related Module</h2>
|
|
569
|
+
<p>
|
|
570
|
+
<a href="#" data-command="5d-database.showModuleDetail" data-args="${this.escapeHtml(JSON.stringify([relatedModule.external_id]))}" style="cursor: pointer;">
|
|
571
|
+
${this.escapeHtml(relatedModule.label || relatedModule.external_id)}
|
|
572
|
+
</a>
|
|
573
|
+
</p>
|
|
574
|
+
</div>
|
|
575
|
+
` : ''}
|
|
576
|
+
</body>
|
|
577
|
+
</html>`;
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Generates HTML for ADR detail view.
|
|
581
|
+
*/
|
|
582
|
+
getAdrHtml(adr, fileMappings, relatedAdrs) {
|
|
583
|
+
const markdown = adr.content_markdown || '*No content available*';
|
|
584
|
+
const filesHtml = fileMappings.length > 0
|
|
585
|
+
? fileMappings.map(mapping => {
|
|
586
|
+
const fileArgs = this.escapeHtml(JSON.stringify([mapping.file_path]));
|
|
587
|
+
return `<li><a href="#" data-command="5d-database.openSourceFile" data-args="${fileArgs}" style="cursor: pointer;"><code>${this.escapeHtml(mapping.file_path)}</code></a></li>`;
|
|
588
|
+
}).join('\n')
|
|
589
|
+
: '<li><em>No file mappings</em></li>';
|
|
590
|
+
return `<!DOCTYPE html>
|
|
591
|
+
<html lang="en">
|
|
592
|
+
<head>
|
|
593
|
+
<meta charset="UTF-8">
|
|
594
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
595
|
+
<title>ADR-${this.escapeHtml(adr.adr_number)}: ${this.escapeHtml(adr.title)}</title>
|
|
596
|
+
<style>
|
|
597
|
+
body {
|
|
598
|
+
font-family: var(--vscode-font-family);
|
|
599
|
+
padding: 20px;
|
|
600
|
+
color: var(--vscode-foreground);
|
|
601
|
+
background-color: var(--vscode-editor-background);
|
|
602
|
+
}
|
|
603
|
+
h1 {
|
|
604
|
+
color: var(--vscode-textLink-foreground);
|
|
605
|
+
border-bottom: 2px solid var(--vscode-panel-border);
|
|
606
|
+
padding-bottom: 10px;
|
|
607
|
+
}
|
|
608
|
+
.metadata {
|
|
609
|
+
background-color: var(--vscode-editor-inactiveSelectionBackground);
|
|
610
|
+
padding: 15px;
|
|
611
|
+
border-radius: 5px;
|
|
612
|
+
margin-bottom: 20px;
|
|
613
|
+
}
|
|
614
|
+
.metadata-item {
|
|
615
|
+
margin: 5px 0;
|
|
616
|
+
}
|
|
617
|
+
.metadata-label {
|
|
618
|
+
font-weight: bold;
|
|
619
|
+
color: var(--vscode-textLink-foreground);
|
|
620
|
+
}
|
|
621
|
+
.content {
|
|
622
|
+
margin-top: 20px;
|
|
623
|
+
}
|
|
624
|
+
.file-mappings {
|
|
625
|
+
margin-top: 20px;
|
|
626
|
+
}
|
|
627
|
+
.file-mappings ul {
|
|
628
|
+
list-style-type: none;
|
|
629
|
+
padding-left: 0;
|
|
630
|
+
}
|
|
631
|
+
.file-mappings li {
|
|
632
|
+
margin: 5px 0;
|
|
633
|
+
padding: 5px;
|
|
634
|
+
background-color: var(--vscode-editor-inactiveSelectionBackground);
|
|
635
|
+
border-radius: 3px;
|
|
636
|
+
}
|
|
637
|
+
a {
|
|
638
|
+
color: var(--vscode-textLink-foreground);
|
|
639
|
+
text-decoration: underline;
|
|
640
|
+
cursor: pointer;
|
|
641
|
+
}
|
|
642
|
+
a:hover {
|
|
643
|
+
color: var(--vscode-textLink-activeForeground);
|
|
644
|
+
}
|
|
645
|
+
code {
|
|
646
|
+
font-family: var(--vscode-editor-font-family);
|
|
647
|
+
}
|
|
648
|
+
</style>
|
|
649
|
+
<script>
|
|
650
|
+
const vscode = acquireVsCodeApi();
|
|
651
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
652
|
+
document.querySelectorAll('a[data-command]').forEach(link => {
|
|
653
|
+
link.addEventListener('click', (e) => {
|
|
654
|
+
e.preventDefault();
|
|
655
|
+
const command = link.getAttribute('data-command');
|
|
656
|
+
const argsJson = link.getAttribute('data-args');
|
|
657
|
+
const args = argsJson ? JSON.parse(argsJson) : [];
|
|
658
|
+
vscode.postMessage({
|
|
659
|
+
command: 'executeCommand',
|
|
660
|
+
commandName: command,
|
|
661
|
+
args: args
|
|
662
|
+
});
|
|
663
|
+
});
|
|
664
|
+
});
|
|
665
|
+
});
|
|
666
|
+
</script>
|
|
667
|
+
</head>
|
|
668
|
+
<body>
|
|
669
|
+
<h1>ADR-${this.escapeHtml(adr.adr_number)}: ${this.escapeHtml(adr.title)}</h1>
|
|
670
|
+
|
|
671
|
+
<div class="metadata">
|
|
672
|
+
<div class="metadata-item">
|
|
673
|
+
<span class="metadata-label">ADR Number:</span> ${this.escapeHtml(adr.adr_number)}
|
|
674
|
+
</div>
|
|
675
|
+
<div class="metadata-item">
|
|
676
|
+
<span class="metadata-label">Title:</span> ${this.escapeHtml(adr.title)}
|
|
677
|
+
</div>
|
|
678
|
+
<div class="metadata-item">
|
|
679
|
+
<span class="metadata-label">File Name:</span> ${this.escapeHtml(adr.file_name)}
|
|
680
|
+
</div>
|
|
681
|
+
<div class="metadata-item">
|
|
682
|
+
<span class="metadata-label">Content Hash:</span> <code>${this.escapeHtml(adr.content_hash)}</code>
|
|
683
|
+
</div>
|
|
684
|
+
<div class="metadata-item">
|
|
685
|
+
<span class="metadata-label">Created:</span> ${adr.created_at.toLocaleString()}
|
|
686
|
+
</div>
|
|
687
|
+
<div class="metadata-item">
|
|
688
|
+
<span class="metadata-label">Updated:</span> ${adr.updated_at.toLocaleString()}
|
|
689
|
+
</div>
|
|
690
|
+
</div>
|
|
691
|
+
|
|
692
|
+
<div class="file-mappings">
|
|
693
|
+
<h2>Referenced Files</h2>
|
|
694
|
+
<ul>
|
|
695
|
+
${filesHtml}
|
|
696
|
+
</ul>
|
|
697
|
+
</div>
|
|
698
|
+
|
|
699
|
+
<div class="content">
|
|
700
|
+
${this.markdownToHtml(markdown)}
|
|
701
|
+
</div>
|
|
702
|
+
</body>
|
|
703
|
+
</html>`;
|
|
704
|
+
}
|
|
705
|
+
/**
|
|
706
|
+
* Generates HTML for dependency detail view.
|
|
707
|
+
*/
|
|
708
|
+
getDependencyHtml(dependency, fromModule, toModule) {
|
|
709
|
+
const fromModuleCommand = fromModule ? '5d-database.showModuleDetail' : '5d-database.openSourceFile';
|
|
710
|
+
const fromModuleArgs = fromModule ? [fromModule.id] : [dependency.from_module];
|
|
711
|
+
const toModuleCommand = toModule ? '5d-database.showModuleDetail' : '5d-database.openSourceFile';
|
|
712
|
+
const toModuleArgs = toModule ? [toModule.id] : [dependency.to_module];
|
|
713
|
+
let symbolsList = '';
|
|
714
|
+
if (dependency.symbols_json) {
|
|
715
|
+
try {
|
|
716
|
+
const symbols = JSON.parse(dependency.symbols_json);
|
|
717
|
+
if (Array.isArray(symbols) && symbols.length > 0) {
|
|
718
|
+
symbolsList = `<div class="metadata-item">
|
|
719
|
+
<span class="metadata-label">Symbols:</span> ${symbols.map(s => `<code>${this.escapeHtml(s)}</code>`).join(', ')}
|
|
720
|
+
</div>`;
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
catch {
|
|
724
|
+
// Ignore parse errors
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
const flags = [];
|
|
728
|
+
if (dependency.is_type_only)
|
|
729
|
+
flags.push('type-only');
|
|
730
|
+
if (dependency.is_reexport)
|
|
731
|
+
flags.push('reexport');
|
|
732
|
+
const flagsStr = flags.length > 0 ? ` [${flags.join(', ')}]` : '';
|
|
733
|
+
return `<!DOCTYPE html>
|
|
734
|
+
<html lang="en">
|
|
735
|
+
<head>
|
|
736
|
+
<meta charset="UTF-8">
|
|
737
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
738
|
+
<title>Dependency: ${this.escapeHtml(dependency.from_module)} → ${this.escapeHtml(dependency.to_module)}</title>
|
|
739
|
+
<style>
|
|
740
|
+
body {
|
|
741
|
+
font-family: var(--vscode-font-family);
|
|
742
|
+
padding: 20px;
|
|
743
|
+
color: var(--vscode-foreground);
|
|
744
|
+
background-color: var(--vscode-editor-background);
|
|
745
|
+
}
|
|
746
|
+
h1 {
|
|
747
|
+
color: var(--vscode-textLink-foreground);
|
|
748
|
+
border-bottom: 2px solid var(--vscode-panel-border);
|
|
749
|
+
padding-bottom: 10px;
|
|
750
|
+
}
|
|
751
|
+
.metadata {
|
|
752
|
+
background-color: var(--vscode-editor-inactiveSelectionBackground);
|
|
753
|
+
padding: 15px;
|
|
754
|
+
border-radius: 5px;
|
|
755
|
+
margin-bottom: 20px;
|
|
756
|
+
}
|
|
757
|
+
.metadata-item {
|
|
758
|
+
margin: 5px 0;
|
|
759
|
+
}
|
|
760
|
+
.metadata-label {
|
|
761
|
+
font-weight: bold;
|
|
762
|
+
color: var(--vscode-textLink-foreground);
|
|
763
|
+
}
|
|
764
|
+
.related {
|
|
765
|
+
margin-top: 20px;
|
|
766
|
+
}
|
|
767
|
+
.related ul {
|
|
768
|
+
list-style-type: none;
|
|
769
|
+
padding-left: 0;
|
|
770
|
+
}
|
|
771
|
+
.related li {
|
|
772
|
+
margin: 5px 0;
|
|
773
|
+
padding: 5px;
|
|
774
|
+
background-color: var(--vscode-editor-inactiveSelectionBackground);
|
|
775
|
+
border-radius: 3px;
|
|
776
|
+
}
|
|
777
|
+
a {
|
|
778
|
+
color: var(--vscode-textLink-foreground);
|
|
779
|
+
text-decoration: underline;
|
|
780
|
+
cursor: pointer;
|
|
781
|
+
}
|
|
782
|
+
a:hover {
|
|
783
|
+
color: var(--vscode-textLink-activeForeground);
|
|
784
|
+
}
|
|
785
|
+
code {
|
|
786
|
+
font-family: var(--vscode-editor-font-family);
|
|
787
|
+
}
|
|
788
|
+
</style>
|
|
789
|
+
<script>
|
|
790
|
+
const vscode = acquireVsCodeApi();
|
|
791
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
792
|
+
document.querySelectorAll('a[data-command]').forEach(link => {
|
|
793
|
+
link.addEventListener('click', (e) => {
|
|
794
|
+
e.preventDefault();
|
|
795
|
+
const command = link.getAttribute('data-command');
|
|
796
|
+
const argsJson = link.getAttribute('data-args');
|
|
797
|
+
const args = argsJson ? JSON.parse(argsJson) : [];
|
|
798
|
+
vscode.postMessage({
|
|
799
|
+
command: 'executeCommand',
|
|
800
|
+
commandName: command,
|
|
801
|
+
args: args
|
|
802
|
+
});
|
|
803
|
+
});
|
|
804
|
+
});
|
|
805
|
+
});
|
|
806
|
+
</script>
|
|
807
|
+
</head>
|
|
808
|
+
<body>
|
|
809
|
+
<h1>Dependency: ${this.escapeHtml(dependency.from_module)} → ${this.escapeHtml(dependency.to_module)}</h1>
|
|
810
|
+
|
|
811
|
+
<div class="metadata">
|
|
812
|
+
<div class="metadata-item">
|
|
813
|
+
<span class="metadata-label">From Module:</span>
|
|
814
|
+
<a href="#" data-command="${fromModuleCommand}" data-args="${this.escapeHtml(JSON.stringify(fromModuleArgs))}" style="cursor: pointer;"><code>${this.escapeHtml(dependency.from_module)}</code></a>
|
|
815
|
+
<span style="margin-left: 10px; color: var(--vscode-descriptionForeground);">(click to ${fromModule ? 'view details' : 'open'})</span>
|
|
816
|
+
</div>
|
|
817
|
+
<div class="metadata-item">
|
|
818
|
+
<span class="metadata-label">To Module:</span>
|
|
819
|
+
<a href="#" data-command="${toModuleCommand}" data-args="${this.escapeHtml(JSON.stringify(toModuleArgs))}" style="cursor: pointer;"><code>${this.escapeHtml(dependency.to_module)}</code></a>
|
|
820
|
+
<span style="margin-left: 10px; color: var(--vscode-descriptionForeground);">(click to ${toModule ? 'view details' : 'open'})</span>
|
|
821
|
+
</div>
|
|
822
|
+
<div class="metadata-item">
|
|
823
|
+
<span class="metadata-label">Type:</span> <code>${this.escapeHtml(dependency.dependency_type)}</code>${flagsStr}
|
|
824
|
+
</div>
|
|
825
|
+
${symbolsList}
|
|
826
|
+
<div class="metadata-item">
|
|
827
|
+
<span class="metadata-label">Content Hash:</span> <code>${this.escapeHtml(dependency.content_hash)}</code>
|
|
828
|
+
</div>
|
|
829
|
+
<div class="metadata-item">
|
|
830
|
+
<span class="metadata-label">Created:</span> ${dependency.created_at.toLocaleString()}
|
|
831
|
+
</div>
|
|
832
|
+
<div class="metadata-item">
|
|
833
|
+
<span class="metadata-label">Updated:</span> ${dependency.updated_at.toLocaleString()}
|
|
834
|
+
</div>
|
|
835
|
+
</div>
|
|
836
|
+
|
|
837
|
+
${fromModule || toModule ? `
|
|
838
|
+
<div class="related">
|
|
839
|
+
<h2>Related Modules</h2>
|
|
840
|
+
<ul>
|
|
841
|
+
${fromModule ? `<li><a href="#" data-command="${fromModuleCommand}" data-args="${this.escapeHtml(JSON.stringify(fromModuleArgs))}" style="cursor: pointer;">${this.escapeHtml(dependency.from_module)}</a></li>` : ''}
|
|
842
|
+
${toModule ? `<li><a href="#" data-command="${toModuleCommand}" data-args="${this.escapeHtml(JSON.stringify(toModuleArgs))}" style="cursor: pointer;">${this.escapeHtml(dependency.to_module)}</a></li>` : ''}
|
|
843
|
+
</ul>
|
|
844
|
+
</div>
|
|
845
|
+
` : ''}
|
|
846
|
+
</body>
|
|
847
|
+
</html>`;
|
|
848
|
+
}
|
|
849
|
+
/**
|
|
850
|
+
* Generates HTML for change report detail view.
|
|
851
|
+
*/
|
|
852
|
+
getChangeHtml(report, symbolChanges, dependencyChanges) {
|
|
853
|
+
const symbolChangesHtml = symbolChanges.length > 0
|
|
854
|
+
? symbolChanges.map(sc => {
|
|
855
|
+
const fileArgs = this.escapeHtml(JSON.stringify([sc.file_path]));
|
|
856
|
+
const changeTypeBadge = sc.change_type === 'added' ? '🟢' : sc.change_type === 'removed' ? '🔴' : '🟡';
|
|
857
|
+
return `<li>
|
|
858
|
+
${changeTypeBadge} <strong>${this.escapeHtml(sc.change_type)}</strong>:
|
|
859
|
+
<code>${this.escapeHtml(sc.symbol_name)}</code> (${this.escapeHtml(sc.symbol_kind)})
|
|
860
|
+
in <a href="#" data-command="5d-database.openSourceFile" data-args="${fileArgs}" style="cursor: pointer;"><code>${this.escapeHtml(sc.file_path)}</code></a>
|
|
861
|
+
</li>`;
|
|
862
|
+
}).join('\n')
|
|
863
|
+
: '<li><em>No symbol changes</em></li>';
|
|
864
|
+
const dependencyChangesHtml = dependencyChanges.length > 0
|
|
865
|
+
? dependencyChanges.map(dc => {
|
|
866
|
+
const fromArgs = this.escapeHtml(JSON.stringify([dc.from_module]));
|
|
867
|
+
const toArgs = this.escapeHtml(JSON.stringify([dc.to_module]));
|
|
868
|
+
const changeTypeBadge = dc.change_type === 'added' ? '🟢' : '🔴';
|
|
869
|
+
return `<li>
|
|
870
|
+
${changeTypeBadge} <strong>${this.escapeHtml(dc.change_type)}</strong>:
|
|
871
|
+
<a href="#" data-command="5d-database.openSourceFile" data-args="${fromArgs}" style="cursor: pointer;"><code>${this.escapeHtml(dc.from_module)}</code></a>
|
|
872
|
+
→ <a href="#" data-command="5d-database.openSourceFile" data-args="${toArgs}" style="cursor: pointer;"><code>${this.escapeHtml(dc.to_module)}</code></a>
|
|
873
|
+
[${this.escapeHtml(dc.dependency_type)}]
|
|
874
|
+
</li>`;
|
|
875
|
+
}).join('\n')
|
|
876
|
+
: '<li><em>No dependency changes</em></li>';
|
|
877
|
+
return `<!DOCTYPE html>
|
|
878
|
+
<html lang="en">
|
|
879
|
+
<head>
|
|
880
|
+
<meta charset="UTF-8">
|
|
881
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
882
|
+
<title>Change Report: ${this.escapeHtml(report.run_type)} - ${report.created_at.toLocaleDateString()}</title>
|
|
883
|
+
<style>
|
|
884
|
+
body {
|
|
885
|
+
font-family: var(--vscode-font-family);
|
|
886
|
+
padding: 20px;
|
|
887
|
+
color: var(--vscode-foreground);
|
|
888
|
+
background-color: var(--vscode-editor-background);
|
|
889
|
+
}
|
|
890
|
+
h1 {
|
|
891
|
+
color: var(--vscode-textLink-foreground);
|
|
892
|
+
border-bottom: 2px solid var(--vscode-panel-border);
|
|
893
|
+
padding-bottom: 10px;
|
|
894
|
+
}
|
|
895
|
+
.metadata {
|
|
896
|
+
background-color: var(--vscode-editor-inactiveSelectionBackground);
|
|
897
|
+
padding: 15px;
|
|
898
|
+
border-radius: 5px;
|
|
899
|
+
margin-bottom: 20px;
|
|
900
|
+
}
|
|
901
|
+
.metadata-item {
|
|
902
|
+
margin: 5px 0;
|
|
903
|
+
}
|
|
904
|
+
.metadata-label {
|
|
905
|
+
font-weight: bold;
|
|
906
|
+
color: var(--vscode-textLink-foreground);
|
|
907
|
+
}
|
|
908
|
+
.changes {
|
|
909
|
+
margin-top: 20px;
|
|
910
|
+
}
|
|
911
|
+
.changes ul {
|
|
912
|
+
list-style-type: none;
|
|
913
|
+
padding-left: 0;
|
|
914
|
+
}
|
|
915
|
+
.changes li {
|
|
916
|
+
margin: 5px 0;
|
|
917
|
+
padding: 8px;
|
|
918
|
+
background-color: var(--vscode-editor-inactiveSelectionBackground);
|
|
919
|
+
border-radius: 3px;
|
|
920
|
+
}
|
|
921
|
+
a {
|
|
922
|
+
color: var(--vscode-textLink-foreground);
|
|
923
|
+
text-decoration: underline;
|
|
924
|
+
cursor: pointer;
|
|
925
|
+
}
|
|
926
|
+
a:hover {
|
|
927
|
+
color: var(--vscode-textLink-activeForeground);
|
|
928
|
+
}
|
|
929
|
+
code {
|
|
930
|
+
font-family: var(--vscode-editor-font-family);
|
|
931
|
+
}
|
|
932
|
+
</style>
|
|
933
|
+
<script>
|
|
934
|
+
const vscode = acquireVsCodeApi();
|
|
935
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
936
|
+
document.querySelectorAll('a[data-command]').forEach(link => {
|
|
937
|
+
link.addEventListener('click', (e) => {
|
|
938
|
+
e.preventDefault();
|
|
939
|
+
const command = link.getAttribute('data-command');
|
|
940
|
+
const argsJson = link.getAttribute('data-args');
|
|
941
|
+
const args = argsJson ? JSON.parse(argsJson) : [];
|
|
942
|
+
vscode.postMessage({
|
|
943
|
+
command: 'executeCommand',
|
|
944
|
+
commandName: command,
|
|
945
|
+
args: args
|
|
946
|
+
});
|
|
947
|
+
});
|
|
948
|
+
});
|
|
949
|
+
});
|
|
950
|
+
</script>
|
|
951
|
+
</head>
|
|
952
|
+
<body>
|
|
953
|
+
<h1>Change Report: ${this.escapeHtml(report.run_type)} - ${report.created_at.toLocaleDateString()}</h1>
|
|
954
|
+
|
|
955
|
+
<div class="metadata">
|
|
956
|
+
<div class="metadata-item">
|
|
957
|
+
<span class="metadata-label">Run Type:</span> ${this.escapeHtml(report.run_type)}
|
|
958
|
+
</div>
|
|
959
|
+
<div class="metadata-item">
|
|
960
|
+
<span class="metadata-label">Created:</span> ${report.created_at.toLocaleString()}
|
|
961
|
+
</div>
|
|
962
|
+
<div class="metadata-item">
|
|
963
|
+
<span class="metadata-label">Statistics:</span>
|
|
964
|
+
${report.parsed_files} parsed, ${report.skipped_files} skipped, ${report.total_dependencies} dependencies
|
|
965
|
+
</div>
|
|
966
|
+
${report.validation_errors > 0 || report.validation_warnings > 0 ? `
|
|
967
|
+
<div class="metadata-item">
|
|
968
|
+
<span class="metadata-label">Validation:</span>
|
|
969
|
+
${report.validation_errors} errors, ${report.validation_warnings} warnings
|
|
970
|
+
</div>
|
|
971
|
+
` : ''}
|
|
972
|
+
</div>
|
|
973
|
+
|
|
974
|
+
<div class="changes">
|
|
975
|
+
<h2>Symbol Changes (${symbolChanges.length})</h2>
|
|
976
|
+
<ul>
|
|
977
|
+
${symbolChangesHtml}
|
|
978
|
+
</ul>
|
|
979
|
+
</div>
|
|
980
|
+
|
|
981
|
+
<div class="changes">
|
|
982
|
+
<h2>Dependency Changes (${dependencyChanges.length})</h2>
|
|
983
|
+
<ul>
|
|
984
|
+
${dependencyChangesHtml}
|
|
985
|
+
</ul>
|
|
986
|
+
</div>
|
|
987
|
+
</body>
|
|
988
|
+
</html>`;
|
|
989
|
+
}
|
|
990
|
+
/**
|
|
991
|
+
* Escapes HTML special characters.
|
|
992
|
+
*/
|
|
993
|
+
escapeHtml(text) {
|
|
994
|
+
return text
|
|
995
|
+
.replace(/&/g, '&')
|
|
996
|
+
.replace(/</g, '<')
|
|
997
|
+
.replace(/>/g, '>')
|
|
998
|
+
.replace(/"/g, '"')
|
|
999
|
+
.replace(/'/g, ''');
|
|
1000
|
+
}
|
|
1001
|
+
/**
|
|
1002
|
+
* Converts markdown to HTML (basic conversion).
|
|
1003
|
+
* For full markdown support, consider using a markdown library.
|
|
1004
|
+
*/
|
|
1005
|
+
markdownToHtml(markdown) {
|
|
1006
|
+
// Remove HTML comments first (they're for change tracking, not display)
|
|
1007
|
+
let html = markdown.replace(/<!--[\s\S]*?-->/g, '');
|
|
1008
|
+
// Then escape HTML to prevent XSS
|
|
1009
|
+
html = this.escapeHtml(html);
|
|
1010
|
+
// Headers
|
|
1011
|
+
html = html.replace(/^### (.*$)/gim, '<h3>$1</h3>');
|
|
1012
|
+
html = html.replace(/^## (.*$)/gim, '<h2>$1</h2>');
|
|
1013
|
+
html = html.replace(/^# (.*$)/gim, '<h1>$1</h1>');
|
|
1014
|
+
// Bold
|
|
1015
|
+
html = html.replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>');
|
|
1016
|
+
// Italic
|
|
1017
|
+
html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');
|
|
1018
|
+
// Code blocks
|
|
1019
|
+
html = html.replace(/```([\s\S]*?)```/g, '<pre><code>$1</code></pre>');
|
|
1020
|
+
// Inline code
|
|
1021
|
+
html = html.replace(/`([^`]+)`/g, '<code>$1</code>');
|
|
1022
|
+
// Links
|
|
1023
|
+
html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
|
|
1024
|
+
// Line breaks
|
|
1025
|
+
html = html.replace(/\n/g, '<br>');
|
|
1026
|
+
return html;
|
|
1027
|
+
}
|
|
1028
|
+
/**
|
|
1029
|
+
* Disposes all panels.
|
|
1030
|
+
*/
|
|
1031
|
+
dispose() {
|
|
1032
|
+
this.panels.forEach(panel => panel.dispose());
|
|
1033
|
+
this.panels.clear();
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
exports.DetailViewProvider = DetailViewProvider;
|
|
1037
|
+
//# sourceMappingURL=detail-view-provider.js.map
|