@mcp-graph-workflow/mcp-graph 3.0.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/LICENSE +21 -0
- package/README.md +157 -0
- package/dist/api/middleware/error-handler.d.ts +3 -0
- package/dist/api/middleware/error-handler.d.ts.map +1 -0
- package/dist/api/middleware/error-handler.js +48 -0
- package/dist/api/middleware/error-handler.js.map +1 -0
- package/dist/api/middleware/request-logger.d.ts +6 -0
- package/dist/api/middleware/request-logger.d.ts.map +1 -0
- package/dist/api/middleware/request-logger.js +19 -0
- package/dist/api/middleware/request-logger.js.map +1 -0
- package/dist/api/middleware/validate.d.ts +5 -0
- package/dist/api/middleware/validate.d.ts.map +1 -0
- package/dist/api/middleware/validate.js +23 -0
- package/dist/api/middleware/validate.js.map +1 -0
- package/dist/api/router.d.ts +11 -0
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/router.js +51 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/routes/benchmark.d.ts +4 -0
- package/dist/api/routes/benchmark.d.ts.map +1 -0
- package/dist/api/routes/benchmark.js +86 -0
- package/dist/api/routes/benchmark.js.map +1 -0
- package/dist/api/routes/capture.d.ts +3 -0
- package/dist/api/routes/capture.d.ts.map +1 -0
- package/dist/api/routes/capture.js +31 -0
- package/dist/api/routes/capture.js.map +1 -0
- package/dist/api/routes/context.d.ts +4 -0
- package/dist/api/routes/context.d.ts.map +1 -0
- package/dist/api/routes/context.js +25 -0
- package/dist/api/routes/context.js.map +1 -0
- package/dist/api/routes/docs-cache.d.ts +4 -0
- package/dist/api/routes/docs-cache.d.ts.map +1 -0
- package/dist/api/routes/docs-cache.js +79 -0
- package/dist/api/routes/docs-cache.js.map +1 -0
- package/dist/api/routes/edges.d.ts +4 -0
- package/dist/api/routes/edges.d.ts.map +1 -0
- package/dist/api/routes/edges.js +50 -0
- package/dist/api/routes/edges.js.map +1 -0
- package/dist/api/routes/events.d.ts +4 -0
- package/dist/api/routes/events.d.ts.map +1 -0
- package/dist/api/routes/events.js +37 -0
- package/dist/api/routes/events.js.map +1 -0
- package/dist/api/routes/gitnexus.d.ts +12 -0
- package/dist/api/routes/gitnexus.d.ts.map +1 -0
- package/dist/api/routes/gitnexus.js +162 -0
- package/dist/api/routes/gitnexus.js.map +1 -0
- package/dist/api/routes/graph.d.ts +4 -0
- package/dist/api/routes/graph.d.ts.map +1 -0
- package/dist/api/routes/graph.js +39 -0
- package/dist/api/routes/graph.js.map +1 -0
- package/dist/api/routes/import.d.ts +4 -0
- package/dist/api/routes/import.d.ts.map +1 -0
- package/dist/api/routes/import.js +92 -0
- package/dist/api/routes/import.js.map +1 -0
- package/dist/api/routes/insights.d.ts +4 -0
- package/dist/api/routes/insights.d.ts.map +1 -0
- package/dist/api/routes/insights.js +40 -0
- package/dist/api/routes/insights.js.map +1 -0
- package/dist/api/routes/integrations.d.ts +4 -0
- package/dist/api/routes/integrations.d.ts.map +1 -0
- package/dist/api/routes/integrations.js +85 -0
- package/dist/api/routes/integrations.js.map +1 -0
- package/dist/api/routes/knowledge.d.ts +8 -0
- package/dist/api/routes/knowledge.d.ts.map +1 -0
- package/dist/api/routes/knowledge.js +144 -0
- package/dist/api/routes/knowledge.js.map +1 -0
- package/dist/api/routes/nodes.d.ts +4 -0
- package/dist/api/routes/nodes.d.ts.map +1 -0
- package/dist/api/routes/nodes.js +123 -0
- package/dist/api/routes/nodes.js.map +1 -0
- package/dist/api/routes/project.d.ts +4 -0
- package/dist/api/routes/project.d.ts.map +1 -0
- package/dist/api/routes/project.js +70 -0
- package/dist/api/routes/project.js.map +1 -0
- package/dist/api/routes/rag.d.ts +8 -0
- package/dist/api/routes/rag.d.ts.map +1 -0
- package/dist/api/routes/rag.js +70 -0
- package/dist/api/routes/rag.js.map +1 -0
- package/dist/api/routes/search.d.ts +4 -0
- package/dist/api/routes/search.d.ts.map +1 -0
- package/dist/api/routes/search.js +25 -0
- package/dist/api/routes/search.js.map +1 -0
- package/dist/api/routes/skills.d.ts +3 -0
- package/dist/api/routes/skills.d.ts.map +1 -0
- package/dist/api/routes/skills.js +16 -0
- package/dist/api/routes/skills.js.map +1 -0
- package/dist/api/routes/stats.d.ts +4 -0
- package/dist/api/routes/stats.d.ts.map +1 -0
- package/dist/api/routes/stats.js +14 -0
- package/dist/api/routes/stats.js.map +1 -0
- package/dist/cli/commands/import-cmd.d.ts +3 -0
- package/dist/cli/commands/import-cmd.d.ts.map +1 -0
- package/dist/cli/commands/import-cmd.js +38 -0
- package/dist/cli/commands/import-cmd.js.map +1 -0
- package/dist/cli/commands/index-cmd.d.ts +3 -0
- package/dist/cli/commands/index-cmd.d.ts.map +1 -0
- package/dist/cli/commands/index-cmd.js +50 -0
- package/dist/cli/commands/index-cmd.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +24 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +3 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +18 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +3 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +39 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +30 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/capture/content-extractor.d.ts +21 -0
- package/dist/core/capture/content-extractor.d.ts.map +1 -0
- package/dist/core/capture/content-extractor.js +74 -0
- package/dist/core/capture/content-extractor.js.map +1 -0
- package/dist/core/capture/validate-runner.d.ts +28 -0
- package/dist/core/capture/validate-runner.d.ts.map +1 -0
- package/dist/core/capture/validate-runner.js +42 -0
- package/dist/core/capture/validate-runner.js.map +1 -0
- package/dist/core/capture/web-capture.d.ts +20 -0
- package/dist/core/capture/web-capture.d.ts.map +1 -0
- package/dist/core/capture/web-capture.js +51 -0
- package/dist/core/capture/web-capture.js.map +1 -0
- package/dist/core/config/ai-memory-generator.d.ts +14 -0
- package/dist/core/config/ai-memory-generator.d.ts.map +1 -0
- package/dist/core/config/ai-memory-generator.js +130 -0
- package/dist/core/config/ai-memory-generator.js.map +1 -0
- package/dist/core/config/config-loader.d.ts +3 -0
- package/dist/core/config/config-loader.d.ts.map +1 -0
- package/dist/core/config/config-loader.js +48 -0
- package/dist/core/config/config-loader.js.map +1 -0
- package/dist/core/config/config-schema.d.ts +12 -0
- package/dist/core/config/config-schema.d.ts.map +1 -0
- package/dist/core/config/config-schema.js +13 -0
- package/dist/core/config/config-schema.js.map +1 -0
- package/dist/core/context/bm25-compressor.d.ts +21 -0
- package/dist/core/context/bm25-compressor.d.ts.map +1 -0
- package/dist/core/context/bm25-compressor.js +87 -0
- package/dist/core/context/bm25-compressor.js.map +1 -0
- package/dist/core/context/compact-context.d.ts +56 -0
- package/dist/core/context/compact-context.d.ts.map +1 -0
- package/dist/core/context/compact-context.js +170 -0
- package/dist/core/context/compact-context.js.map +1 -0
- package/dist/core/context/context-assembler.d.ts +43 -0
- package/dist/core/context/context-assembler.d.ts.map +1 -0
- package/dist/core/context/context-assembler.js +113 -0
- package/dist/core/context/context-assembler.js.map +1 -0
- package/dist/core/context/rag-context.d.ts +44 -0
- package/dist/core/context/rag-context.d.ts.map +1 -0
- package/dist/core/context/rag-context.js +93 -0
- package/dist/core/context/rag-context.js.map +1 -0
- package/dist/core/context/tiered-context.d.ts +35 -0
- package/dist/core/context/tiered-context.d.ts.map +1 -0
- package/dist/core/context/tiered-context.js +92 -0
- package/dist/core/context/tiered-context.js.map +1 -0
- package/dist/core/context/token-estimator.d.ts +7 -0
- package/dist/core/context/token-estimator.d.ts.map +1 -0
- package/dist/core/context/token-estimator.js +9 -0
- package/dist/core/context/token-estimator.js.map +1 -0
- package/dist/core/docs/docs-cache-store.d.ts +24 -0
- package/dist/core/docs/docs-cache-store.d.ts.map +1 -0
- package/dist/core/docs/docs-cache-store.js +61 -0
- package/dist/core/docs/docs-cache-store.js.map +1 -0
- package/dist/core/docs/docs-syncer.d.ts +13 -0
- package/dist/core/docs/docs-syncer.d.ts.map +1 -0
- package/dist/core/docs/docs-syncer.js +38 -0
- package/dist/core/docs/docs-syncer.js.map +1 -0
- package/dist/core/docs/mcp-context7-fetcher.d.ts +17 -0
- package/dist/core/docs/mcp-context7-fetcher.d.ts.map +1 -0
- package/dist/core/docs/mcp-context7-fetcher.js +87 -0
- package/dist/core/docs/mcp-context7-fetcher.js.map +1 -0
- package/dist/core/docs/stack-detector.d.ts +21 -0
- package/dist/core/docs/stack-detector.d.ts.map +1 -0
- package/dist/core/docs/stack-detector.js +101 -0
- package/dist/core/docs/stack-detector.js.map +1 -0
- package/dist/core/events/event-bus.d.ts +26 -0
- package/dist/core/events/event-bus.d.ts.map +1 -0
- package/dist/core/events/event-bus.js +47 -0
- package/dist/core/events/event-bus.js.map +1 -0
- package/dist/core/events/event-types.d.ts +71 -0
- package/dist/core/events/event-types.d.ts.map +1 -0
- package/dist/core/events/event-types.js +2 -0
- package/dist/core/events/event-types.js.map +1 -0
- package/dist/core/graph/graph-indexes.d.ts +3 -0
- package/dist/core/graph/graph-indexes.d.ts.map +1 -0
- package/dist/core/graph/graph-indexes.js +28 -0
- package/dist/core/graph/graph-indexes.js.map +1 -0
- package/dist/core/graph/graph-types.d.ts +72 -0
- package/dist/core/graph/graph-types.d.ts.map +1 -0
- package/dist/core/graph/graph-types.js +2 -0
- package/dist/core/graph/graph-types.js.map +1 -0
- package/dist/core/graph/mermaid-export.d.ts +9 -0
- package/dist/core/graph/mermaid-export.d.ts.map +1 -0
- package/dist/core/graph/mermaid-export.js +80 -0
- package/dist/core/graph/mermaid-export.js.map +1 -0
- package/dist/core/importer/import-prd.d.ts +7 -0
- package/dist/core/importer/import-prd.d.ts.map +1 -0
- package/dist/core/importer/import-prd.js +7 -0
- package/dist/core/importer/import-prd.js.map +1 -0
- package/dist/core/importer/prd-to-graph.d.ts +18 -0
- package/dist/core/importer/prd-to-graph.d.ts.map +1 -0
- package/dist/core/importer/prd-to-graph.js +195 -0
- package/dist/core/importer/prd-to-graph.js.map +1 -0
- package/dist/core/insights/bottleneck-detector.d.ts +31 -0
- package/dist/core/insights/bottleneck-detector.d.ts.map +1 -0
- package/dist/core/insights/bottleneck-detector.js +84 -0
- package/dist/core/insights/bottleneck-detector.js.map +1 -0
- package/dist/core/insights/metrics-calculator.d.ts +31 -0
- package/dist/core/insights/metrics-calculator.d.ts.map +1 -0
- package/dist/core/insights/metrics-calculator.js +78 -0
- package/dist/core/insights/metrics-calculator.js.map +1 -0
- package/dist/core/insights/skill-recommender.d.ts +21 -0
- package/dist/core/insights/skill-recommender.d.ts.map +1 -0
- package/dist/core/insights/skill-recommender.js +129 -0
- package/dist/core/insights/skill-recommender.js.map +1 -0
- package/dist/core/integrations/enriched-context.d.ts +24 -0
- package/dist/core/integrations/enriched-context.d.ts.map +1 -0
- package/dist/core/integrations/enriched-context.js +89 -0
- package/dist/core/integrations/enriched-context.js.map +1 -0
- package/dist/core/integrations/gitnexus-launcher.d.ts +62 -0
- package/dist/core/integrations/gitnexus-launcher.d.ts.map +1 -0
- package/dist/core/integrations/gitnexus-launcher.js +241 -0
- package/dist/core/integrations/gitnexus-launcher.js.map +1 -0
- package/dist/core/integrations/gitnexus-queries.d.ts +55 -0
- package/dist/core/integrations/gitnexus-queries.d.ts.map +1 -0
- package/dist/core/integrations/gitnexus-queries.js +168 -0
- package/dist/core/integrations/gitnexus-queries.js.map +1 -0
- package/dist/core/integrations/integration-orchestrator.d.ts +51 -0
- package/dist/core/integrations/integration-orchestrator.d.ts.map +1 -0
- package/dist/core/integrations/integration-orchestrator.js +118 -0
- package/dist/core/integrations/integration-orchestrator.js.map +1 -0
- package/dist/core/integrations/mcp-deps-installer.d.ts +21 -0
- package/dist/core/integrations/mcp-deps-installer.d.ts.map +1 -0
- package/dist/core/integrations/mcp-deps-installer.js +114 -0
- package/dist/core/integrations/mcp-deps-installer.js.map +1 -0
- package/dist/core/integrations/mcp-servers-config.d.ts +21 -0
- package/dist/core/integrations/mcp-servers-config.d.ts.map +1 -0
- package/dist/core/integrations/mcp-servers-config.js +58 -0
- package/dist/core/integrations/mcp-servers-config.js.map +1 -0
- package/dist/core/integrations/serena-reader.d.ts +18 -0
- package/dist/core/integrations/serena-reader.d.ts.map +1 -0
- package/dist/core/integrations/serena-reader.js +68 -0
- package/dist/core/integrations/serena-reader.js.map +1 -0
- package/dist/core/integrations/tool-status.d.ts +18 -0
- package/dist/core/integrations/tool-status.d.ts.map +1 -0
- package/dist/core/integrations/tool-status.js +97 -0
- package/dist/core/integrations/tool-status.js.map +1 -0
- package/dist/core/parser/classify.d.ts +31 -0
- package/dist/core/parser/classify.d.ts.map +1 -0
- package/dist/core/parser/classify.js +128 -0
- package/dist/core/parser/classify.js.map +1 -0
- package/dist/core/parser/extract.d.ts +21 -0
- package/dist/core/parser/extract.d.ts.map +1 -0
- package/dist/core/parser/extract.js +66 -0
- package/dist/core/parser/extract.js.map +1 -0
- package/dist/core/parser/file-reader.d.ts +13 -0
- package/dist/core/parser/file-reader.d.ts.map +1 -0
- package/dist/core/parser/file-reader.js +52 -0
- package/dist/core/parser/file-reader.js.map +1 -0
- package/dist/core/parser/normalize.d.ts +9 -0
- package/dist/core/parser/normalize.d.ts.map +1 -0
- package/dist/core/parser/normalize.js +22 -0
- package/dist/core/parser/normalize.js.map +1 -0
- package/dist/core/parser/read-file.d.ts +7 -0
- package/dist/core/parser/read-file.d.ts.map +1 -0
- package/dist/core/parser/read-file.js +17 -0
- package/dist/core/parser/read-file.js.map +1 -0
- package/dist/core/parser/read-html.d.ts +7 -0
- package/dist/core/parser/read-html.d.ts.map +1 -0
- package/dist/core/parser/read-html.js +51 -0
- package/dist/core/parser/read-html.js.map +1 -0
- package/dist/core/parser/read-pdf.d.ts +10 -0
- package/dist/core/parser/read-pdf.d.ts.map +1 -0
- package/dist/core/parser/read-pdf.js +16 -0
- package/dist/core/parser/read-pdf.js.map +1 -0
- package/dist/core/parser/segment.d.ts +13 -0
- package/dist/core/parser/segment.d.ts.map +1 -0
- package/dist/core/parser/segment.js +53 -0
- package/dist/core/parser/segment.js.map +1 -0
- package/dist/core/planner/decompose.d.ts +25 -0
- package/dist/core/planner/decompose.d.ts.map +1 -0
- package/dist/core/planner/decompose.js +100 -0
- package/dist/core/planner/decompose.js.map +1 -0
- package/dist/core/planner/dependency-chain.d.ts +20 -0
- package/dist/core/planner/dependency-chain.d.ts.map +1 -0
- package/dist/core/planner/dependency-chain.js +163 -0
- package/dist/core/planner/dependency-chain.js.map +1 -0
- package/dist/core/planner/enhanced-next.d.ts +25 -0
- package/dist/core/planner/enhanced-next.d.ts.map +1 -0
- package/dist/core/planner/enhanced-next.js +88 -0
- package/dist/core/planner/enhanced-next.js.map +1 -0
- package/dist/core/planner/lifecycle-phase.d.ts +21 -0
- package/dist/core/planner/lifecycle-phase.d.ts.map +1 -0
- package/dist/core/planner/lifecycle-phase.js +93 -0
- package/dist/core/planner/lifecycle-phase.js.map +1 -0
- package/dist/core/planner/next-task.d.ts +16 -0
- package/dist/core/planner/next-task.d.ts.map +1 -0
- package/dist/core/planner/next-task.js +146 -0
- package/dist/core/planner/next-task.js.map +1 -0
- package/dist/core/planner/planning-report.d.ts +38 -0
- package/dist/core/planner/planning-report.d.ts.map +1 -0
- package/dist/core/planner/planning-report.js +140 -0
- package/dist/core/planner/planning-report.js.map +1 -0
- package/dist/core/planner/velocity.d.ts +38 -0
- package/dist/core/planner/velocity.d.ts.map +1 -0
- package/dist/core/planner/velocity.js +92 -0
- package/dist/core/planner/velocity.js.map +1 -0
- package/dist/core/rag/capture-indexer.d.ts +16 -0
- package/dist/core/rag/capture-indexer.d.ts.map +1 -0
- package/dist/core/rag/capture-indexer.js +37 -0
- package/dist/core/rag/capture-indexer.js.map +1 -0
- package/dist/core/rag/chunk-text.d.ts +27 -0
- package/dist/core/rag/chunk-text.d.ts.map +1 -0
- package/dist/core/rag/chunk-text.js +112 -0
- package/dist/core/rag/chunk-text.js.map +1 -0
- package/dist/core/rag/docs-indexer.d.ts +18 -0
- package/dist/core/rag/docs-indexer.d.ts.map +1 -0
- package/dist/core/rag/docs-indexer.js +57 -0
- package/dist/core/rag/docs-indexer.js.map +1 -0
- package/dist/core/rag/embedding-store.d.ts +51 -0
- package/dist/core/rag/embedding-store.d.ts.map +1 -0
- package/dist/core/rag/embedding-store.js +134 -0
- package/dist/core/rag/embedding-store.js.map +1 -0
- package/dist/core/rag/rag-pipeline.d.ts +48 -0
- package/dist/core/rag/rag-pipeline.d.ts.map +1 -0
- package/dist/core/rag/rag-pipeline.js +276 -0
- package/dist/core/rag/rag-pipeline.js.map +1 -0
- package/dist/core/rag/serena-indexer.d.ts +16 -0
- package/dist/core/rag/serena-indexer.d.ts.map +1 -0
- package/dist/core/rag/serena-indexer.js +50 -0
- package/dist/core/rag/serena-indexer.js.map +1 -0
- package/dist/core/rag/serena-rag-query.d.ts +34 -0
- package/dist/core/rag/serena-rag-query.d.ts.map +1 -0
- package/dist/core/rag/serena-rag-query.js +83 -0
- package/dist/core/rag/serena-rag-query.js.map +1 -0
- package/dist/core/search/fts-search.d.ts +16 -0
- package/dist/core/search/fts-search.d.ts.map +1 -0
- package/dist/core/search/fts-search.js +62 -0
- package/dist/core/search/fts-search.js.map +1 -0
- package/dist/core/search/tfidf.d.ts +32 -0
- package/dist/core/search/tfidf.d.ts.map +1 -0
- package/dist/core/search/tfidf.js +67 -0
- package/dist/core/search/tfidf.js.map +1 -0
- package/dist/core/search/tokenizer.d.ts +9 -0
- package/dist/core/search/tokenizer.d.ts.map +1 -0
- package/dist/core/search/tokenizer.js +37 -0
- package/dist/core/search/tokenizer.js.map +1 -0
- package/dist/core/store/knowledge-store.d.ts +72 -0
- package/dist/core/store/knowledge-store.d.ts.map +1 -0
- package/dist/core/store/knowledge-store.js +166 -0
- package/dist/core/store/knowledge-store.js.map +1 -0
- package/dist/core/store/migrations.d.ts +4 -0
- package/dist/core/store/migrations.d.ts.map +1 -0
- package/dist/core/store/migrations.js +223 -0
- package/dist/core/store/migrations.js.map +1 -0
- package/dist/core/store/sqlite-store.d.ts +86 -0
- package/dist/core/store/sqlite-store.d.ts.map +1 -0
- package/dist/core/store/sqlite-store.js +707 -0
- package/dist/core/store/sqlite-store.js.map +1 -0
- package/dist/core/utils/constants.d.ts +10 -0
- package/dist/core/utils/constants.d.ts.map +1 -0
- package/dist/core/utils/constants.js +10 -0
- package/dist/core/utils/constants.js.map +1 -0
- package/dist/core/utils/errors.d.ts +20 -0
- package/dist/core/utils/errors.d.ts.map +1 -0
- package/dist/core/utils/errors.js +39 -0
- package/dist/core/utils/errors.js.map +1 -0
- package/dist/core/utils/fs.d.ts +2 -0
- package/dist/core/utils/fs.d.ts.map +1 -0
- package/dist/core/utils/fs.js +11 -0
- package/dist/core/utils/fs.js.map +1 -0
- package/dist/core/utils/id.d.ts +2 -0
- package/dist/core/utils/id.d.ts.map +1 -0
- package/dist/core/utils/id.js +6 -0
- package/dist/core/utils/id.js.map +1 -0
- package/dist/core/utils/logger.d.ts +8 -0
- package/dist/core/utils/logger.d.ts.map +1 -0
- package/dist/core/utils/logger.js +28 -0
- package/dist/core/utils/logger.js.map +1 -0
- package/dist/core/utils/platform.d.ts +18 -0
- package/dist/core/utils/platform.d.ts.map +1 -0
- package/dist/core/utils/platform.js +43 -0
- package/dist/core/utils/platform.js.map +1 -0
- package/dist/core/utils/time.d.ts +2 -0
- package/dist/core/utils/time.d.ts.map +1 -0
- package/dist/core/utils/time.js +4 -0
- package/dist/core/utils/time.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/init-project.d.ts +2 -0
- package/dist/mcp/init-project.d.ts.map +1 -0
- package/dist/mcp/init-project.js +144 -0
- package/dist/mcp/init-project.js.map +1 -0
- package/dist/mcp/lifecycle-wrapper.d.ts +26 -0
- package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -0
- package/dist/mcp/lifecycle-wrapper.js +67 -0
- package/dist/mcp/lifecycle-wrapper.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +73 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/stdio.d.ts +3 -0
- package/dist/mcp/stdio.d.ts.map +1 -0
- package/dist/mcp/stdio.js +20 -0
- package/dist/mcp/stdio.js.map +1 -0
- package/dist/mcp/tools/add-node.d.ts +4 -0
- package/dist/mcp/tools/add-node.d.ts.map +1 -0
- package/dist/mcp/tools/add-node.js +83 -0
- package/dist/mcp/tools/add-node.js.map +1 -0
- package/dist/mcp/tools/bulk-update-status.d.ts +4 -0
- package/dist/mcp/tools/bulk-update-status.d.ts.map +1 -0
- package/dist/mcp/tools/bulk-update-status.js +22 -0
- package/dist/mcp/tools/bulk-update-status.js.map +1 -0
- package/dist/mcp/tools/clone-node.d.ts +4 -0
- package/dist/mcp/tools/clone-node.d.ts.map +1 -0
- package/dist/mcp/tools/clone-node.js +111 -0
- package/dist/mcp/tools/clone-node.js.map +1 -0
- package/dist/mcp/tools/context.d.ts +4 -0
- package/dist/mcp/tools/context.d.ts.map +1 -0
- package/dist/mcp/tools/context.js +30 -0
- package/dist/mcp/tools/context.js.map +1 -0
- package/dist/mcp/tools/decompose.d.ts +4 -0
- package/dist/mcp/tools/decompose.d.ts.map +1 -0
- package/dist/mcp/tools/decompose.js +25 -0
- package/dist/mcp/tools/decompose.js.map +1 -0
- package/dist/mcp/tools/delete-node.d.ts +4 -0
- package/dist/mcp/tools/delete-node.d.ts.map +1 -0
- package/dist/mcp/tools/delete-node.js +29 -0
- package/dist/mcp/tools/delete-node.js.map +1 -0
- package/dist/mcp/tools/dependencies.d.ts +4 -0
- package/dist/mcp/tools/dependencies.d.ts.map +1 -0
- package/dist/mcp/tools/dependencies.js +47 -0
- package/dist/mcp/tools/dependencies.js.map +1 -0
- package/dist/mcp/tools/edge.d.ts +4 -0
- package/dist/mcp/tools/edge.d.ts.map +1 -0
- package/dist/mcp/tools/edge.js +140 -0
- package/dist/mcp/tools/edge.js.map +1 -0
- package/dist/mcp/tools/export.d.ts +4 -0
- package/dist/mcp/tools/export.d.ts.map +1 -0
- package/dist/mcp/tools/export.js +38 -0
- package/dist/mcp/tools/export.js.map +1 -0
- package/dist/mcp/tools/import-prd.d.ts +4 -0
- package/dist/mcp/tools/import-prd.d.ts.map +1 -0
- package/dist/mcp/tools/import-prd.js +81 -0
- package/dist/mcp/tools/import-prd.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +4 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +58 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/init.d.ts +4 -0
- package/dist/mcp/tools/init.d.ts.map +1 -0
- package/dist/mcp/tools/init.js +18 -0
- package/dist/mcp/tools/init.js.map +1 -0
- package/dist/mcp/tools/list.d.ts +4 -0
- package/dist/mcp/tools/list.d.ts.map +1 -0
- package/dist/mcp/tools/list.js +56 -0
- package/dist/mcp/tools/list.js.map +1 -0
- package/dist/mcp/tools/move-node.d.ts +4 -0
- package/dist/mcp/tools/move-node.d.ts.map +1 -0
- package/dist/mcp/tools/move-node.js +110 -0
- package/dist/mcp/tools/move-node.js.map +1 -0
- package/dist/mcp/tools/next.d.ts +4 -0
- package/dist/mcp/tools/next.d.ts.map +1 -0
- package/dist/mcp/tools/next.js +32 -0
- package/dist/mcp/tools/next.js.map +1 -0
- package/dist/mcp/tools/plan-sprint.d.ts +4 -0
- package/dist/mcp/tools/plan-sprint.d.ts.map +1 -0
- package/dist/mcp/tools/plan-sprint.js +54 -0
- package/dist/mcp/tools/plan-sprint.js.map +1 -0
- package/dist/mcp/tools/rag-context.d.ts +4 -0
- package/dist/mcp/tools/rag-context.d.ts.map +1 -0
- package/dist/mcp/tools/rag-context.js +51 -0
- package/dist/mcp/tools/rag-context.js.map +1 -0
- package/dist/mcp/tools/reindex-knowledge.d.ts +4 -0
- package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -0
- package/dist/mcp/tools/reindex-knowledge.js +49 -0
- package/dist/mcp/tools/reindex-knowledge.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +4 -0
- package/dist/mcp/tools/search.d.ts.map +1 -0
- package/dist/mcp/tools/search.js +41 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/mcp/tools/show.d.ts +4 -0
- package/dist/mcp/tools/show.d.ts.map +1 -0
- package/dist/mcp/tools/show.js +42 -0
- package/dist/mcp/tools/show.js.map +1 -0
- package/dist/mcp/tools/snapshot.d.ts +4 -0
- package/dist/mcp/tools/snapshot.d.ts.map +1 -0
- package/dist/mcp/tools/snapshot.js +45 -0
- package/dist/mcp/tools/snapshot.js.map +1 -0
- package/dist/mcp/tools/stats.d.ts +4 -0
- package/dist/mcp/tools/stats.d.ts.map +1 -0
- package/dist/mcp/tools/stats.js +46 -0
- package/dist/mcp/tools/stats.js.map +1 -0
- package/dist/mcp/tools/sync-stack-docs.d.ts +4 -0
- package/dist/mcp/tools/sync-stack-docs.d.ts.map +1 -0
- package/dist/mcp/tools/sync-stack-docs.js +77 -0
- package/dist/mcp/tools/sync-stack-docs.js.map +1 -0
- package/dist/mcp/tools/update-node.d.ts +4 -0
- package/dist/mcp/tools/update-node.d.ts.map +1 -0
- package/dist/mcp/tools/update-node.js +45 -0
- package/dist/mcp/tools/update-node.js.map +1 -0
- package/dist/mcp/tools/update-status.d.ts +4 -0
- package/dist/mcp/tools/update-status.d.ts.map +1 -0
- package/dist/mcp/tools/update-status.js +33 -0
- package/dist/mcp/tools/update-status.js.map +1 -0
- package/dist/mcp/tools/validate-task.d.ts +4 -0
- package/dist/mcp/tools/validate-task.d.ts.map +1 -0
- package/dist/mcp/tools/validate-task.js +57 -0
- package/dist/mcp/tools/validate-task.js.map +1 -0
- package/dist/mcp/tools/velocity.d.ts +4 -0
- package/dist/mcp/tools/velocity.d.ts.map +1 -0
- package/dist/mcp/tools/velocity.js +25 -0
- package/dist/mcp/tools/velocity.js.map +1 -0
- package/dist/schemas/edge.schema.d.ts +31 -0
- package/dist/schemas/edge.schema.d.ts.map +1 -0
- package/dist/schemas/edge.schema.js +16 -0
- package/dist/schemas/edge.schema.js.map +1 -0
- package/dist/schemas/graph.schema.d.ts +102 -0
- package/dist/schemas/graph.schema.d.ts.map +1 -0
- package/dist/schemas/graph.schema.js +28 -0
- package/dist/schemas/graph.schema.js.map +1 -0
- package/dist/schemas/knowledge.schema.d.ts +29 -0
- package/dist/schemas/knowledge.schema.d.ts.map +1 -0
- package/dist/schemas/knowledge.schema.js +17 -0
- package/dist/schemas/knowledge.schema.js.map +1 -0
- package/dist/schemas/node.schema.d.ts +80 -0
- package/dist/schemas/node.schema.d.ts.map +1 -0
- package/dist/schemas/node.schema.js +38 -0
- package/dist/schemas/node.schema.js.map +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-BTKW3REK.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-BhbUvjLM.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-CESZcCtO.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-D64Ala80.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-DJ7HyF-u.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-DVyzQZ2d.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-XUH7yQNv.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-ZfJu1pxc.js +1 -0
- package/dist/web/dashboard/dist/assets/constants-BIEJOBya.js +1 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-BFHEXsJm.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-Bbp91fom.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-C3fPSzYi.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-Cd0k8qk3.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-ClNGphK5.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-Cuc-KSII.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-DEqMBSbC.css +1 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-DEwJXSnD.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-DOD7xwmm.js +312 -0
- package/dist/web/dashboard/dist/assets/graph-tab-AD7csRcc.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-BKyDCyHH.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-BUAkTto0.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-D0F0WJES.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-DA16nThT.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-DJknUhrl.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-DRPfelKw.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-lJ2rPS4Z.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-utils-BN7tt0ZS.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-BTV1KGUM.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-BZV40eAE.css +1 -0
- package/dist/web/dashboard/dist/assets/graph-utils-BkfAOVJ9.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-Bo7cD1sx.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-CI4znRl5.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-DrCx5m7q.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-KQmzMFXM.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-M7iOhRI-.js +23 -0
- package/dist/web/dashboard/dist/assets/index-BGMP3W6f.css +1 -0
- package/dist/web/dashboard/dist/assets/index-BVXu3x9W.js +53 -0
- package/dist/web/dashboard/dist/assets/index-B_T9j86O.js +53 -0
- package/dist/web/dashboard/dist/assets/index-Bga9WW2A.css +1 -0
- package/dist/web/dashboard/dist/assets/index-BnLPCC8R.css +1 -0
- package/dist/web/dashboard/dist/assets/index-BonF71I0.js +53 -0
- package/dist/web/dashboard/dist/assets/index-CSyjxREL.js +53 -0
- package/dist/web/dashboard/dist/assets/index-CbUKe2Fv.js +53 -0
- package/dist/web/dashboard/dist/assets/index-D9i2aVjo.js +53 -0
- package/dist/web/dashboard/dist/assets/index-DzM6oBA3.js +53 -0
- package/dist/web/dashboard/dist/assets/index-IK005MzD.js +53 -0
- package/dist/web/dashboard/dist/assets/insights-tab-B9R3HsMU.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-BO_cxLyV.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-Brn6IMfQ.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-C6x-aJ8p.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-CWUU6eDi.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-CapL1jP-.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-CeWM6zgV.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-xQj5e61M.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-0oOO63rA.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-BcWoplsM.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-Bjj5KccG.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-C7cKQyup.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-CT4ja7Ay.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-CmPHHBDQ.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-DAHBiRO-.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-_jmBe3MU.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-BVyBTaHC.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-CVI1GGRk.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-D1ki2NjT.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-DRrRfjpO.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-DvYbwR4Z.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-DwiZ6Jm3.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-L6isY0iT.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-ba2n0AOh.js +1 -0
- package/dist/web/dashboard/dist/index.html +13 -0
- package/package.json +86 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as t,j as e,a as X}from"./index-CSyjxREL.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-KQmzMFXM.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as t,j as e,a as X}from"./index-B_T9j86O.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-Bo7cD1sx.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as t,j as e,a as X}from"./index-D9i2aVjo.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-M7iOhRI-.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as t,j as e,a as X}from"./index-BVXu3x9W.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-BTV1KGUM.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as t,j as e,a as X}from"./index-DzM6oBA3.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-CI4znRl5.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as t,j as e,a as X}from"./index-BonF71I0.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-BN7tt0ZS.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as t,j as e,a as X}from"./index-IK005MzD.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-DrCx5m7q.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as t,j as e,a as X}from"./index-CbUKe2Fv.js";import{u as ee,a as se,f as M,t as te,s as re,b as ae,c as oe,i as le,W as ne,d as ce,B as de,C as ie,N as xe}from"./graph-utils-BkfAOVJ9.js";import{A as ue,S as L,a as pe,N as _,E as me}from"./constants-BIEJOBya.js";const be=t.memo(function({statuses:p,types:y,direction:m,onStatusToggle:N,onTypeToggle:h,onDirectionChange:f,onClear:b,showFullGraph:n,totalNodeCount:c,onShowFullGraphChange:v}){return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-4 py-2 border-b border-[var(--color-border)] bg-[var(--color-bg-secondary)] text-xs",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Status:"}),ue.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:p.has(a),onChange:()=>N(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:L[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Type:"}),pe.map(a=>e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:y.has(a),onChange:()=>h(a),className:"w-3 h-3"}),e.jsx("span",{className:"w-2 h-2 rounded-full inline-block",style:{background:_[a]}}),e.jsx("span",{children:a.replace("_"," ")})]},a))]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"font-medium text-[var(--color-text-muted)]",children:"Layout:"}),e.jsxs("select",{value:m,onChange:a=>f(a.target.value),className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded px-1 py-0.5 text-xs",children:[e.jsx("option",{value:"TB",children:"Top → Down"}),e.jsx("option",{value:"LR",children:"Left → Right"})]})]}),e.jsx("div",{className:"w-px h-4 bg-[var(--color-border)]"}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:()=>v(!n),className:"w-3 h-3"}),e.jsxs("span",{children:["Show all nodes (",c,")"]})]}),n&&c>200&&e.jsx("span",{className:"text-[var(--color-warning)] font-medium",children:"Large graph — may be slow"}),e.jsx("button",{onClick:b,className:"text-[var(--color-text-muted)] hover:text-[var(--color-text)] underline",children:"Clear"})]})}),E=50,he=t.memo(function({nodes:p,onNodeClick:y}){const[m,N]=t.useState("priority"),[h,f]=t.useState("asc"),[b,n]=t.useState(""),[c,v]=t.useState(0),a=t.useMemo(()=>{if(!b)return p;const s=b.toLowerCase();return p.filter(u=>u.title.toLowerCase().includes(s)||u.type.toLowerCase().includes(s)||u.status.toLowerCase().includes(s)||(u.sprint||"").toLowerCase().includes(s))},[p,b]),g=t.useMemo(()=>[...a].sort((s,u)=>{const C=s[m]??"",w=u[m]??"",S=typeof C=="number"?C-w:String(C).localeCompare(String(w));return h==="asc"?S:-S}),[a,m,h]),i=Math.max(1,Math.ceil(g.length/E)),j=t.useMemo(()=>g.slice(c*E,(c+1)*E),[g,c]),l=s=>{m===s?f(u=>u==="asc"?"desc":"asc"):(N(s),f("asc"))},k=[{key:"title",label:"Title"},{key:"type",label:"Type"},{key:"status",label:"Status"},{key:"priority",label:"Priority"},{key:"xpSize",label:"Size"},{key:"sprint",label:"Sprint"}];return e.jsxs("div",{className:"border-t border-[var(--color-border)]",children:[e.jsx("div",{className:"px-4 py-2 bg-[var(--color-bg-secondary)]",children:e.jsx("input",{type:"text",placeholder:"Search nodes...",value:b,onChange:s=>n(s.target.value),className:"w-full max-w-xs px-2 py-1 text-sm border border-[var(--color-border)] rounded bg-[var(--color-bg)]"})}),e.jsx("div",{className:"overflow-x-auto max-h-64",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsx("tr",{className:"bg-[var(--color-bg-tertiary)]",children:k.map(s=>e.jsxs("th",{onClick:()=>l(s.key),className:"px-3 py-1.5 text-left text-xs font-medium text-[var(--color-text-muted)] cursor-pointer hover:text-[var(--color-text)]",children:[s.label,m===s.key&&(h==="asc"?" ↑":" ↓")]},s.key))})}),e.jsx("tbody",{children:j.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"px-3 py-4 text-center text-[var(--color-text-muted)]",children:"No nodes found"})}):j.map(s=>e.jsxs("tr",{onClick:()=>y(s),className:"border-t border-[var(--color-border)] hover:bg-[var(--color-bg-secondary)] cursor-pointer",children:[e.jsx("td",{className:"px-3 py-1.5 max-w-[200px] truncate",children:s.title}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded font-medium",style:{background:`${_[s.type]}20`,color:_[s.type]},children:s.type})}),e.jsx("td",{className:"px-3 py-1.5",children:e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full font-medium",style:{background:`${L[s.status]}20`,color:L[s.status]},children:s.status.replace("_"," ")})}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.priority}),e.jsx("td",{className:"px-3 py-1.5 text-center",children:s.xpSize||"-"}),e.jsx("td",{className:"px-3 py-1.5",children:s.sprint||"-"})]},s.id))})]})}),i>1&&e.jsxs("div",{className:"flex items-center justify-between px-4 py-1.5 bg-[var(--color-bg-secondary)] border-t border-[var(--color-border)] text-xs text-[var(--color-text-muted)]",children:[e.jsxs("span",{children:[g.length," nodes"]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{disabled:c===0,onClick:()=>v(s=>Math.max(0,s-1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Prev"}),e.jsxs("span",{children:[c+1,"/",i]}),e.jsx("button",{disabled:c>=i-1,onClick:()=>v(s=>Math.min(i-1,s+1)),className:"px-2 py-0.5 rounded border border-[var(--color-border)] disabled:opacity-30",children:"Next"})]})]})]})}),fe=["depends_on","blocks","parent_of","child_of","related_to","priority_over","implements","derived_from"];function ge({fromId:o,toId:p,fromTitle:y,toTitle:m,onCreated:N,onCancel:h}){const[f,b]=t.useState("depends_on"),[n,c]=t.useState(""),[v,a]=t.useState(!1),[g,i]=t.useState(null),j=t.useCallback(async()=>{a(!0),i(null);try{await X.createEdge({from:o,to:p,relationType:f,reason:n.trim()||void 0}),N()}catch(l){i(l instanceof Error?l.message:"Failed to create edge")}finally{a(!1)}},[o,p,f,n,N]);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"bg-[var(--color-bg)] border border-[var(--color-border)] rounded-lg shadow-xl w-96 p-4",children:[e.jsx("h3",{className:"text-sm font-bold mb-3",children:"Create Relationship"}),e.jsxs("div",{className:"space-y-3 text-sm",children:[e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"From"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:y??o})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"To"}),e.jsx("div",{className:"text-xs bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded truncate",children:m??p})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Relation Type"}),e.jsx("select",{value:f,onChange:l=>b(l.target.value),className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]",children:fe.map(l=>{const k=me[l];return e.jsx("option",{value:l,children:k.label},l)})})]}),e.jsxs("div",{children:[e.jsx("label",{className:"text-xs text-[var(--color-text-muted)] block mb-1",children:"Reason (optional)"}),e.jsx("input",{type:"text",value:n,onChange:l=>c(l.target.value),placeholder:"Why this relationship exists...",className:"w-full text-xs px-2 py-1.5 rounded bg-[var(--color-bg-tertiary)] border border-[var(--color-border)] focus:outline-none focus:border-[var(--color-accent)]"})]}),g&&e.jsx("div",{className:"text-xs text-[var(--color-danger)] bg-[var(--color-bg-tertiary)] px-2 py-1.5 rounded",children:g})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-4",children:[e.jsx("button",{onClick:h,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-bg-tertiary)] hover:bg-[var(--color-border)] transition-colors",children:"Cancel"}),e.jsx("button",{onClick:j,disabled:v,className:"text-xs px-3 py-1.5 rounded bg-[var(--color-accent)] text-white font-medium disabled:opacity-50 hover:opacity-90 transition-opacity",children:v?"Creating...":"Create"})]})]})})}const ve={workflowNode:ce},ye={workflowEdge:ne},Ne={hideAttribution:!0};function je({graph:o}){var P,F;const[p,y,m]=ee([]),[N,h,f]=se([]),[b,n]=t.useState(null),[c,v]=t.useState("TB"),[a,g]=t.useState(new Set),[i,j]=t.useState(new Set),[l,k]=t.useState(!1),[s,u]=t.useState(null),C=t.useDeferredValue(a),w=t.useDeferredValue(i),S=t.useDeferredValue(c),D=t.useRef(null),R=t.useCallback((r,x,d)=>{const q=M(o.nodes,l),I=te(q,{statuses:r,types:x}),T=I.map(Q=>Q.id);if(re(D.current,T)&&d===S)return;D.current=T;const H=new Set(T),J=ae(o.edges,H),A=oe(I,J,d);y(A.nodes),h(A.edges)},[o,y,h,S,l]);t.useEffect(()=>{R(C,w,S)},[o,R,C,w,S]);const z=t.useCallback((r,x)=>{n(x.data.sourceNode)},[]),O=t.useCallback(r=>{n(r)},[]),G=t.useCallback(r=>{const x=o.nodes.find(d=>d.id===r);x&&n(x)},[o.nodes]),W=t.useCallback(r=>{r.source&&r.target&&r.source!==r.target&&u({fromId:r.source,toId:r.target})},[]),B=t.useCallback(()=>{u(null)},[]),V=t.useCallback(r=>{g(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Y=t.useCallback(r=>{j(x=>{const d=new Set(x);return d.has(r)?d.delete(r):d.add(r),d})},[]),Z=t.useCallback(()=>{g(new Set),j(new Set)},[]),K=t.useMemo(()=>M(o.nodes,l).filter(x=>!(a.size&&!a.has(x.status)||i.size&&!i.has(x.type))),[o.nodes,a,i,l]),U=s?(P=o.nodes.find(r=>r.id===s.fromId))==null?void 0:P.title:void 0,$=s?(F=o.nodes.find(r=>r.id===s.toId))==null?void 0:F.title:void 0;return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx(be,{statuses:a,types:i,direction:c,onStatusToggle:V,onTypeToggle:Y,onDirectionChange:v,onClear:Z,showFullGraph:l,totalNodeCount:o.nodes.length,onShowFullGraphChange:k}),e.jsxs("div",{className:"flex flex-1 min-h-0",children:[e.jsx("div",{className:"flex-1 relative",children:o.nodes.length===0?e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("p",{className:"text-lg mb-2",children:"No nodes in graph"}),e.jsx("p",{className:"text-sm",children:"Import a PRD to get started"})]})}):e.jsxs(le,{nodes:p,edges:N,onNodesChange:m,onEdgesChange:f,onNodeClick:z,onConnect:W,nodeTypes:ve,edgeTypes:ye,nodesDraggable:!1,nodesConnectable:!0,fitView:!0,minZoom:.1,maxZoom:2,proOptions:Ne,children:[e.jsx(de,{gap:16,size:1}),e.jsx(ie,{showInteractive:!1})]})}),b&&e.jsx(xe,{node:b,edges:o.edges,allNodes:o.nodes,onClose:()=>n(null),onNodeNavigate:G})]}),e.jsx(he,{nodes:K,onNodeClick:O}),s&&e.jsx(ge,{fromId:s.fromId,toId:s.toId,fromTitle:U,toTitle:$,onCreated:B,onCancel:()=>u(null)})]})}function Te({graph:o}){return e.jsx("div",{className:"h-full",children:e.jsx(je,{graph:o})})}export{Te as GraphTab};
|