claude-code-workflow 7.2.9 → 7.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/cli-planning-agent.md +3 -0
- package/.claude/agents/debug-explore-agent.md +1 -0
- package/.claude/agents/tdd-developer.md +1 -0
- package/.claude/agents/team-worker.md +1 -1
- package/.claude/agents/test-action-planning-agent.md +3 -0
- package/.claude/agents/test-context-search-agent.md +1 -0
- package/.claude/agents/test-fix-agent.md +3 -0
- package/.claude/skills/review-code/SKILL.md +2 -0
- package/.claude/skills/review-cycle/SKILL.md +4 -0
- package/.claude/skills/skill-simplify/phases/02-optimize.md +4 -0
- package/.claude/skills/spec-generator/phases/05-epics-stories.md +4 -0
- package/.claude/skills/team-arch-opt/specs/team-config.json +5 -5
- package/.claude/skills/team-frontend-debug/roles/analyzer/role.md +3 -2
- package/.claude/skills/team-perf-opt/roles/coordinator/commands/monitor.md +1 -1
- package/.claude/skills/team-perf-opt/specs/team-config.json +5 -5
- package/.claude/skills/team-quality-assurance/roles/executor/role.md +2 -1
- package/.claude/skills/team-review/roles/reviewer/role.md +2 -1
- package/.claude/skills/team-tech-debt/roles/scanner/role.md +2 -1
- package/.claude/skills/team-testing/roles/executor/role.md +2 -1
- package/.claude/skills/team-testing/roles/generator/role.md +2 -1
- package/.claude/skills/team-ultra-analyze/roles/explorer/role.md +2 -1
- package/.claude/skills/team-ux-improve/specs/team-config.json +6 -6
- package/.claude/skills/workflow-execute/phases/06-review.md +4 -4
- package/.claude/skills/workflow-lite-test-review/SKILL.md +2 -0
- package/.claude/skills/workflow-plan/phases/05-plan-verify.md +4 -0
- package/.claude/skills/workflow-tdd-plan/phases/02-context-gathering.md +1 -0
- package/.claude/skills/workflow-tdd-plan/phases/05-tdd-task-generation.md +2 -1
- package/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +1 -0
- package/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md +2 -1
- package/.claude/skills/workflow-tune/SKILL.md +487 -0
- package/.claude/skills/workflow-tune/phases/01-setup.md +548 -0
- package/.claude/skills/workflow-tune/phases/02-step-execute.md +197 -0
- package/.claude/skills/workflow-tune/phases/03-step-analyze.md +386 -0
- package/.claude/skills/workflow-tune/phases/04-synthesize.md +257 -0
- package/.claude/skills/workflow-tune/phases/05-optimize-report.md +246 -0
- package/.claude/skills/workflow-tune/specs/workflow-eval-criteria.md +57 -0
- package/.claude/skills/workflow-tune/templates/step-analysis-prompt.md +88 -0
- package/.claude/skills/workflow-tune/templates/synthesis-prompt.md +90 -0
- package/.codex/skills/analyze-with-file/SKILL.md +64 -103
- package/.codex/skills/debug-with-file/SKILL.md +4 -0
- package/.codex/skills/issue-discover/SKILL.md +1 -0
- package/.codex/skills/review-cycle/phases/02-parallel-review.md +3 -0
- package/.codex/skills/roadmap-with-file/SKILL.md +11 -17
- package/.codex/skills/team-designer/agents/validation-reporter.md +186 -0
- package/.codex/skills/team-iterdev/agents/gc-controller.md +193 -0
- package/.codex/skills/team-iterdev/agents/task-analyzer.md +206 -0
- package/.codex/skills/team-lifecycle-v4/agents/quality-gate.md +165 -0
- package/.codex/skills/team-lifecycle-v4/agents/requirement-clarifier.md +163 -0
- package/.codex/skills/team-lifecycle-v4/agents/supervisor.md +182 -0
- package/.codex/skills/team-uidesign/agents/completion-handler.md +177 -0
- package/.codex/skills/team-uidesign/agents/gc-loop-handler.md +162 -0
- package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +4 -0
- package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +2 -0
- package/ccw/dist/commands/spec.d.ts.map +1 -1
- package/ccw/dist/commands/spec.js +9 -4
- package/ccw/dist/commands/spec.js.map +1 -1
- package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/codexlens-routes.js +3 -1
- package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
- package/ccw/dist/tools/spec-index-builder.d.ts +8 -4
- package/ccw/dist/tools/spec-index-builder.d.ts.map +1 -1
- package/ccw/dist/tools/spec-index-builder.js +8 -4
- package/ccw/dist/tools/spec-index-builder.js.map +1 -1
- package/ccw/dist/tools/spec-init.d.ts +1 -1
- package/ccw/dist/tools/spec-init.d.ts.map +1 -1
- package/ccw/dist/tools/spec-init.js +127 -0
- package/ccw/dist/tools/spec-init.js.map +1 -1
- package/ccw/dist/tools/spec-loader.d.ts.map +1 -1
- package/ccw/dist/tools/spec-loader.js +2 -1
- package/ccw/dist/tools/spec-loader.js.map +1 -1
- package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js → AlertDialog-BW9jiZ-p.js} +2 -2
- package/ccw/frontend/dist/assets/{AlertDialog-gTMl4gSG.js.map → AlertDialog-BW9jiZ-p.js.map} +1 -1
- package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js → AnalysisPage-ds-w_nVO.js} +2 -2
- package/ccw/frontend/dist/assets/{AnalysisPage-Bc4p4SvJ.js.map → AnalysisPage-ds-w_nVO.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js → ApiSettingsPage-DlCbXxTz.js} +2 -2
- package/ccw/frontend/dist/assets/{ApiSettingsPage-CVK108u2.js.map → ApiSettingsPage-DlCbXxTz.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js → CliModeToggle-Dq3nL4fF.js} +2 -2
- package/ccw/frontend/dist/assets/{CliModeToggle-34Sjwl05.js.map → CliModeToggle-Dq3nL4fF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js → CliSessionSharePage-BNDkEE4u.js} +2 -2
- package/ccw/frontend/dist/assets/{CliSessionSharePage-bJZAYI38.js.map → CliSessionSharePage-BNDkEE4u.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js → CliViewerPage-ChM-uNx_.js} +2 -2
- package/ccw/frontend/dist/assets/{CliViewerPage-VYnQGjxU.js.map → CliViewerPage-ChM-uNx_.js.map} +1 -1
- package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js +2 -0
- package/ccw/frontend/dist/assets/CodexLensPage-DOcsYNQk.js.map +1 -0
- package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js → Collapsible-CRNbykXN.js} +2 -2
- package/ccw/frontend/dist/assets/{Collapsible-B_xd1Qbg.js.map → Collapsible-CRNbykXN.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js → CommandsManagerPage-C2JWcemF.js} +2 -2
- package/ccw/frontend/dist/assets/{CommandsManagerPage-Bjx1bPbH.js.map → CommandsManagerPage-C2JWcemF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js → DeepWikiPage-CvleOtJy.js} +2 -2
- package/ccw/frontend/dist/assets/{DeepWikiPage-EgHsHvAH.js.map → DeepWikiPage-CvleOtJy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js → EndpointsPage-CMOWQG64.js} +2 -2
- package/ccw/frontend/dist/assets/{EndpointsPage-CuwpbCzK.js.map → EndpointsPage-CMOWQG64.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js → ExplorerPage-DaFPRlNo.js} +2 -2
- package/ccw/frontend/dist/assets/{ExplorerPage-cvlx0Zw0.js.map → ExplorerPage-DaFPRlNo.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js → FixSessionPage-CC4p04Az.js} +2 -2
- package/ccw/frontend/dist/assets/{FixSessionPage-C74-MPza.js.map → FixSessionPage-CC4p04Az.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js → FloatingFileBrowser-DROn1xZ5.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-x_-6y_n2.js.map → FloatingFileBrowser-DROn1xZ5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js → FloatingPanel-CmL_yhDv.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingPanel-BGwmbJR1.js.map → FloatingPanel-CmL_yhDv.js.map} +1 -1
- package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js → GraphExplorerPage-DCV5ybKE.js} +2 -2
- package/ccw/frontend/dist/assets/{GraphExplorerPage-Bg5-aQxi.js.map → GraphExplorerPage-DCV5ybKE.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js → HistoryPage-D0fYQZgc.js} +2 -2
- package/ccw/frontend/dist/assets/{HistoryPage-C00fh0HE.js.map → HistoryPage-D0fYQZgc.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js → HookManagerPage-D2FuJfsM.js} +2 -2
- package/ccw/frontend/dist/assets/{HookManagerPage-CtVTB_ae.js.map → HookManagerPage-D2FuJfsM.js.map} +1 -1
- package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js → InstallationsPage-tjklillZ.js} +2 -2
- package/ccw/frontend/dist/assets/{InstallationsPage-CYuMQDbC.js.map → InstallationsPage-tjklillZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js → IssueHubPage-E4JVrhO1.js} +2 -2
- package/ccw/frontend/dist/assets/{IssueHubPage-T_VSvUMh.js.map → IssueHubPage-E4JVrhO1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js → LiteTasksPage-aJuRoyLt.js} +2 -2
- package/ccw/frontend/dist/assets/{LiteTasksPage-DmcgvIvi.js.map → LiteTasksPage-aJuRoyLt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js → McpManagerPage-BJeuWJv1.js} +2 -2
- package/ccw/frontend/dist/assets/{McpManagerPage-C_a7QSKz.js.map → McpManagerPage-BJeuWJv1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js → MemoryPage-BI4FAXhs.js} +2 -2
- package/ccw/frontend/dist/assets/{MemoryPage-CWKmXY5k.js.map → MemoryPage-BI4FAXhs.js.map} +1 -1
- package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js → NotFoundPage-DD2svchp.js} +2 -2
- package/ccw/frontend/dist/assets/{NotFoundPage-B1duXK6r.js.map → NotFoundPage-DD2svchp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js → OrchestratorPage-FC__7yYa.js} +2 -2
- package/ccw/frontend/dist/assets/{OrchestratorPage-Ib9TM6HE.js.map → OrchestratorPage-FC__7yYa.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js → ProjectOverviewPage-DBB_-FzV.js} +2 -2
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-sXSWMbF8.js.map → ProjectOverviewPage-DBB_-FzV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js → PromptHistoryPage-BwOAvCH8.js} +2 -2
- package/ccw/frontend/dist/assets/{PromptHistoryPage-B6jaqG12.js.map → PromptHistoryPage-BwOAvCH8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js → ReviewSessionPage-Dd1-g_gp.js} +2 -2
- package/ccw/frontend/dist/assets/{ReviewSessionPage-D5qJyr3s.js.map → ReviewSessionPage-Dd1-g_gp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js → RulesManagerPage-B3RGdsKD.js} +2 -2
- package/ccw/frontend/dist/assets/{RulesManagerPage-DyawK8QE.js.map → RulesManagerPage-B3RGdsKD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js → SessionDetailPage-DM-W5R8K.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionDetailPage-Cym_RvC9.js.map → SessionDetailPage-DM-W5R8K.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js → SessionsPage-BVz1KCc7.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionsPage-Dkc1Hv8W.js.map → SessionsPage-BVz1KCc7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js → SettingsPage-ComW7EZS.js} +4 -4
- package/ccw/frontend/dist/assets/{SettingsPage-Rik9cUIj.js.map → SettingsPage-ComW7EZS.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js → SkillsManagerPage-CKom9XwV.js} +2 -2
- package/ccw/frontend/dist/assets/{SkillsManagerPage-BGDWYAyI.js.map → SkillsManagerPage-CKom9XwV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js → SpecsSettingsPage-DQz7WP2s.js} +2 -2
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-CTiA1DMP.js.map → SpecsSettingsPage-DQz7WP2s.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js → Switch-BPMdND9H.js} +2 -2
- package/ccw/frontend/dist/assets/{Switch-BgAFC-Wk.js.map → Switch-BPMdND9H.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js → TabsNavigation-qqt70VYL.js} +2 -2
- package/ccw/frontend/dist/assets/{TabsNavigation-drSnu5jn.js.map → TabsNavigation-qqt70VYL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js → TaskDrawer-BqK_qiHX.js} +2 -2
- package/ccw/frontend/dist/assets/{TaskDrawer-ePC__6-P.js.map → TaskDrawer-BqK_qiHX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js → TeamPage-u5_i0Rgh.js} +2 -2
- package/ccw/frontend/dist/assets/{TeamPage-C6bdFWn8.js.map → TeamPage-u5_i0Rgh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js → TerminalDashboardPage-rUtC9e40.js} +2 -2
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-Zofi_DZM.js.map → TerminalDashboardPage-rUtC9e40.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js → archive-C3u8YNQF.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-Bza1KlB9.js.map → archive-C3u8YNQF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js → archive-restore-DfQ998g5.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-restore-CpsDm-cG.js.map → archive-restore-DfQ998g5.js.map} +1 -1
- package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js → arrow-right-BshJM9Po.js} +2 -2
- package/ccw/frontend/dist/assets/{arrow-right-CibG_LVO.js.map → arrow-right-BshJM9Po.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js → bookmark-plus-D03qJyOZ.js} +2 -2
- package/ccw/frontend/dist/assets/{bookmark-plus-BheO8EgG.js.map → bookmark-plus-D03qJyOZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js → bot-CyzWuwq0.js} +2 -2
- package/ccw/frontend/dist/assets/{bot-BlhM0Nl0.js.map → bot-CyzWuwq0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js → braces-BPgtyjsG.js} +2 -2
- package/ccw/frontend/dist/assets/{braces-Dqjg_eCO.js.map → braces-BPgtyjsG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js → circle-stop-Dix1AOmw.js} +2 -2
- package/ccw/frontend/dist/assets/{circle-stop-DYZSLYU0.js.map → circle-stop-Dix1AOmw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js → cpu-CCQ4Q0Zh.js} +2 -2
- package/ccw/frontend/dist/assets/{cpu-DWCyAOAv.js.map → cpu-CCQ4Q0Zh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js → ellipsis-vertical-BpTysg-Y.js} +2 -2
- package/ccw/frontend/dist/assets/{ellipsis-vertical-DIyoSEHx.js.map → ellipsis-vertical-BpTysg-Y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js → eye-DGY1rAZs.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-DUy7aLEx.js.map → eye-DGY1rAZs.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js → eye-off-D8t3JfWG.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-off-CGRUVRDR.js.map → eye-off-D8t3JfWG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js → file-json-BAdJb0n8.js} +2 -2
- package/ccw/frontend/dist/assets/{file-json-BxLBtU9d.js.map → file-json-BAdJb0n8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js → file-text-DrJFiOUB.js} +2 -2
- package/ccw/frontend/dist/assets/{file-text-BoHsW2es.js.map → file-text-DrJFiOUB.js.map} +1 -1
- package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js → filter-CKqzYbz7.js} +2 -2
- package/ccw/frontend/dist/assets/{filter-B4vOqP6B.js.map → filter-CKqzYbz7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js → folder-CV8511y9.js} +2 -2
- package/ccw/frontend/dist/assets/{folder-BKhwCNFG.js.map → folder-CV8511y9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js → gauge-XKvmu_uU.js} +2 -2
- package/ccw/frontend/dist/assets/{gauge-Dgf64gkT.js.map → gauge-XKvmu_uU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js → globe-C56cDUzX.js} +2 -2
- package/ccw/frontend/dist/assets/{globe-Cus_S6Ux.js.map → globe-C56cDUzX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js → grid-3x3-Bya-suFW.js} +2 -2
- package/ccw/frontend/dist/assets/{grid-3x3-DM08hpAN.js.map → grid-3x3-Bya-suFW.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js → hard-drive-CmuTZpsB.js} +2 -2
- package/ccw/frontend/dist/assets/{hard-drive-eCtll84F.js.map → hard-drive-CmuTZpsB.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hash-Bd1RD285.js → hash-CRPT_tJQ.js} +2 -2
- package/ccw/frontend/dist/assets/{hash-Bd1RD285.js.map → hash-CRPT_tJQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{history-eyyCQA6b.js → history-C1pJZQCL.js} +2 -2
- package/ccw/frontend/dist/assets/{history-eyyCQA6b.js.map → history-C1pJZQCL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js → index-B6TpijCe.js} +2 -2
- package/ccw/frontend/dist/assets/{index-ZnmWxcZg.js.map → index-B6TpijCe.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-b2C0iFd1.js → index-Bcq-7r6F.js} +2 -2
- package/ccw/frontend/dist/assets/{index-b2C0iFd1.js.map → index-Bcq-7r6F.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js → index-CI8-rBff.js} +2 -2
- package/ccw/frontend/dist/assets/{index-Cs2ShCCy.js.map → index-CI8-rBff.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-CY6Lueph.js → index-Dmt9OiEf.js} +2 -2
- package/ccw/frontend/dist/assets/{index-CY6Lueph.js.map → index-Dmt9OiEf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-DfeBbFXo.js → index-anSMmEF8.js} +2 -2
- package/ccw/frontend/dist/assets/{index-DfeBbFXo.js.map → index-anSMmEF8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-B6I7GQC5.js → index-dWT2M6Ef.js} +4 -4
- package/ccw/frontend/dist/assets/{index-B6I7GQC5.js.map → index-dWT2M6Ef.js.map} +1 -1
- package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js → layout-grid-TSO0BFQE.js} +2 -2
- package/ccw/frontend/dist/assets/{layout-grid-ChrTrCby.js.map → layout-grid-TSO0BFQE.js.map} +1 -1
- package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js → lightbulb-Caj6fIQD.js} +2 -2
- package/ccw/frontend/dist/assets/{lightbulb-CvXiTlzN.js.map → lightbulb-Caj6fIQD.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js → link-2-DE9lMxa-.js} +2 -2
- package/ccw/frontend/dist/assets/{link-2-W0Nl17ec.js.map → link-2-DE9lMxa-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-CL4JmoHb.js → link-BZtPgLW0.js} +2 -2
- package/ccw/frontend/dist/assets/{link-CL4JmoHb.js.map → link-BZtPgLW0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{list-CDmYFcio.js → list-DubWyY-U.js} +2 -2
- package/ccw/frontend/dist/assets/{list-CDmYFcio.js.map → list-DubWyY-U.js.map} +1 -1
- package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js → map-pin-DwN_48AF.js} +2 -2
- package/ccw/frontend/dist/assets/{map-pin-0Mfsw_3d.js.map → map-pin-DwN_48AF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js → messages-square-bjxvaiM9.js} +2 -2
- package/ccw/frontend/dist/assets/{messages-square-C6h08ple.js.map → messages-square-bjxvaiM9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js → minimize-2-CGfBKD_V.js} +2 -2
- package/ccw/frontend/dist/assets/{minimize-2-Cbu2yRzi.js.map → minimize-2-CGfBKD_V.js.map} +1 -1
- package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js → package-nzWY6ilt.js} +2 -2
- package/ccw/frontend/dist/assets/{package-CoLVUZGJ.js.map → package-nzWY6ilt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js → plug-CiLce49C.js} +2 -2
- package/ccw/frontend/dist/assets/{plug-BYTYqsw1.js.map → plug-CiLce49C.js.map} +1 -1
- package/ccw/frontend/dist/assets/{power-DmIojFl-.js → power-CFLmB-U9.js} +2 -2
- package/ccw/frontend/dist/assets/{power-DmIojFl-.js.map → power-CFLmB-U9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{save-BFa03OnG.js → save-DuO6OF0C.js} +2 -2
- package/ccw/frontend/dist/assets/{save-BFa03OnG.js.map → save-DuO6OF0C.js.map} +1 -1
- package/ccw/frontend/dist/assets/{send-Vet3sN4J.js → send-CZk9p0mM.js} +2 -2
- package/ccw/frontend/dist/assets/{send-Vet3sN4J.js.map → send-CZk9p0mM.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js → square-check-big-BY_1YQQg.js} +2 -2
- package/ccw/frontend/dist/assets/{square-check-big-B9nzZRfE.js.map → square-check-big-BY_1YQQg.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js → square-pen-CnZgm6g-.js} +2 -2
- package/ccw/frontend/dist/assets/{square-pen-C7K13x4Z.js.map → square-pen-CnZgm6g-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{star-BCQHcnSe.js → star-Cn1F0qy7.js} +2 -2
- package/ccw/frontend/dist/assets/{star-BCQHcnSe.js.map → star-Cn1F0qy7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{style-CJsrp48L.js → style-Dxs1iXCV.js} +2 -2
- package/ccw/frontend/dist/assets/{style-CJsrp48L.js.map → style-Dxs1iXCV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{target-CBzCJCB1.js → target-Bz1fLRKH.js} +2 -2
- package/ccw/frontend/dist/assets/{target-CBzCJCB1.js.map → target-Bz1fLRKH.js.map} +1 -1
- package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js → test-tube-C6qCYlDr.js} +2 -2
- package/ccw/frontend/dist/assets/{test-tube-BYTc5mvQ.js.map → test-tube-C6qCYlDr.js.map} +1 -1
- package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js → upload-C71kd4Qs.js} +2 -2
- package/ccw/frontend/dist/assets/{upload-DzyQj7ib.js.map → upload-C71kd4Qs.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js → useApiSettings-CqP2BAJ7.js} +2 -2
- package/ccw/frontend/dist/assets/{useApiSettings-CFPww7gU.js.map → useApiSettings-CqP2BAJ7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js → useCli-PCoPoVeM.js} +2 -2
- package/ccw/frontend/dist/assets/{useCli-ByL_a5CD.js.map → useCli-PCoPoVeM.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js → useCommands-3OfPQPw4.js} +2 -2
- package/ccw/frontend/dist/assets/{useCommands-BvKIoOzB.js.map → useCommands-3OfPQPw4.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js → useDebounce-bXiFhQx9.js} +2 -2
- package/ccw/frontend/dist/assets/{useDebounce-CmKmoP7n.js.map → useDebounce-bXiFhQx9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js → useFileExplorer-DEyUm46_.js} +2 -2
- package/ccw/frontend/dist/assets/{useFileExplorer-G5UoArCU.js.map → useFileExplorer-DEyUm46_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js → useLocale-sXTrdxcJ.js} +2 -2
- package/ccw/frontend/dist/assets/{useLocale-D2iHK44M.js.map → useLocale-sXTrdxcJ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js → useSkills-D0W0kXYm.js} +3 -3
- package/ccw/frontend/dist/assets/{useSkills-CYU4zqhm.js.map → useSkills-D0W0kXYm.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js → useSystemSettings-DZ-8lZsG.js} +2 -2
- package/ccw/frontend/dist/assets/{useSystemSettings-JznNpij7.js.map → useSystemSettings-DZ-8lZsG.js.map} +1 -1
- package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js → wand-sparkles-83GmAYuw.js} +2 -2
- package/ccw/frontend/dist/assets/{wand-sparkles-DqS0VCeN.js.map → wand-sparkles-83GmAYuw.js.map} +1 -1
- package/ccw/frontend/dist/index.html +1 -1
- package/package.json +1 -1
- package/.claude/skills/team-arch-opt/role-specs/analyzer.md +0 -80
- package/.claude/skills/team-arch-opt/role-specs/designer.md +0 -118
- package/.claude/skills/team-arch-opt/role-specs/refactorer.md +0 -106
- package/.claude/skills/team-arch-opt/role-specs/reviewer.md +0 -116
- package/.claude/skills/team-arch-opt/role-specs/validator.md +0 -117
- package/.claude/skills/team-brainstorm/role-specs/challenger.md +0 -63
- package/.claude/skills/team-brainstorm/role-specs/evaluator.md +0 -58
- package/.claude/skills/team-brainstorm/role-specs/ideator.md +0 -71
- package/.claude/skills/team-brainstorm/role-specs/synthesizer.md +0 -59
- package/.claude/skills/team-frontend/role-specs/analyst.md +0 -91
- package/.claude/skills/team-frontend/role-specs/architect.md +0 -85
- package/.claude/skills/team-frontend/role-specs/developer.md +0 -92
- package/.claude/skills/team-frontend/role-specs/qa.md +0 -78
- package/.claude/skills/team-issue/role-specs/explorer.md +0 -95
- package/.claude/skills/team-issue/role-specs/implementer.md +0 -89
- package/.claude/skills/team-issue/role-specs/integrator.md +0 -86
- package/.claude/skills/team-issue/role-specs/planner.md +0 -83
- package/.claude/skills/team-issue/role-specs/reviewer.md +0 -89
- package/.claude/skills/team-iterdev/role-specs/architect.md +0 -64
- package/.claude/skills/team-iterdev/role-specs/developer.md +0 -73
- package/.claude/skills/team-iterdev/role-specs/reviewer.md +0 -65
- package/.claude/skills/team-iterdev/role-specs/tester.md +0 -87
- package/.claude/skills/team-perf-opt/role-specs/benchmarker.md +0 -110
- package/.claude/skills/team-perf-opt/role-specs/optimizer.md +0 -102
- package/.claude/skills/team-perf-opt/role-specs/profiler.md +0 -73
- package/.claude/skills/team-perf-opt/role-specs/reviewer.md +0 -91
- package/.claude/skills/team-perf-opt/role-specs/strategist.md +0 -114
- package/.claude/skills/team-planex/role-specs/executor.md +0 -90
- package/.claude/skills/team-planex/role-specs/planner.md +0 -110
- package/.claude/skills/team-quality-assurance/role-specs/analyst.md +0 -79
- package/.claude/skills/team-quality-assurance/role-specs/executor.md +0 -64
- package/.claude/skills/team-quality-assurance/role-specs/generator.md +0 -67
- package/.claude/skills/team-quality-assurance/role-specs/scout.md +0 -66
- package/.claude/skills/team-quality-assurance/role-specs/strategist.md +0 -70
- package/.claude/skills/team-review/role-specs/fixer.md +0 -75
- package/.claude/skills/team-review/role-specs/reviewer.md +0 -66
- package/.claude/skills/team-review/role-specs/scanner.md +0 -70
- package/.claude/skills/team-roadmap-dev/role-specs/executor.md +0 -71
- package/.claude/skills/team-roadmap-dev/role-specs/planner.md +0 -77
- package/.claude/skills/team-roadmap-dev/role-specs/verifier.md +0 -73
- package/.claude/skills/team-tech-debt/role-specs/assessor.md +0 -70
- package/.claude/skills/team-tech-debt/role-specs/executor.md +0 -80
- package/.claude/skills/team-tech-debt/role-specs/planner.md +0 -71
- package/.claude/skills/team-tech-debt/role-specs/scanner.md +0 -85
- package/.claude/skills/team-tech-debt/role-specs/validator.md +0 -83
- package/.claude/skills/team-testing/role-specs/analyst.md +0 -94
- package/.claude/skills/team-testing/role-specs/executor.md +0 -97
- package/.claude/skills/team-testing/role-specs/generator.md +0 -96
- package/.claude/skills/team-testing/role-specs/strategist.md +0 -82
- package/.claude/skills/team-uidesign/role-specs/designer.md +0 -72
- package/.claude/skills/team-uidesign/role-specs/implementer.md +0 -74
- package/.claude/skills/team-uidesign/role-specs/researcher.md +0 -84
- package/.claude/skills/team-uidesign/role-specs/reviewer.md +0 -70
- package/.claude/skills/team-ux-improve/role-specs/designer.md +0 -191
- package/.claude/skills/team-ux-improve/role-specs/diagnoser.md +0 -110
- package/.claude/skills/team-ux-improve/role-specs/explorer.md +0 -109
- package/.claude/skills/team-ux-improve/role-specs/implementer.md +0 -164
- package/.claude/skills/team-ux-improve/role-specs/scanner.md +0 -117
- package/.claude/skills/team-ux-improve/role-specs/tester.md +0 -163
- package/.codex/skills/analyze-with-file/EXECUTE.md +0 -716
- package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js +0 -2
- package/ccw/frontend/dist/assets/CodexLensPage-My6DnfN6.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandsManagerPage-Bjx1bPbH.js","sources":["../../src/components/commands/CommandGroupAccordion.tsx","../../src/components/shared/CommandCreateDialog.tsx","../../src/pages/CommandsManagerPage.tsx"],"sourcesContent":["// ========================================\n// CommandGroupAccordion Component\n// ========================================\n// Accordion component for displaying command groups with toggle switches\n\nimport * as React from 'react';\nimport { useIntl } from 'react-intl';\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Badge } from '@/components/ui/Badge';\nimport { Switch } from '@/components/ui/Switch';\nimport {\n Collapsible,\n CollapsibleTrigger,\n CollapsibleContent,\n} from '@/components/ui/Collapsible';\nimport type { Command } from '@/lib/api';\n\nexport interface CommandGroupAccordionProps {\n /** Group name (e.g., 'cli', 'workflow', 'workflow/review') */\n groupName: string;\n /** Commands in this group */\n commands: Command[];\n /** Is this group expanded */\n isExpanded: boolean;\n /** Toggle expand/collapse */\n onToggleExpand: (groupName: string) => void;\n /** Toggle individual command enabled state */\n onToggleCommand: (name: string, enabled: boolean) => void;\n /** Toggle all commands in group */\n onToggleGroup: (groupName: string, enable: boolean) => void;\n /** Is toggling in progress */\n isToggling: boolean;\n /** Show disabled commands */\n showDisabled?: boolean;\n}\n\n/**\n * Get icon for a command group\n * Uses top-level parent's icon for nested groups\n */\nfunction getGroupIcon(groupName: string): string {\n const groupIcons: Record<string, string> = {\n cli: 'terminal',\n workflow: 'git-branch',\n memory: 'brain',\n task: 'clipboard-list',\n issue: 'alert-circle',\n loop: 'repeat',\n skill: 'sparkles',\n other: 'folder',\n };\n\n const topLevel = groupName.split('/')[0];\n return groupIcons[topLevel] || 'folder';\n}\n\n/**\n * Get color class for a command group\n * Uses top-level parent's color for nested groups\n */\nfunction getGroupColorClass(groupName: string): string {\n const groupColors: Record<string, string> = {\n cli: 'text-primary bg-primary/10',\n workflow: 'text-success bg-success/10',\n memory: 'text-indigo bg-indigo/10',\n task: 'text-warning bg-warning/10',\n issue: 'text-destructive bg-destructive/10',\n loop: 'text-purple bg-purple/10',\n skill: 'text-pink bg-pink/10',\n other: 'text-muted-foreground bg-muted',\n };\n\n const topLevel = groupName.split('/')[0];\n return groupColors[topLevel] || 'text-muted-foreground bg-muted';\n}\n\n/**\n * Format group name for display\n * Converts nested paths like 'workflow/review' -> 'Workflow > Review'\n */\nfunction formatGroupName(groupName: string): string {\n if (!groupName.includes('/')) {\n return groupName;\n }\n\n const parts = groupName.split('/');\n return parts.map(part => part.charAt(0).toUpperCase() + part.slice(1)).join(' > ');\n}\n\n/**\n * Get Lucide icon component by name\n */\nfunction getIconComponent(iconName: string): React.ComponentType<{ className?: string }> {\n const iconMap: Record<string, React.ComponentType<{ className?: string }>> = {\n terminal: ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <polyline points=\"4 17 10 11 4 5\" />\n <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\" />\n </svg>\n ),\n 'git-branch': ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <line x1=\"6\" y1=\"3\" x2=\"6\" y2=\"15\" />\n <circle cx=\"18\" cy=\"6\" r=\"3\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n <path d=\"M18 9a9 9 0 0 1-9 9\" />\n </svg>\n ),\n brain: ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.96-3.08 3 3 0 0 1-.34-5.58 2.5 2.5 0 0 1 1.32-4.24 2.5 2.5 0 0 1 1.98-3A2.5 2.5 0 0 1 9.5 2Z\" />\n <path d=\"M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.96-3.08 3 3 0 0 0 .34-5.58 2.5 2.5 0 0 0-1.32-4.24 2.5 2.5 0 0 0-1.98-3A2.5 2.5 0 0 0 14.5 2Z\" />\n </svg>\n ),\n 'clipboard-list': ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <rect width=\"8\" height=\"4\" x=\"8\" y=\"2\" rx=\"1\" ry=\"1\" />\n <path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" />\n <path d=\"M12 11h4\" />\n <path d=\"M12 16h4\" />\n <path d=\"M8 11h.01\" />\n <path d=\"M8 16h.01\" />\n </svg>\n ),\n 'alert-circle': ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n ),\n repeat: ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"m17 2 4 4-4 4\" />\n <path d=\"M3 11V9a4 4 0 0 1 4-4h14\" />\n <path d=\"m7 22-4-4 4-4\" />\n <path d=\"M21 13v2a4 4 0 0 1-4 4H3\" />\n </svg>\n ),\n sparkles: ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z\" />\n <path d=\"M5 3v4\" />\n <path d=\"M19 17v4\" />\n <path d=\"M3 5h4\" />\n <path d=\"M17 19h4\" />\n </svg>\n ),\n folder: ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z\" />\n </svg>\n ),\n };\n\n return iconMap[iconName] || iconMap.folder;\n}\n\n/**\n * CommandGroupAccordion component\n * Displays a collapsible group of commands with toggle switches\n */\nexport function CommandGroupAccordion({\n groupName,\n commands,\n isExpanded,\n onToggleExpand,\n onToggleCommand,\n onToggleGroup,\n isToggling,\n showDisabled = false,\n}: CommandGroupAccordionProps) {\n const { formatMessage } = useIntl();\n\n const enabledCommands = commands.filter((cmd) => cmd.enabled);\n const allEnabled = enabledCommands.length === commands.length && commands.length > 0;\n\n // Filter commands based on showDisabled setting\n const visibleCommands = showDisabled ? commands : enabledCommands;\n\n const iconName = getGroupIcon(groupName);\n const colorClass = getGroupColorClass(groupName);\n const displayName = formatGroupName(groupName);\n const IconComponent = getIconComponent(iconName);\n const indentLevel = (groupName.match(/\\//g) || []).length;\n\n const handleToggleGroup = (checked: boolean) => {\n onToggleGroup(groupName, checked);\n };\n\n return (\n <div className={cn('mb-4', indentLevel > 0 && 'ml-5')} style={indentLevel > 0 ? { marginLeft: `${indentLevel * 20}px` } : undefined}>\n <Collapsible open={isExpanded} onOpenChange={() => onToggleExpand(groupName)}>\n {/* Group Header */}\n <div className=\"flex items-center justify-between px-4 py-3 bg-card border border-border rounded-lg hover:bg-muted/50 transition-colors\">\n <CollapsibleTrigger asChild>\n <div className=\"flex items-center gap-3 flex-1 cursor-pointer\">\n {isExpanded ? (\n <ChevronDown className=\"w-5 h-5 text-muted-foreground transition-transform\" />\n ) : (\n <ChevronRight className=\"w-5 h-5 text-muted-foreground transition-transform\" />\n )}\n <div className={cn('w-8 h-8 rounded-lg flex items-center justify-center', colorClass)}>\n <IconComponent className=\"w-4 h-4\" />\n </div>\n <div>\n <h3 className=\"text-base font-semibold text-foreground\">{displayName}</h3>\n <p className=\"text-xs text-muted-foreground\">\n {enabledCommands.length}/{commands.length} {formatMessage({ id: 'commands.group.enabled' })}\n </p>\n </div>\n </div>\n </CollapsibleTrigger>\n\n <div className=\"flex items-center gap-3\">\n {/* Group Toggle Switch */}\n <Switch\n checked={allEnabled}\n onCheckedChange={handleToggleGroup}\n disabled={isToggling || commands.length === 0}\n className={cn('data-[state=checked]:bg-success')}\n title={\n allEnabled\n ? formatMessage({ id: 'commands.group.clickToDisableAll' })\n : formatMessage({ id: 'commands.group.clickToEnableAll' })\n }\n />\n <Badge variant=\"secondary\" className=\"text-xs\">\n {commands.length}\n </Badge>\n </div>\n </div>\n\n {/* Group Content - Commands Table */}\n <CollapsibleContent className=\"mt-3\">\n <div className=\"bg-card border border-border rounded-lg overflow-hidden\">\n <table className=\"w-full\" style={{ tableLayout: 'fixed' }}>\n <colgroup>\n <col style={{ width: '200px' }} />\n <col style={{ width: 'auto' }} />\n <col style={{ width: '100px' }} />\n <col style={{ width: '80px' }} />\n </colgroup>\n <thead className=\"bg-muted/30 border-b border-border\">\n <tr>\n <th className=\"px-4 py-2 text-left text-xs font-medium text-muted-foreground uppercase\">\n {formatMessage({ id: 'commands.table.name' })}\n </th>\n <th className=\"px-4 py-2 text-left text-xs font-medium text-muted-foreground uppercase\">\n {formatMessage({ id: 'commands.table.description' })}\n </th>\n <th className=\"px-4 py-2 text-center text-xs font-medium text-muted-foreground uppercase\">\n {formatMessage({ id: 'commands.table.scope' })}\n </th>\n <th className=\"px-4 py-2 text-center text-xs font-medium text-muted-foreground uppercase\">\n {formatMessage({ id: 'commands.table.status' })}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {visibleCommands.map((command) => (\n <CommandRow\n key={`${command.name}-${command.location || 'default'}`}\n command={command}\n onToggle={onToggleCommand}\n disabled={isToggling}\n />\n ))}\n {visibleCommands.length === 0 && (\n <tr>\n <td colSpan={4} className=\"px-4 py-8 text-center text-sm text-muted-foreground\">\n {showDisabled\n ? formatMessage({ id: 'commands.group.noCommands' })\n : formatMessage({ id: 'commands.group.noEnabledCommands' })}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </CollapsibleContent>\n </Collapsible>\n </div>\n );\n}\n\n/**\n * CommandRow component - Internal component for table row\n */\ninterface CommandRowProps {\n command: Command;\n onToggle: (name: string, enabled: boolean) => void;\n disabled?: boolean;\n}\n\nfunction CommandRow({ command, onToggle, disabled }: CommandRowProps) {\n const { formatMessage } = useIntl();\n const isDisabled = !command.enabled;\n\n return (\n <tr className={cn('hover:bg-muted/20 transition-colors', isDisabled && 'opacity-60')}>\n <td className=\"px-4 py-3 text-sm font-medium text-foreground\">\n <code className=\"break-words\">/{command.name}</code>\n </td>\n <td className=\"px-4 py-3 text-sm text-muted-foreground\">\n <div className=\"line-clamp-2 break-words\">\n {command.description || formatMessage({ id: 'commands.card.noDescription' })}\n </div>\n </td>\n <td className=\"px-4 py-3 text-center text-xs text-muted-foreground\">\n <span className=\"whitespace-nowrap\">{command.location || 'project'}</span>\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"flex justify-center\">\n <Switch\n checked={command.enabled}\n onCheckedChange={(checked) => onToggle(command.name, checked)}\n disabled={disabled}\n className=\"data-[state=checked]:bg-primary\"\n />\n </div>\n </td>\n </tr>\n );\n}\n\nexport default CommandGroupAccordion;\n","// ========================================\r\n// Command Create Dialog Component\r\n// ========================================\r\n// Modal dialog for creating/importing commands with two modes:\r\n// - Import: import existing command file\r\n// - CLI Generate: AI-generated command from description\r\n\r\nimport { useState, useCallback } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Folder,\r\n User,\r\n FileCode,\r\n Sparkles,\r\n CheckCircle,\r\n XCircle,\r\n Loader2,\r\n Info,\r\n FolderOpen,\r\n} from 'lucide-react';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n DialogTitle,\r\n DialogDescription,\r\n} from '@/components/ui/Dialog';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { Textarea } from '@/components/ui/Textarea';\r\nimport { Label } from '@/components/ui/Label';\r\nimport { validateCommandImport, createCommand } from '@/lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { FloatingFileBrowser } from '@/components/terminal-dashboard/FloatingFileBrowser';\r\nimport { cn } from '@/lib/utils';\r\n\r\nexport interface CommandCreateDialogProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onCreated: () => void;\r\n cliType?: 'claude' | 'codex';\r\n}\r\n\r\ntype CreateMode = 'import' | 'cli-generate';\r\ntype CommandLocation = 'project' | 'user';\r\n\r\ninterface ValidationResult {\r\n valid: boolean;\r\n errors?: string[];\r\n commandInfo?: { name: string; description: string; usage?: string };\r\n}\r\n\r\nexport function CommandCreateDialog({ open, onOpenChange, onCreated, cliType = 'claude' }: CommandCreateDialogProps) {\r\n const { formatMessage } = useIntl();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const [mode, setMode] = useState<CreateMode>('import');\r\n const [location, setLocation] = useState<CommandLocation>('project');\r\n\r\n // Import mode state\r\n const [sourcePath, setSourcePath] = useState('');\r\n const [customName, setCustomName] = useState('');\r\n const [validationResult, setValidationResult] = useState<ValidationResult | null>(null);\r\n const [isValidating, setIsValidating] = useState(false);\r\n\r\n // CLI Generate mode state\r\n const [commandName, setCommandName] = useState('');\r\n const [description, setDescription] = useState('');\r\n\r\n const [isCreating, setIsCreating] = useState(false);\r\n\r\n // File browser state\r\n const [isFileBrowserOpen, setIsFileBrowserOpen] = useState(false);\r\n\r\n const resetState = useCallback(() => {\r\n setMode('import');\r\n setLocation('project');\r\n setSourcePath('');\r\n setCustomName('');\r\n setValidationResult(null);\r\n setIsValidating(false);\r\n setCommandName('');\r\n setDescription('');\r\n setIsCreating(false);\r\n setIsFileBrowserOpen(false);\r\n }, []);\r\n\r\n const handleOpenChange = useCallback((open: boolean) => {\r\n if (!open) {\r\n resetState();\r\n }\r\n onOpenChange(open);\r\n }, [onOpenChange, resetState]);\r\n\r\n const handleValidate = useCallback(async () => {\r\n if (!sourcePath.trim()) return;\r\n\r\n setIsValidating(true);\r\n setValidationResult(null);\r\n\r\n try {\r\n const result = await validateCommandImport(sourcePath.trim());\r\n setValidationResult(result);\r\n } catch (err) {\r\n setValidationResult({\r\n valid: false,\r\n errors: [err instanceof Error ? err.message : String(err)],\r\n });\r\n } finally {\r\n setIsValidating(false);\r\n }\r\n }, [sourcePath]);\r\n\r\n const handleCreate = useCallback(async () => {\r\n if (mode === 'import') {\r\n if (!sourcePath.trim()) return;\r\n if (!validationResult?.valid) return;\r\n } else {\r\n if (!commandName.trim()) return;\r\n if (!description.trim()) return;\r\n }\r\n\r\n setIsCreating(true);\r\n\r\n try {\r\n await createCommand({\r\n mode,\r\n location,\r\n sourcePath: mode === 'import' ? sourcePath.trim() : undefined,\r\n commandName: mode === 'import' ? (customName.trim() || undefined) : commandName.trim(),\r\n description: mode === 'cli-generate' ? description.trim() : undefined,\r\n generationType: mode === 'cli-generate' ? 'description' : undefined,\r\n projectPath,\r\n cliType,\r\n });\r\n\r\n handleOpenChange(false);\r\n onCreated();\r\n } catch (err) {\r\n console.error('Failed to create command:', err);\r\n if (mode === 'import') {\r\n setValidationResult({\r\n valid: false,\r\n errors: [err instanceof Error ? err.message : formatMessage({ id: 'commands.create.createError' })],\r\n });\r\n }\r\n } finally {\r\n setIsCreating(false);\r\n }\r\n }, [mode, location, sourcePath, customName, commandName, description, validationResult, projectPath, handleOpenChange, onCreated, formatMessage]);\r\n\r\n const canCreate = mode === 'import'\r\n ? sourcePath.trim() && validationResult?.valid && !isCreating\r\n : commandName.trim() && description.trim() && !isCreating;\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={handleOpenChange}>\r\n <DialogContent className=\"max-w-2xl max-h-[90vh] overflow-y-auto\">\r\n <DialogHeader>\r\n <DialogTitle>{formatMessage({ id: 'commands.create.title' })}</DialogTitle>\r\n <DialogDescription>\r\n {formatMessage({ id: 'commands.description' })}\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <div className=\"space-y-5 py-2\">\r\n {/* Location Selection */}\r\n <div className=\"space-y-2\">\r\n <Label>{formatMessage({ id: 'commands.create.location' })}</Label>\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'px-4 py-3 text-left border-2 rounded-lg transition-all',\r\n location === 'project'\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-primary/50'\r\n )}\r\n onClick={() => setLocation('project')}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <Folder className=\"w-5 h-5\" />\r\n <div>\r\n <div className=\"font-medium text-sm\">{formatMessage({ id: 'commands.create.locationProject' })}</div>\r\n <div className=\"text-xs text-muted-foreground\">{`.${cliType}/commands/`}</div>\r\n </div>\r\n </div>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'px-4 py-3 text-left border-2 rounded-lg transition-all',\r\n location === 'user'\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-primary/50'\r\n )}\r\n onClick={() => setLocation('user')}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <User className=\"w-5 h-5\" />\r\n <div>\r\n <div className=\"font-medium text-sm\">{formatMessage({ id: 'commands.create.locationUser' })}</div>\r\n <div className=\"text-xs text-muted-foreground\">{`~/.${cliType}/commands/`}</div>\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Mode Selection */}\r\n <div className=\"space-y-2\">\r\n <Label>{formatMessage({ id: 'commands.create.mode' })}</Label>\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'px-4 py-3 text-left border-2 rounded-lg transition-all',\r\n mode === 'import'\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-primary/50'\r\n )}\r\n onClick={() => setMode('import')}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <FileCode className=\"w-5 h-5\" />\r\n <div>\r\n <div className=\"font-medium text-sm\">{formatMessage({ id: 'commands.create.modeImport' })}</div>\r\n <div className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'commands.create.modeImportHint' })}</div>\r\n </div>\r\n </div>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'px-4 py-3 text-left border-2 rounded-lg transition-all',\r\n mode === 'cli-generate'\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-primary/50'\r\n )}\r\n onClick={() => setMode('cli-generate')}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <Sparkles className=\"w-5 h-5\" />\r\n <div>\r\n <div className=\"font-medium text-sm\">{formatMessage({ id: 'commands.create.modeGenerate' })}</div>\r\n <div className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'commands.create.modeGenerateHint' })}</div>\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Import Mode Content */}\r\n {mode === 'import' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"sourcePath\">{formatMessage({ id: 'commands.create.sourcePath' })}</Label>\r\n <div className=\"flex gap-2\">\r\n <Input\r\n id=\"sourcePath\"\r\n value={sourcePath}\r\n onChange={(e) => {\r\n setSourcePath(e.target.value);\r\n setValidationResult(null);\r\n }}\r\n placeholder={formatMessage({ id: 'commands.create.sourcePathPlaceholder' })}\r\n className=\"font-mono text-sm flex-1\"\r\n />\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => setIsFileBrowserOpen(true)}\r\n title={formatMessage({ id: 'commands.create.browseFile' })}\r\n >\r\n <FolderOpen className=\"w-4 h-4\" />\r\n </Button>\r\n </div>\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'commands.create.sourcePathHint' })}</p>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"customName\">\r\n {formatMessage({ id: 'commands.create.customName' })}\r\n <span className=\"text-muted-foreground ml-1\">({formatMessage({ id: 'commands.create.customNameHint' })})</span>\r\n </Label>\r\n <Input\r\n id=\"customName\"\r\n value={customName}\r\n onChange={(e) => setCustomName(e.target.value)}\r\n placeholder={formatMessage({ id: 'commands.create.customNamePlaceholder' })}\r\n />\r\n </div>\r\n\r\n {/* Validation Result */}\r\n {isValidating && (\r\n <div className=\"flex items-center gap-2 p-3 bg-muted/50 rounded-lg\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'commands.create.validating' })}</span>\r\n </div>\r\n )}\r\n {validationResult && !isValidating && (\r\n validationResult.valid ? (\r\n <div className=\"p-4 bg-green-500/10 border border-green-500/20 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-green-600 mb-2\">\r\n <CheckCircle className=\"w-5 h-5\" />\r\n <span className=\"font-medium\">{formatMessage({ id: 'commands.create.validCommand' })}</span>\r\n </div>\r\n {validationResult.commandInfo && (\r\n <div className=\"space-y-1 text-sm\">\r\n <div>\r\n <span className=\"text-muted-foreground\">{formatMessage({ id: 'commands.card.name' })}: </span>\r\n <span>{validationResult.commandInfo.name}</span>\r\n </div>\r\n {validationResult.commandInfo.description && (\r\n <div>\r\n <span className=\"text-muted-foreground\">{formatMessage({ id: 'commands.card.description' })}: </span>\r\n <span>{validationResult.commandInfo.description}</span>\r\n </div>\r\n )}\r\n {validationResult.commandInfo.usage && (\r\n <div>\r\n <span className=\"text-muted-foreground\">{formatMessage({ id: 'commands.card.usage' })}: </span>\r\n <span>{validationResult.commandInfo.usage}</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"p-4 bg-destructive/10 border border-destructive/20 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-destructive mb-2\">\r\n <XCircle className=\"w-5 h-5\" />\r\n <span className=\"font-medium\">{formatMessage({ id: 'commands.create.invalidCommand' })}</span>\r\n </div>\r\n {validationResult.errors && (\r\n <ul className=\"space-y-1 text-sm\">\r\n {validationResult.errors.map((error, i) => (\r\n <li key={i} className=\"text-destructive\">{error}</li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n )\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* CLI Generate Mode Content */}\r\n {mode === 'cli-generate' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"commandName\">\r\n {formatMessage({ id: 'commands.create.commandName' })} <span className=\"text-destructive\">*</span>\r\n </Label>\r\n <Input\r\n id=\"commandName\"\r\n value={commandName}\r\n onChange={(e) => setCommandName(e.target.value)}\r\n placeholder={formatMessage({ id: 'commands.create.commandNamePlaceholder' })}\r\n />\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'commands.create.commandNameHint' })}</p>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"description\">\r\n {formatMessage({ id: 'commands.create.descriptionLabel' })} <span className=\"text-destructive\">*</span>\r\n </Label>\r\n <Textarea\r\n id=\"description\"\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n placeholder={formatMessage({ id: 'commands.create.descriptionPlaceholder' })}\r\n rows={6}\r\n />\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'commands.create.descriptionHint' })}</p>\r\n </div>\r\n\r\n <div className=\"p-3 bg-blue-500/10 border border-blue-500/20 rounded-lg\">\r\n <div className=\"flex items-start gap-2\">\r\n <Info className=\"w-4 h-4 text-blue-600 mt-0.5\" />\r\n <div className=\"text-sm text-blue-600\">\r\n <p className=\"font-medium\">{formatMessage({ id: 'commands.create.generateInfo' })}</p>\r\n <p className=\"text-xs mt-1\">{formatMessage({ id: 'commands.create.generateTimeHint' })}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <DialogFooter className=\"gap-2\">\r\n <Button variant=\"outline\" onClick={() => handleOpenChange(false)} disabled={isCreating}>\r\n {formatMessage({ id: 'commands.actions.cancel' })}\r\n </Button>\r\n {mode === 'import' && (\r\n <Button\r\n variant=\"outline\"\r\n onClick={handleValidate}\r\n disabled={!sourcePath.trim() || isValidating || isCreating}\r\n >\r\n {isValidating && <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />}\r\n {formatMessage({ id: 'commands.create.validate' })}\r\n </Button>\r\n )}\r\n <Button\r\n onClick={handleCreate}\r\n disabled={!canCreate}\r\n >\r\n {isCreating && <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />}\r\n {isCreating\r\n ? formatMessage({ id: 'commands.create.creating' })\r\n : mode === 'import'\r\n ? formatMessage({ id: 'commands.create.import' })\r\n : formatMessage({ id: 'commands.create.generate' })\r\n }\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n\r\n {/* File Browser for selecting source file */}\r\n <FloatingFileBrowser\r\n isOpen={isFileBrowserOpen}\r\n onClose={() => setIsFileBrowserOpen(false)}\r\n rootPath={projectPath}\r\n onInsertPath={(path) => {\r\n setSourcePath(path);\r\n setValidationResult(null);\r\n setIsFileBrowserOpen(false);\r\n }}\r\n initialSelectedPath={sourcePath || null}\r\n />\r\n </Dialog>\r\n );\r\n}\r\n\r\nexport default CommandCreateDialog;\r\n","// ========================================\n// Commands Manager Page\n// ========================================\n// Manage custom slash commands with search/filter\n\nimport { useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Terminal,\n Search,\n RefreshCw,\n Eye,\n EyeOff,\n CheckCircle2,\n XCircle,\n Folder,\n User,\n AlertCircle,\n Maximize2,\n Minimize2,\n Plus,\n} from 'lucide-react';\nimport { useAppStore, selectIsImmersiveMode } from '@/stores/appStore';\nimport { Card } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\nimport { useCommands, useCommandMutations } from '@/hooks';\nimport { CommandGroupAccordion } from '@/components/commands/CommandGroupAccordion';\nimport { CommandCreateDialog } from '@/components/shared/CommandCreateDialog';\nimport { cn } from '@/lib/utils';\n\n// ========== Main Page Component ==========\n\nexport function CommandsManagerPage() {\n const { formatMessage } = useIntl();\n\n // Location filter state\n const [locationFilter, setLocationFilter] = useState<'project' | 'user'>('project');\n // Show disabled commands state\n const [showDisabledCommands, setShowDisabledCommands] = useState(false);\n // Expanded groups state (default cli and workflow expanded)\n const [expandedGroups, setExpandedGroups] = useState<Set<string>>(new Set(['cli', 'workflow']));\n // Search state\n const [searchQuery, setSearchQuery] = useState('');\n // Create dialog state\n const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);\n\n // Immersive mode state\n const isImmersiveMode = useAppStore(selectIsImmersiveMode);\n const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode);\n\n const {\n commands,\n groupedCommands,\n groups,\n enabledCount,\n disabledCount,\n projectCount,\n userCount,\n isLoading,\n isFetching,\n error,\n refetch,\n } = useCommands({\n filter: {\n location: locationFilter,\n showDisabled: showDisabledCommands,\n search: searchQuery || undefined,\n },\n });\n\n const { toggleCommand, toggleGroup, isToggling } = useCommandMutations();\n\n // Toggle group expand/collapse\n const toggleGroupExpand = (groupName: string) => {\n setExpandedGroups((prev) => {\n const next = new Set(prev);\n if (next.has(groupName)) {\n next.delete(groupName);\n } else {\n next.add(groupName);\n }\n return next;\n });\n };\n\n // Expand all groups\n const expandAll = () => {\n setExpandedGroups(new Set(groups));\n };\n\n // Collapse all groups\n const collapseAll = () => {\n setExpandedGroups(new Set());\n };\n\n // Toggle individual command\n const handleToggleCommand = (name: string, enabled: boolean) => {\n toggleCommand(name, enabled, locationFilter);\n };\n\n // Toggle all commands in a group\n const handleToggleGroup = (groupName: string, enable: boolean) => {\n toggleGroup(groupName, enable, locationFilter);\n };\n\n return (\n <div className={cn(\"space-y-6\", isImmersiveMode && \"h-screen overflow-hidden\")}>\n {/* Page Header */}\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-bold text-foreground flex items-center gap-2\">\n <Terminal className=\"w-6 h-6 text-primary\" />\n {formatMessage({ id: 'commands.title' })}\n </h1>\n <p className=\"text-muted-foreground mt-1\">\n {formatMessage({ id: 'commands.description' })}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button onClick={() => setIsCreateDialogOpen(true)} disabled={isToggling}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'commands.actions.create' })}\n </Button>\n <button\n onClick={toggleImmersiveMode}\n className={cn(\n 'p-2 rounded-md transition-colors',\n isImmersiveMode\n ? 'bg-primary/10 text-primary'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\n )}\n title={isImmersiveMode ? 'Exit Fullscreen' : 'Fullscreen'}\n >\n {isImmersiveMode ? <Minimize2 className=\"w-4 h-4\" /> : <Maximize2 className=\"w-4 h-4\" />}\n </button>\n <Button variant=\"outline\" onClick={() => refetch()} disabled={isFetching}>\n <RefreshCw className={cn('w-4 h-4 mr-2', isFetching && 'animate-spin')} />\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n </div>\n </div>\n\n {/* Error alert */}\n {error && (\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\n <AlertCircle className=\"h-5 w-5 flex-shrink-0\" />\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\n <p className=\"text-xs mt-0.5\">{error.message}</p>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\n {formatMessage({ id: 'home.errors.retry' })}\n </Button>\n </div>\n )}\n\n {/* Location Tabs - styled like LiteTasksPage */}\n <TabsNavigation\n value={locationFilter}\n onValueChange={(v) => setLocationFilter(v as 'project' | 'user')}\n tabs={[\n {\n value: 'project',\n label: formatMessage({ id: 'commands.location.project' }),\n icon: <Folder className=\"h-4 w-4\" />,\n badge: <Badge variant=\"secondary\" className=\"ml-2\">{projectCount}</Badge>,\n disabled: isToggling,\n },\n {\n value: 'user',\n label: formatMessage({ id: 'commands.location.user' }),\n icon: <User className=\"h-4 w-4\" />,\n badge: <Badge variant=\"secondary\" className=\"ml-2\">{userCount}</Badge>,\n disabled: isToggling,\n },\n ]}\n />\n\n </div>\n\n {/* Summary Stats */}\n <div className=\"grid grid-cols-3 gap-4\">\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <Terminal className=\"w-5 h-5 text-primary\" />\n <span className=\"text-2xl font-bold\">{commands.length}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'commands.stats.total' })}\n </p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <CheckCircle2 className=\"w-5 h-5 text-success\" />\n <span className=\"text-2xl font-bold\">{enabledCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'commands.stats.enabled' })}\n </p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <XCircle className=\"w-5 h-5 text-muted-foreground\" />\n <span className=\"text-2xl font-bold\">{disabledCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'commands.stats.disabled' })}\n </p>\n </Card>\n </div>\n\n {/* Search and Expand/Collapse Controls */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\n <Input\n placeholder={formatMessage({ id: 'commands.filters.searchPlaceholder' })}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant={showDisabledCommands ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setShowDisabledCommands((prev) => !prev)}\n disabled={isToggling}\n >\n {showDisabledCommands ? (\n <Eye className=\"w-4 h-4 mr-2\" />\n ) : (\n <EyeOff className=\"w-4 h-4 mr-2\" />\n )}\n {showDisabledCommands\n ? formatMessage({ id: 'commands.actions.hideDisabled' })\n : formatMessage({ id: 'commands.actions.showDisabled' })}\n <span className=\"ml-1 text-xs opacity-70\">({disabledCount})</span>\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={expandAll} disabled={groups.length === 0}>\n {formatMessage({ id: 'commands.actions.expandAll' })}\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={collapseAll} disabled={groups.length === 0}>\n {formatMessage({ id: 'commands.actions.collapseAll' })}\n </Button>\n </div>\n </div>\n\n {/* Command Groups Accordion */}\n {isLoading ? (\n <div className=\"space-y-4\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-32 bg-muted animate-pulse rounded-lg\" />\n ))}\n </div>\n ) : groups.length === 0 ? (\n <Card className=\"p-8 text-center\">\n <Terminal className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\n {formatMessage({ id: 'commands.emptyState.title' })}\n </h3>\n <p className=\"mt-2 text-muted-foreground\">\n {formatMessage({ id: 'commands.emptyState.message' })}\n </p>\n </Card>\n ) : (\n <div className=\"commands-accordion\">\n {groups.map((groupName) => {\n const groupCommands = groupedCommands[groupName] || [];\n return (\n <CommandGroupAccordion\n key={groupName}\n groupName={groupName}\n commands={groupCommands}\n isExpanded={expandedGroups.has(groupName)}\n onToggleExpand={toggleGroupExpand}\n onToggleCommand={handleToggleCommand}\n onToggleGroup={handleToggleGroup}\n isToggling={isToggling}\n showDisabled={showDisabledCommands}\n />\n );\n })}\n </div>\n )}\n\n {/* Command Create Dialog */}\n <CommandCreateDialog\n open={isCreateDialogOpen}\n onOpenChange={setIsCreateDialogOpen}\n onCreated={() => {\n setIsCreateDialogOpen(false);\n refetch();\n }}\n />\n </div>\n );\n}\n\nexport default CommandsManagerPage;\n"],"names":["getGroupIcon","groupName","groupIcons","topLevel","getGroupColorClass","groupColors","formatGroupName","part","getIconComponent","iconName","iconMap","className","jsxs","jsx","CommandGroupAccordion","commands","isExpanded","onToggleExpand","onToggleCommand","onToggleGroup","isToggling","showDisabled","formatMessage","useIntl","enabledCommands","cmd","allEnabled","visibleCommands","colorClass","displayName","IconComponent","indentLevel","handleToggleGroup","checked","cn","Collapsible","CollapsibleTrigger","ChevronDown","ChevronRight","Switch","Badge","CollapsibleContent","command","CommandRow","onToggle","disabled","isDisabled","CommandCreateDialog","open","onOpenChange","onCreated","cliType","projectPath","useWorkflowStore","selectProjectPath","mode","setMode","useState","location","setLocation","sourcePath","setSourcePath","customName","setCustomName","validationResult","setValidationResult","isValidating","setIsValidating","commandName","setCommandName","description","setDescription","isCreating","setIsCreating","isFileBrowserOpen","setIsFileBrowserOpen","resetState","useCallback","handleOpenChange","handleValidate","result","validateCommandImport","err","handleCreate","createCommand","canCreate","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Label","Folder","User","FileCode","Sparkles","Input","e","Button","FolderOpen","Loader2","CheckCircle","XCircle","error","i","Textarea","Info","DialogFooter","FloatingFileBrowser","path","CommandsManagerPage","locationFilter","setLocationFilter","showDisabledCommands","setShowDisabledCommands","expandedGroups","setExpandedGroups","searchQuery","setSearchQuery","isCreateDialogOpen","setIsCreateDialogOpen","isImmersiveMode","useAppStore","selectIsImmersiveMode","toggleImmersiveMode","s","groupedCommands","groups","enabledCount","disabledCount","projectCount","userCount","isLoading","isFetching","refetch","useCommands","toggleCommand","toggleGroup","useCommandMutations","toggleGroupExpand","prev","next","expandAll","collapseAll","handleToggleCommand","name","enabled","enable","Terminal","Plus","Minimize2","Maximize2","RefreshCw","AlertCircle","TabsNavigation","v","Card","CheckCircle2","Search","Eye","EyeOff","groupCommands"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CommandsManagerPage-C2JWcemF.js","sources":["../../src/components/commands/CommandGroupAccordion.tsx","../../src/components/shared/CommandCreateDialog.tsx","../../src/pages/CommandsManagerPage.tsx"],"sourcesContent":["// ========================================\n// CommandGroupAccordion Component\n// ========================================\n// Accordion component for displaying command groups with toggle switches\n\nimport * as React from 'react';\nimport { useIntl } from 'react-intl';\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Badge } from '@/components/ui/Badge';\nimport { Switch } from '@/components/ui/Switch';\nimport {\n Collapsible,\n CollapsibleTrigger,\n CollapsibleContent,\n} from '@/components/ui/Collapsible';\nimport type { Command } from '@/lib/api';\n\nexport interface CommandGroupAccordionProps {\n /** Group name (e.g., 'cli', 'workflow', 'workflow/review') */\n groupName: string;\n /** Commands in this group */\n commands: Command[];\n /** Is this group expanded */\n isExpanded: boolean;\n /** Toggle expand/collapse */\n onToggleExpand: (groupName: string) => void;\n /** Toggle individual command enabled state */\n onToggleCommand: (name: string, enabled: boolean) => void;\n /** Toggle all commands in group */\n onToggleGroup: (groupName: string, enable: boolean) => void;\n /** Is toggling in progress */\n isToggling: boolean;\n /** Show disabled commands */\n showDisabled?: boolean;\n}\n\n/**\n * Get icon for a command group\n * Uses top-level parent's icon for nested groups\n */\nfunction getGroupIcon(groupName: string): string {\n const groupIcons: Record<string, string> = {\n cli: 'terminal',\n workflow: 'git-branch',\n memory: 'brain',\n task: 'clipboard-list',\n issue: 'alert-circle',\n loop: 'repeat',\n skill: 'sparkles',\n other: 'folder',\n };\n\n const topLevel = groupName.split('/')[0];\n return groupIcons[topLevel] || 'folder';\n}\n\n/**\n * Get color class for a command group\n * Uses top-level parent's color for nested groups\n */\nfunction getGroupColorClass(groupName: string): string {\n const groupColors: Record<string, string> = {\n cli: 'text-primary bg-primary/10',\n workflow: 'text-success bg-success/10',\n memory: 'text-indigo bg-indigo/10',\n task: 'text-warning bg-warning/10',\n issue: 'text-destructive bg-destructive/10',\n loop: 'text-purple bg-purple/10',\n skill: 'text-pink bg-pink/10',\n other: 'text-muted-foreground bg-muted',\n };\n\n const topLevel = groupName.split('/')[0];\n return groupColors[topLevel] || 'text-muted-foreground bg-muted';\n}\n\n/**\n * Format group name for display\n * Converts nested paths like 'workflow/review' -> 'Workflow > Review'\n */\nfunction formatGroupName(groupName: string): string {\n if (!groupName.includes('/')) {\n return groupName;\n }\n\n const parts = groupName.split('/');\n return parts.map(part => part.charAt(0).toUpperCase() + part.slice(1)).join(' > ');\n}\n\n/**\n * Get Lucide icon component by name\n */\nfunction getIconComponent(iconName: string): React.ComponentType<{ className?: string }> {\n const iconMap: Record<string, React.ComponentType<{ className?: string }>> = {\n terminal: ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <polyline points=\"4 17 10 11 4 5\" />\n <line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\" />\n </svg>\n ),\n 'git-branch': ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <line x1=\"6\" y1=\"3\" x2=\"6\" y2=\"15\" />\n <circle cx=\"18\" cy=\"6\" r=\"3\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n <path d=\"M18 9a9 9 0 0 1-9 9\" />\n </svg>\n ),\n brain: ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.96-3.08 3 3 0 0 1-.34-5.58 2.5 2.5 0 0 1 1.32-4.24 2.5 2.5 0 0 1 1.98-3A2.5 2.5 0 0 1 9.5 2Z\" />\n <path d=\"M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.96-3.08 3 3 0 0 0 .34-5.58 2.5 2.5 0 0 0-1.32-4.24 2.5 2.5 0 0 0-1.98-3A2.5 2.5 0 0 0 14.5 2Z\" />\n </svg>\n ),\n 'clipboard-list': ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <rect width=\"8\" height=\"4\" x=\"8\" y=\"2\" rx=\"1\" ry=\"1\" />\n <path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" />\n <path d=\"M12 11h4\" />\n <path d=\"M12 16h4\" />\n <path d=\"M8 11h.01\" />\n <path d=\"M8 16h.01\" />\n </svg>\n ),\n 'alert-circle': ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n ),\n repeat: ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"m17 2 4 4-4 4\" />\n <path d=\"M3 11V9a4 4 0 0 1 4-4h14\" />\n <path d=\"m7 22-4-4 4-4\" />\n <path d=\"M21 13v2a4 4 0 0 1-4 4H3\" />\n </svg>\n ),\n sparkles: ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z\" />\n <path d=\"M5 3v4\" />\n <path d=\"M19 17v4\" />\n <path d=\"M3 5h4\" />\n <path d=\"M17 19h4\" />\n </svg>\n ),\n folder: ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <path d=\"M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z\" />\n </svg>\n ),\n };\n\n return iconMap[iconName] || iconMap.folder;\n}\n\n/**\n * CommandGroupAccordion component\n * Displays a collapsible group of commands with toggle switches\n */\nexport function CommandGroupAccordion({\n groupName,\n commands,\n isExpanded,\n onToggleExpand,\n onToggleCommand,\n onToggleGroup,\n isToggling,\n showDisabled = false,\n}: CommandGroupAccordionProps) {\n const { formatMessage } = useIntl();\n\n const enabledCommands = commands.filter((cmd) => cmd.enabled);\n const allEnabled = enabledCommands.length === commands.length && commands.length > 0;\n\n // Filter commands based on showDisabled setting\n const visibleCommands = showDisabled ? commands : enabledCommands;\n\n const iconName = getGroupIcon(groupName);\n const colorClass = getGroupColorClass(groupName);\n const displayName = formatGroupName(groupName);\n const IconComponent = getIconComponent(iconName);\n const indentLevel = (groupName.match(/\\//g) || []).length;\n\n const handleToggleGroup = (checked: boolean) => {\n onToggleGroup(groupName, checked);\n };\n\n return (\n <div className={cn('mb-4', indentLevel > 0 && 'ml-5')} style={indentLevel > 0 ? { marginLeft: `${indentLevel * 20}px` } : undefined}>\n <Collapsible open={isExpanded} onOpenChange={() => onToggleExpand(groupName)}>\n {/* Group Header */}\n <div className=\"flex items-center justify-between px-4 py-3 bg-card border border-border rounded-lg hover:bg-muted/50 transition-colors\">\n <CollapsibleTrigger asChild>\n <div className=\"flex items-center gap-3 flex-1 cursor-pointer\">\n {isExpanded ? (\n <ChevronDown className=\"w-5 h-5 text-muted-foreground transition-transform\" />\n ) : (\n <ChevronRight className=\"w-5 h-5 text-muted-foreground transition-transform\" />\n )}\n <div className={cn('w-8 h-8 rounded-lg flex items-center justify-center', colorClass)}>\n <IconComponent className=\"w-4 h-4\" />\n </div>\n <div>\n <h3 className=\"text-base font-semibold text-foreground\">{displayName}</h3>\n <p className=\"text-xs text-muted-foreground\">\n {enabledCommands.length}/{commands.length} {formatMessage({ id: 'commands.group.enabled' })}\n </p>\n </div>\n </div>\n </CollapsibleTrigger>\n\n <div className=\"flex items-center gap-3\">\n {/* Group Toggle Switch */}\n <Switch\n checked={allEnabled}\n onCheckedChange={handleToggleGroup}\n disabled={isToggling || commands.length === 0}\n className={cn('data-[state=checked]:bg-success')}\n title={\n allEnabled\n ? formatMessage({ id: 'commands.group.clickToDisableAll' })\n : formatMessage({ id: 'commands.group.clickToEnableAll' })\n }\n />\n <Badge variant=\"secondary\" className=\"text-xs\">\n {commands.length}\n </Badge>\n </div>\n </div>\n\n {/* Group Content - Commands Table */}\n <CollapsibleContent className=\"mt-3\">\n <div className=\"bg-card border border-border rounded-lg overflow-hidden\">\n <table className=\"w-full\" style={{ tableLayout: 'fixed' }}>\n <colgroup>\n <col style={{ width: '200px' }} />\n <col style={{ width: 'auto' }} />\n <col style={{ width: '100px' }} />\n <col style={{ width: '80px' }} />\n </colgroup>\n <thead className=\"bg-muted/30 border-b border-border\">\n <tr>\n <th className=\"px-4 py-2 text-left text-xs font-medium text-muted-foreground uppercase\">\n {formatMessage({ id: 'commands.table.name' })}\n </th>\n <th className=\"px-4 py-2 text-left text-xs font-medium text-muted-foreground uppercase\">\n {formatMessage({ id: 'commands.table.description' })}\n </th>\n <th className=\"px-4 py-2 text-center text-xs font-medium text-muted-foreground uppercase\">\n {formatMessage({ id: 'commands.table.scope' })}\n </th>\n <th className=\"px-4 py-2 text-center text-xs font-medium text-muted-foreground uppercase\">\n {formatMessage({ id: 'commands.table.status' })}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {visibleCommands.map((command) => (\n <CommandRow\n key={`${command.name}-${command.location || 'default'}`}\n command={command}\n onToggle={onToggleCommand}\n disabled={isToggling}\n />\n ))}\n {visibleCommands.length === 0 && (\n <tr>\n <td colSpan={4} className=\"px-4 py-8 text-center text-sm text-muted-foreground\">\n {showDisabled\n ? formatMessage({ id: 'commands.group.noCommands' })\n : formatMessage({ id: 'commands.group.noEnabledCommands' })}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </CollapsibleContent>\n </Collapsible>\n </div>\n );\n}\n\n/**\n * CommandRow component - Internal component for table row\n */\ninterface CommandRowProps {\n command: Command;\n onToggle: (name: string, enabled: boolean) => void;\n disabled?: boolean;\n}\n\nfunction CommandRow({ command, onToggle, disabled }: CommandRowProps) {\n const { formatMessage } = useIntl();\n const isDisabled = !command.enabled;\n\n return (\n <tr className={cn('hover:bg-muted/20 transition-colors', isDisabled && 'opacity-60')}>\n <td className=\"px-4 py-3 text-sm font-medium text-foreground\">\n <code className=\"break-words\">/{command.name}</code>\n </td>\n <td className=\"px-4 py-3 text-sm text-muted-foreground\">\n <div className=\"line-clamp-2 break-words\">\n {command.description || formatMessage({ id: 'commands.card.noDescription' })}\n </div>\n </td>\n <td className=\"px-4 py-3 text-center text-xs text-muted-foreground\">\n <span className=\"whitespace-nowrap\">{command.location || 'project'}</span>\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"flex justify-center\">\n <Switch\n checked={command.enabled}\n onCheckedChange={(checked) => onToggle(command.name, checked)}\n disabled={disabled}\n className=\"data-[state=checked]:bg-primary\"\n />\n </div>\n </td>\n </tr>\n );\n}\n\nexport default CommandGroupAccordion;\n","// ========================================\r\n// Command Create Dialog Component\r\n// ========================================\r\n// Modal dialog for creating/importing commands with two modes:\r\n// - Import: import existing command file\r\n// - CLI Generate: AI-generated command from description\r\n\r\nimport { useState, useCallback } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport {\r\n Folder,\r\n User,\r\n FileCode,\r\n Sparkles,\r\n CheckCircle,\r\n XCircle,\r\n Loader2,\r\n Info,\r\n FolderOpen,\r\n} from 'lucide-react';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n DialogTitle,\r\n DialogDescription,\r\n} from '@/components/ui/Dialog';\r\nimport { Button } from '@/components/ui/Button';\r\nimport { Input } from '@/components/ui/Input';\r\nimport { Textarea } from '@/components/ui/Textarea';\r\nimport { Label } from '@/components/ui/Label';\r\nimport { validateCommandImport, createCommand } from '@/lib/api';\r\nimport { useWorkflowStore, selectProjectPath } from '@/stores/workflowStore';\r\nimport { FloatingFileBrowser } from '@/components/terminal-dashboard/FloatingFileBrowser';\r\nimport { cn } from '@/lib/utils';\r\n\r\nexport interface CommandCreateDialogProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onCreated: () => void;\r\n cliType?: 'claude' | 'codex';\r\n}\r\n\r\ntype CreateMode = 'import' | 'cli-generate';\r\ntype CommandLocation = 'project' | 'user';\r\n\r\ninterface ValidationResult {\r\n valid: boolean;\r\n errors?: string[];\r\n commandInfo?: { name: string; description: string; usage?: string };\r\n}\r\n\r\nexport function CommandCreateDialog({ open, onOpenChange, onCreated, cliType = 'claude' }: CommandCreateDialogProps) {\r\n const { formatMessage } = useIntl();\r\n const projectPath = useWorkflowStore(selectProjectPath);\r\n\r\n const [mode, setMode] = useState<CreateMode>('import');\r\n const [location, setLocation] = useState<CommandLocation>('project');\r\n\r\n // Import mode state\r\n const [sourcePath, setSourcePath] = useState('');\r\n const [customName, setCustomName] = useState('');\r\n const [validationResult, setValidationResult] = useState<ValidationResult | null>(null);\r\n const [isValidating, setIsValidating] = useState(false);\r\n\r\n // CLI Generate mode state\r\n const [commandName, setCommandName] = useState('');\r\n const [description, setDescription] = useState('');\r\n\r\n const [isCreating, setIsCreating] = useState(false);\r\n\r\n // File browser state\r\n const [isFileBrowserOpen, setIsFileBrowserOpen] = useState(false);\r\n\r\n const resetState = useCallback(() => {\r\n setMode('import');\r\n setLocation('project');\r\n setSourcePath('');\r\n setCustomName('');\r\n setValidationResult(null);\r\n setIsValidating(false);\r\n setCommandName('');\r\n setDescription('');\r\n setIsCreating(false);\r\n setIsFileBrowserOpen(false);\r\n }, []);\r\n\r\n const handleOpenChange = useCallback((open: boolean) => {\r\n if (!open) {\r\n resetState();\r\n }\r\n onOpenChange(open);\r\n }, [onOpenChange, resetState]);\r\n\r\n const handleValidate = useCallback(async () => {\r\n if (!sourcePath.trim()) return;\r\n\r\n setIsValidating(true);\r\n setValidationResult(null);\r\n\r\n try {\r\n const result = await validateCommandImport(sourcePath.trim());\r\n setValidationResult(result);\r\n } catch (err) {\r\n setValidationResult({\r\n valid: false,\r\n errors: [err instanceof Error ? err.message : String(err)],\r\n });\r\n } finally {\r\n setIsValidating(false);\r\n }\r\n }, [sourcePath]);\r\n\r\n const handleCreate = useCallback(async () => {\r\n if (mode === 'import') {\r\n if (!sourcePath.trim()) return;\r\n if (!validationResult?.valid) return;\r\n } else {\r\n if (!commandName.trim()) return;\r\n if (!description.trim()) return;\r\n }\r\n\r\n setIsCreating(true);\r\n\r\n try {\r\n await createCommand({\r\n mode,\r\n location,\r\n sourcePath: mode === 'import' ? sourcePath.trim() : undefined,\r\n commandName: mode === 'import' ? (customName.trim() || undefined) : commandName.trim(),\r\n description: mode === 'cli-generate' ? description.trim() : undefined,\r\n generationType: mode === 'cli-generate' ? 'description' : undefined,\r\n projectPath,\r\n cliType,\r\n });\r\n\r\n handleOpenChange(false);\r\n onCreated();\r\n } catch (err) {\r\n console.error('Failed to create command:', err);\r\n if (mode === 'import') {\r\n setValidationResult({\r\n valid: false,\r\n errors: [err instanceof Error ? err.message : formatMessage({ id: 'commands.create.createError' })],\r\n });\r\n }\r\n } finally {\r\n setIsCreating(false);\r\n }\r\n }, [mode, location, sourcePath, customName, commandName, description, validationResult, projectPath, handleOpenChange, onCreated, formatMessage]);\r\n\r\n const canCreate = mode === 'import'\r\n ? sourcePath.trim() && validationResult?.valid && !isCreating\r\n : commandName.trim() && description.trim() && !isCreating;\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={handleOpenChange}>\r\n <DialogContent className=\"max-w-2xl max-h-[90vh] overflow-y-auto\">\r\n <DialogHeader>\r\n <DialogTitle>{formatMessage({ id: 'commands.create.title' })}</DialogTitle>\r\n <DialogDescription>\r\n {formatMessage({ id: 'commands.description' })}\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <div className=\"space-y-5 py-2\">\r\n {/* Location Selection */}\r\n <div className=\"space-y-2\">\r\n <Label>{formatMessage({ id: 'commands.create.location' })}</Label>\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'px-4 py-3 text-left border-2 rounded-lg transition-all',\r\n location === 'project'\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-primary/50'\r\n )}\r\n onClick={() => setLocation('project')}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <Folder className=\"w-5 h-5\" />\r\n <div>\r\n <div className=\"font-medium text-sm\">{formatMessage({ id: 'commands.create.locationProject' })}</div>\r\n <div className=\"text-xs text-muted-foreground\">{`.${cliType}/commands/`}</div>\r\n </div>\r\n </div>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'px-4 py-3 text-left border-2 rounded-lg transition-all',\r\n location === 'user'\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-primary/50'\r\n )}\r\n onClick={() => setLocation('user')}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <User className=\"w-5 h-5\" />\r\n <div>\r\n <div className=\"font-medium text-sm\">{formatMessage({ id: 'commands.create.locationUser' })}</div>\r\n <div className=\"text-xs text-muted-foreground\">{`~/.${cliType}/commands/`}</div>\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Mode Selection */}\r\n <div className=\"space-y-2\">\r\n <Label>{formatMessage({ id: 'commands.create.mode' })}</Label>\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'px-4 py-3 text-left border-2 rounded-lg transition-all',\r\n mode === 'import'\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-primary/50'\r\n )}\r\n onClick={() => setMode('import')}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <FileCode className=\"w-5 h-5\" />\r\n <div>\r\n <div className=\"font-medium text-sm\">{formatMessage({ id: 'commands.create.modeImport' })}</div>\r\n <div className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'commands.create.modeImportHint' })}</div>\r\n </div>\r\n </div>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={cn(\r\n 'px-4 py-3 text-left border-2 rounded-lg transition-all',\r\n mode === 'cli-generate'\r\n ? 'border-primary bg-primary/10'\r\n : 'border-border hover:border-primary/50'\r\n )}\r\n onClick={() => setMode('cli-generate')}\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <Sparkles className=\"w-5 h-5\" />\r\n <div>\r\n <div className=\"font-medium text-sm\">{formatMessage({ id: 'commands.create.modeGenerate' })}</div>\r\n <div className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'commands.create.modeGenerateHint' })}</div>\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* Import Mode Content */}\r\n {mode === 'import' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"sourcePath\">{formatMessage({ id: 'commands.create.sourcePath' })}</Label>\r\n <div className=\"flex gap-2\">\r\n <Input\r\n id=\"sourcePath\"\r\n value={sourcePath}\r\n onChange={(e) => {\r\n setSourcePath(e.target.value);\r\n setValidationResult(null);\r\n }}\r\n placeholder={formatMessage({ id: 'commands.create.sourcePathPlaceholder' })}\r\n className=\"font-mono text-sm flex-1\"\r\n />\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() => setIsFileBrowserOpen(true)}\r\n title={formatMessage({ id: 'commands.create.browseFile' })}\r\n >\r\n <FolderOpen className=\"w-4 h-4\" />\r\n </Button>\r\n </div>\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'commands.create.sourcePathHint' })}</p>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"customName\">\r\n {formatMessage({ id: 'commands.create.customName' })}\r\n <span className=\"text-muted-foreground ml-1\">({formatMessage({ id: 'commands.create.customNameHint' })})</span>\r\n </Label>\r\n <Input\r\n id=\"customName\"\r\n value={customName}\r\n onChange={(e) => setCustomName(e.target.value)}\r\n placeholder={formatMessage({ id: 'commands.create.customNamePlaceholder' })}\r\n />\r\n </div>\r\n\r\n {/* Validation Result */}\r\n {isValidating && (\r\n <div className=\"flex items-center gap-2 p-3 bg-muted/50 rounded-lg\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n <span className=\"text-sm text-muted-foreground\">{formatMessage({ id: 'commands.create.validating' })}</span>\r\n </div>\r\n )}\r\n {validationResult && !isValidating && (\r\n validationResult.valid ? (\r\n <div className=\"p-4 bg-green-500/10 border border-green-500/20 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-green-600 mb-2\">\r\n <CheckCircle className=\"w-5 h-5\" />\r\n <span className=\"font-medium\">{formatMessage({ id: 'commands.create.validCommand' })}</span>\r\n </div>\r\n {validationResult.commandInfo && (\r\n <div className=\"space-y-1 text-sm\">\r\n <div>\r\n <span className=\"text-muted-foreground\">{formatMessage({ id: 'commands.card.name' })}: </span>\r\n <span>{validationResult.commandInfo.name}</span>\r\n </div>\r\n {validationResult.commandInfo.description && (\r\n <div>\r\n <span className=\"text-muted-foreground\">{formatMessage({ id: 'commands.card.description' })}: </span>\r\n <span>{validationResult.commandInfo.description}</span>\r\n </div>\r\n )}\r\n {validationResult.commandInfo.usage && (\r\n <div>\r\n <span className=\"text-muted-foreground\">{formatMessage({ id: 'commands.card.usage' })}: </span>\r\n <span>{validationResult.commandInfo.usage}</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <div className=\"p-4 bg-destructive/10 border border-destructive/20 rounded-lg\">\r\n <div className=\"flex items-center gap-2 text-destructive mb-2\">\r\n <XCircle className=\"w-5 h-5\" />\r\n <span className=\"font-medium\">{formatMessage({ id: 'commands.create.invalidCommand' })}</span>\r\n </div>\r\n {validationResult.errors && (\r\n <ul className=\"space-y-1 text-sm\">\r\n {validationResult.errors.map((error, i) => (\r\n <li key={i} className=\"text-destructive\">{error}</li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n )\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* CLI Generate Mode Content */}\r\n {mode === 'cli-generate' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"commandName\">\r\n {formatMessage({ id: 'commands.create.commandName' })} <span className=\"text-destructive\">*</span>\r\n </Label>\r\n <Input\r\n id=\"commandName\"\r\n value={commandName}\r\n onChange={(e) => setCommandName(e.target.value)}\r\n placeholder={formatMessage({ id: 'commands.create.commandNamePlaceholder' })}\r\n />\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'commands.create.commandNameHint' })}</p>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"description\">\r\n {formatMessage({ id: 'commands.create.descriptionLabel' })} <span className=\"text-destructive\">*</span>\r\n </Label>\r\n <Textarea\r\n id=\"description\"\r\n value={description}\r\n onChange={(e) => setDescription(e.target.value)}\r\n placeholder={formatMessage({ id: 'commands.create.descriptionPlaceholder' })}\r\n rows={6}\r\n />\r\n <p className=\"text-xs text-muted-foreground\">{formatMessage({ id: 'commands.create.descriptionHint' })}</p>\r\n </div>\r\n\r\n <div className=\"p-3 bg-blue-500/10 border border-blue-500/20 rounded-lg\">\r\n <div className=\"flex items-start gap-2\">\r\n <Info className=\"w-4 h-4 text-blue-600 mt-0.5\" />\r\n <div className=\"text-sm text-blue-600\">\r\n <p className=\"font-medium\">{formatMessage({ id: 'commands.create.generateInfo' })}</p>\r\n <p className=\"text-xs mt-1\">{formatMessage({ id: 'commands.create.generateTimeHint' })}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <DialogFooter className=\"gap-2\">\r\n <Button variant=\"outline\" onClick={() => handleOpenChange(false)} disabled={isCreating}>\r\n {formatMessage({ id: 'commands.actions.cancel' })}\r\n </Button>\r\n {mode === 'import' && (\r\n <Button\r\n variant=\"outline\"\r\n onClick={handleValidate}\r\n disabled={!sourcePath.trim() || isValidating || isCreating}\r\n >\r\n {isValidating && <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />}\r\n {formatMessage({ id: 'commands.create.validate' })}\r\n </Button>\r\n )}\r\n <Button\r\n onClick={handleCreate}\r\n disabled={!canCreate}\r\n >\r\n {isCreating && <Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />}\r\n {isCreating\r\n ? formatMessage({ id: 'commands.create.creating' })\r\n : mode === 'import'\r\n ? formatMessage({ id: 'commands.create.import' })\r\n : formatMessage({ id: 'commands.create.generate' })\r\n }\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n\r\n {/* File Browser for selecting source file */}\r\n <FloatingFileBrowser\r\n isOpen={isFileBrowserOpen}\r\n onClose={() => setIsFileBrowserOpen(false)}\r\n rootPath={projectPath}\r\n onInsertPath={(path) => {\r\n setSourcePath(path);\r\n setValidationResult(null);\r\n setIsFileBrowserOpen(false);\r\n }}\r\n initialSelectedPath={sourcePath || null}\r\n />\r\n </Dialog>\r\n );\r\n}\r\n\r\nexport default CommandCreateDialog;\r\n","// ========================================\n// Commands Manager Page\n// ========================================\n// Manage custom slash commands with search/filter\n\nimport { useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Terminal,\n Search,\n RefreshCw,\n Eye,\n EyeOff,\n CheckCircle2,\n XCircle,\n Folder,\n User,\n AlertCircle,\n Maximize2,\n Minimize2,\n Plus,\n} from 'lucide-react';\nimport { useAppStore, selectIsImmersiveMode } from '@/stores/appStore';\nimport { Card } from '@/components/ui/Card';\nimport { Button } from '@/components/ui/Button';\nimport { Input } from '@/components/ui/Input';\nimport { Badge } from '@/components/ui/Badge';\nimport { TabsNavigation } from '@/components/ui/TabsNavigation';\nimport { useCommands, useCommandMutations } from '@/hooks';\nimport { CommandGroupAccordion } from '@/components/commands/CommandGroupAccordion';\nimport { CommandCreateDialog } from '@/components/shared/CommandCreateDialog';\nimport { cn } from '@/lib/utils';\n\n// ========== Main Page Component ==========\n\nexport function CommandsManagerPage() {\n const { formatMessage } = useIntl();\n\n // Location filter state\n const [locationFilter, setLocationFilter] = useState<'project' | 'user'>('project');\n // Show disabled commands state\n const [showDisabledCommands, setShowDisabledCommands] = useState(false);\n // Expanded groups state (default cli and workflow expanded)\n const [expandedGroups, setExpandedGroups] = useState<Set<string>>(new Set(['cli', 'workflow']));\n // Search state\n const [searchQuery, setSearchQuery] = useState('');\n // Create dialog state\n const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);\n\n // Immersive mode state\n const isImmersiveMode = useAppStore(selectIsImmersiveMode);\n const toggleImmersiveMode = useAppStore((s) => s.toggleImmersiveMode);\n\n const {\n commands,\n groupedCommands,\n groups,\n enabledCount,\n disabledCount,\n projectCount,\n userCount,\n isLoading,\n isFetching,\n error,\n refetch,\n } = useCommands({\n filter: {\n location: locationFilter,\n showDisabled: showDisabledCommands,\n search: searchQuery || undefined,\n },\n });\n\n const { toggleCommand, toggleGroup, isToggling } = useCommandMutations();\n\n // Toggle group expand/collapse\n const toggleGroupExpand = (groupName: string) => {\n setExpandedGroups((prev) => {\n const next = new Set(prev);\n if (next.has(groupName)) {\n next.delete(groupName);\n } else {\n next.add(groupName);\n }\n return next;\n });\n };\n\n // Expand all groups\n const expandAll = () => {\n setExpandedGroups(new Set(groups));\n };\n\n // Collapse all groups\n const collapseAll = () => {\n setExpandedGroups(new Set());\n };\n\n // Toggle individual command\n const handleToggleCommand = (name: string, enabled: boolean) => {\n toggleCommand(name, enabled, locationFilter);\n };\n\n // Toggle all commands in a group\n const handleToggleGroup = (groupName: string, enable: boolean) => {\n toggleGroup(groupName, enable, locationFilter);\n };\n\n return (\n <div className={cn(\"space-y-6\", isImmersiveMode && \"h-screen overflow-hidden\")}>\n {/* Page Header */}\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-bold text-foreground flex items-center gap-2\">\n <Terminal className=\"w-6 h-6 text-primary\" />\n {formatMessage({ id: 'commands.title' })}\n </h1>\n <p className=\"text-muted-foreground mt-1\">\n {formatMessage({ id: 'commands.description' })}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button onClick={() => setIsCreateDialogOpen(true)} disabled={isToggling}>\n <Plus className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'commands.actions.create' })}\n </Button>\n <button\n onClick={toggleImmersiveMode}\n className={cn(\n 'p-2 rounded-md transition-colors',\n isImmersiveMode\n ? 'bg-primary/10 text-primary'\n : 'text-muted-foreground hover:text-foreground hover:bg-muted'\n )}\n title={isImmersiveMode ? 'Exit Fullscreen' : 'Fullscreen'}\n >\n {isImmersiveMode ? <Minimize2 className=\"w-4 h-4\" /> : <Maximize2 className=\"w-4 h-4\" />}\n </button>\n <Button variant=\"outline\" onClick={() => refetch()} disabled={isFetching}>\n <RefreshCw className={cn('w-4 h-4 mr-2', isFetching && 'animate-spin')} />\n {formatMessage({ id: 'common.actions.refresh' })}\n </Button>\n </div>\n </div>\n\n {/* Error alert */}\n {error && (\n <div className=\"flex items-center gap-2 p-4 rounded-lg bg-destructive/10 border border-destructive/30 text-destructive\">\n <AlertCircle className=\"h-5 w-5 flex-shrink-0\" />\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">{formatMessage({ id: 'common.errors.loadFailed' })}</p>\n <p className=\"text-xs mt-0.5\">{error.message}</p>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\n {formatMessage({ id: 'home.errors.retry' })}\n </Button>\n </div>\n )}\n\n {/* Location Tabs - styled like LiteTasksPage */}\n <TabsNavigation\n value={locationFilter}\n onValueChange={(v) => setLocationFilter(v as 'project' | 'user')}\n tabs={[\n {\n value: 'project',\n label: formatMessage({ id: 'commands.location.project' }),\n icon: <Folder className=\"h-4 w-4\" />,\n badge: <Badge variant=\"secondary\" className=\"ml-2\">{projectCount}</Badge>,\n disabled: isToggling,\n },\n {\n value: 'user',\n label: formatMessage({ id: 'commands.location.user' }),\n icon: <User className=\"h-4 w-4\" />,\n badge: <Badge variant=\"secondary\" className=\"ml-2\">{userCount}</Badge>,\n disabled: isToggling,\n },\n ]}\n />\n\n </div>\n\n {/* Summary Stats */}\n <div className=\"grid grid-cols-3 gap-4\">\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <Terminal className=\"w-5 h-5 text-primary\" />\n <span className=\"text-2xl font-bold\">{commands.length}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'commands.stats.total' })}\n </p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <CheckCircle2 className=\"w-5 h-5 text-success\" />\n <span className=\"text-2xl font-bold\">{enabledCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'commands.stats.enabled' })}\n </p>\n </Card>\n <Card className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <XCircle className=\"w-5 h-5 text-muted-foreground\" />\n <span className=\"text-2xl font-bold\">{disabledCount}</span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {formatMessage({ id: 'commands.stats.disabled' })}\n </p>\n </Card>\n </div>\n\n {/* Search and Expand/Collapse Controls */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground\" />\n <Input\n placeholder={formatMessage({ id: 'commands.filters.searchPlaceholder' })}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant={showDisabledCommands ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setShowDisabledCommands((prev) => !prev)}\n disabled={isToggling}\n >\n {showDisabledCommands ? (\n <Eye className=\"w-4 h-4 mr-2\" />\n ) : (\n <EyeOff className=\"w-4 h-4 mr-2\" />\n )}\n {showDisabledCommands\n ? formatMessage({ id: 'commands.actions.hideDisabled' })\n : formatMessage({ id: 'commands.actions.showDisabled' })}\n <span className=\"ml-1 text-xs opacity-70\">({disabledCount})</span>\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={expandAll} disabled={groups.length === 0}>\n {formatMessage({ id: 'commands.actions.expandAll' })}\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={collapseAll} disabled={groups.length === 0}>\n {formatMessage({ id: 'commands.actions.collapseAll' })}\n </Button>\n </div>\n </div>\n\n {/* Command Groups Accordion */}\n {isLoading ? (\n <div className=\"space-y-4\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-32 bg-muted animate-pulse rounded-lg\" />\n ))}\n </div>\n ) : groups.length === 0 ? (\n <Card className=\"p-8 text-center\">\n <Terminal className=\"w-12 h-12 mx-auto text-muted-foreground/50\" />\n <h3 className=\"mt-4 text-lg font-medium text-foreground\">\n {formatMessage({ id: 'commands.emptyState.title' })}\n </h3>\n <p className=\"mt-2 text-muted-foreground\">\n {formatMessage({ id: 'commands.emptyState.message' })}\n </p>\n </Card>\n ) : (\n <div className=\"commands-accordion\">\n {groups.map((groupName) => {\n const groupCommands = groupedCommands[groupName] || [];\n return (\n <CommandGroupAccordion\n key={groupName}\n groupName={groupName}\n commands={groupCommands}\n isExpanded={expandedGroups.has(groupName)}\n onToggleExpand={toggleGroupExpand}\n onToggleCommand={handleToggleCommand}\n onToggleGroup={handleToggleGroup}\n isToggling={isToggling}\n showDisabled={showDisabledCommands}\n />\n );\n })}\n </div>\n )}\n\n {/* Command Create Dialog */}\n <CommandCreateDialog\n open={isCreateDialogOpen}\n onOpenChange={setIsCreateDialogOpen}\n onCreated={() => {\n setIsCreateDialogOpen(false);\n refetch();\n }}\n />\n </div>\n );\n}\n\nexport default CommandsManagerPage;\n"],"names":["getGroupIcon","groupName","groupIcons","topLevel","getGroupColorClass","groupColors","formatGroupName","part","getIconComponent","iconName","iconMap","className","jsxs","jsx","CommandGroupAccordion","commands","isExpanded","onToggleExpand","onToggleCommand","onToggleGroup","isToggling","showDisabled","formatMessage","useIntl","enabledCommands","cmd","allEnabled","visibleCommands","colorClass","displayName","IconComponent","indentLevel","handleToggleGroup","checked","cn","Collapsible","CollapsibleTrigger","ChevronDown","ChevronRight","Switch","Badge","CollapsibleContent","command","CommandRow","onToggle","disabled","isDisabled","CommandCreateDialog","open","onOpenChange","onCreated","cliType","projectPath","useWorkflowStore","selectProjectPath","mode","setMode","useState","location","setLocation","sourcePath","setSourcePath","customName","setCustomName","validationResult","setValidationResult","isValidating","setIsValidating","commandName","setCommandName","description","setDescription","isCreating","setIsCreating","isFileBrowserOpen","setIsFileBrowserOpen","resetState","useCallback","handleOpenChange","handleValidate","result","validateCommandImport","err","handleCreate","createCommand","canCreate","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Label","Folder","User","FileCode","Sparkles","Input","e","Button","FolderOpen","Loader2","CheckCircle","XCircle","error","i","Textarea","Info","DialogFooter","FloatingFileBrowser","path","CommandsManagerPage","locationFilter","setLocationFilter","showDisabledCommands","setShowDisabledCommands","expandedGroups","setExpandedGroups","searchQuery","setSearchQuery","isCreateDialogOpen","setIsCreateDialogOpen","isImmersiveMode","useAppStore","selectIsImmersiveMode","toggleImmersiveMode","s","groupedCommands","groups","enabledCount","disabledCount","projectCount","userCount","isLoading","isFetching","refetch","useCommands","toggleCommand","toggleGroup","useCommandMutations","toggleGroupExpand","prev","next","expandAll","collapseAll","handleToggleCommand","name","enabled","enable","Terminal","Plus","Minimize2","Maximize2","RefreshCw","AlertCircle","TabsNavigation","v","Card","CheckCircle2","Search","Eye","EyeOff","groupCommands"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a9 as X,aa as Z,ab as D,u as $,r as b,j as t,C as y,B as T,e as ee,R as A,c as j,b as de,I as me,N as ue,M as fe,l as te,g8 as he,g9 as xe,m as pe,U as ge,cl as _,cm as Q,bq as be,bs as ye,Y as U,a8 as je}from"./index-B6I7GQC5.js";import{T as Ne}from"./TabsNavigation-drSnu5jn.js";import{u as we}from"./useDebounce-CmKmoP7n.js";import{F as C}from"./file-text-BoHsW2es.js";import{H as F}from"./hash-Bd1RD285.js";import{L as ve}from"./link-2-W0Nl17ec.js";const v={all:["deepWiki"],files:e=>[...v.all,"files",e],doc:e=>[...v.all,"doc",e],stats:e=>[...v.all,"stats",e],search:e=>[...v.all,"search",e]},q=300*1e3,P=600*1e3,ke=10*1e3;async function I(e,s=ke){const a=new AbortController,n=setTimeout(()=>a.abort(),s);try{return await fetch(e,{signal:a.signal})}finally{clearTimeout(n)}}async function Se(){const e=await I("/api/deepwiki/files");if(!e.ok)throw new Error(`Failed to fetch files: ${e.statusText}`);return e.json()}async function Ce(e){const s=await I(`/api/deepwiki/doc?path=${encodeURIComponent(e)}`);if(!s.ok){if(s.status===404)return{doc:null,content:"",symbols:[]};throw new Error(`Failed to fetch document: ${s.statusText}`)}return s.json()}async function Fe(){const e=await I("/api/deepwiki/stats");if(!e.ok)throw new Error(`Failed to fetch stats: ${e.statusText}`);return e.json()}async function Me(e,s=50){const a=await I(`/api/deepwiki/search?q=${encodeURIComponent(e)}&limit=${s}`);if(!a.ok)throw new Error(`Failed to search symbols: ${a.statusText}`);return a.json()}function Le(e={}){const{staleTime:s=q,enabled:a=!0}=e,n=X(Z),r=D({queryKey:v.files(n??""),queryFn:Se,staleTime:s,gcTime:P,enabled:a&&!!n,retry:2,refetchOnMount:!1,refetchOnReconnect:!1,refetchOnWindowFocus:!1});return{files:r.data??[],isLoading:r.isLoading,isFetching:r.isFetching,error:r.error,refetch:async()=>{await r.refetch()}}}function Te(e,s={}){var l,o,m;const{staleTime:a=q,enabled:n=!0}=s,r=D({queryKey:v.doc(e??""),queryFn:()=>Ce(e),staleTime:a,gcTime:P,enabled:n&&!!e,retry:2,refetchOnMount:!1,refetchOnReconnect:!1,refetchOnWindowFocus:!1});return{doc:((l=r.data)==null?void 0:l.doc)??null,content:((o=r.data)==null?void 0:o.content)??"",symbols:((m=r.data)==null?void 0:m.symbols)??[],isLoading:r.isLoading,isFetching:r.isFetching,error:r.error,refetch:async()=>{await r.refetch()}}}function De(e={}){const{staleTime:s=q,enabled:a=!0}=e,n=X(Z),r=D({queryKey:v.stats(n??""),queryFn:Fe,staleTime:s,gcTime:P,enabled:a&&!!n,retry:2,refetchOnMount:!1,refetchOnReconnect:!1,refetchOnWindowFocus:!1});return{stats:r.data??null,isLoading:r.isLoading,isFetching:r.isFetching,error:r.error,refetch:async()=>{await r.refetch()}}}function qe(e,s={}){const{limit:a=50,staleTime:n=q,enabled:r=!0}=s,l=D({queryKey:v.search(e),queryFn:()=>Me(e,a),staleTime:n,gcTime:P,enabled:r&&e.length>0,retry:2,refetchOnMount:!1,refetchOnReconnect:!1,refetchOnWindowFocus:!1});return{symbols:l.data??[],isLoading:l.isLoading,isFetching:l.isFetching,error:l.error,refetch:async()=>{await l.refetch()}}}function Pe(e){const s=e.replace(/\\/g,"/").split("/"),a=s.findIndex(n=>n==="src");return a>=0?s.slice(a).join("/"):s.length>3?".../"+s.slice(-3).join("/"):s.join("/")}function Ie(e){const s=e.split(".");return s.length>1?s[s.length-1].toLowerCase():""}function Oe(e){return{ts:"text-blue-500",tsx:"text-blue-500",js:"text-yellow-500",jsx:"text-yellow-500",py:"text-green-500",go:"text-cyan-500",rs:"text-orange-500",java:"text-red-500",swift:"text-orange-500"}[e]||"text-gray-500"}function Re({files:e,selectedPath:s,onSelectFile:a,isLoading:n=!1,isFetching:r=!1,onRefresh:l}){const{formatMessage:o}=$(),[m,p]=b.useState(""),d=we(m,300),[f,g]=b.useState(!1),c=b.useMemo(()=>{if(!d.trim())return e;const u=d.toLowerCase();return e.filter(N=>N.path.toLowerCase().includes(u))},[e,d]);b.useEffect(()=>{g(m!==d)},[m,d]);const h=b.useMemo(()=>{const u={};for(const N of c){const i=N.path.replace(/\\/g,"/").split("/"),k=i.length>1?i.slice(0,-1).join("/"):"root";u[k]||(u[k]=[]),u[k].push(N)}return u},[c]);return n?t.jsx(y,{className:"p-4",children:t.jsx("div",{className:"space-y-3",children:[1,2,3,4,5].map(u=>t.jsx("div",{className:"h-12 bg-muted animate-pulse rounded"},u))})}):t.jsxs(y,{className:"flex flex-col h-full",children:[t.jsxs("div",{className:"p-4 border-b border-border",children:[t.jsxs("div",{className:"flex items-center justify-between mb-3",children:[t.jsxs("h3",{className:"text-sm font-medium text-foreground flex items-center gap-2",children:[t.jsx(C,{className:"w-4 h-4"}),o({id:"deepwiki.files.title",defaultMessage:"Documented Files"}),t.jsx(T,{variant:"secondary",className:"text-xs",children:e.length})]}),l&&t.jsx(ee,{variant:"ghost",size:"sm",className:"h-7 w-7 p-0",onClick:()=>l(),disabled:r,children:t.jsx(A,{className:j("w-4 h-4",r&&"animate-spin")})})]}),t.jsxs("div",{className:"relative",children:[t.jsx(de,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground"}),t.jsx(me,{placeholder:o({id:"deepwiki.files.search",defaultMessage:"Search files..."}),value:m,onChange:u=>p(u.target.value),className:"pl-9 h-8 text-sm"}),f&&t.jsx(ue,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 animate-spin text-muted-foreground"})]})]}),t.jsx("div",{className:"flex-1 overflow-y-auto p-2",children:c.length===0?t.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-center",children:[t.jsx(C,{className:"w-10 h-10 text-muted-foreground/40 mb-3"}),t.jsx("p",{className:"text-sm text-muted-foreground",children:o(m?{id:"deepwiki.files.noResults",defaultMessage:"No files match your search"}:{id:"deepwiki.files.empty",defaultMessage:"No documented files yet"})})]}):t.jsx("div",{className:"space-y-1",children:Object.entries(h).map(([u,N])=>t.jsx("div",{children:t.jsx("div",{className:"space-y-0.5",children:N.map(i=>{const k=Ie(i.path),O=Oe(k),R=s===i.path;return t.jsxs("button",{onClick:()=>a(i.path),className:j("w-full flex items-center gap-2 px-3 py-2 rounded-md text-left transition-colors","hover:bg-muted/70",R&&"bg-primary/10 border border-primary/30"),children:[t.jsx(C,{className:j("w-4 h-4 flex-shrink-0",O)}),t.jsx("span",{className:"flex-1 text-sm truncate font-mono",title:i.path,children:Pe(i.path)}),t.jsxs("div",{className:"flex items-center gap-1.5 flex-shrink-0",children:[i.docsGenerated?t.jsx(fe,{className:"w-3.5 h-3.5 text-green-500"}):t.jsx(te,{className:"w-3.5 h-3.5 text-yellow-500"}),i.symbolsCount>0&&t.jsx(T,{variant:"outline",className:"text-xs px-1.5 py-0",children:i.symbolsCount})]})]},i.path)})})},u))})})]})}const S=["ariaDescribedBy","ariaLabel","ariaLabelledBy"],V={ancestors:{tbody:["table"],td:["table"],th:["table"],thead:["table"],tfoot:["table"],tr:["table"]},attributes:{a:[...S,"dataFootnoteBackref","dataFootnoteRef",["className","data-footnote-backref"],"href"],blockquote:["cite"],code:[["className",/^language-./]],del:["cite"],div:["itemScope","itemType"],dl:[...S],h2:[["className","sr-only"]],img:[...S,"longDesc","src"],input:[["disabled",!0],["type","checkbox"]],ins:["cite"],li:[["className","task-list-item"]],ol:[...S,["className","contains-task-list"]],q:["cite"],section:["dataFootnotes",["className","footnotes"]],source:["srcSet"],summary:[...S],table:[...S],ul:[...S,["className","contains-task-list"]],"*":["abbr","accept","acceptCharset","accessKey","action","align","alt","axis","border","cellPadding","cellSpacing","char","charOff","charSet","checked","clear","colSpan","color","cols","compact","coords","dateTime","dir","encType","frame","hSpace","headers","height","hrefLang","htmlFor","id","isMap","itemProp","label","lang","maxLength","media","method","multiple","name","noHref","noShade","noWrap","open","prompt","readOnly","rev","rowSpan","rows","rules","scope","selected","shape","size","span","start","summary","tabIndex","title","useMap","vAlign","value","width"]},clobber:["ariaDescribedBy","ariaLabelledBy","id","name"],clobberPrefix:"user-content-",protocols:{cite:["http","https"],href:["http","https","irc","ircs","mailto","xmpp"],longDesc:["http","https"],src:["http","https"]},required:{input:{disabled:!0,type:"checkbox"}},strip:["script"],tagNames:["a","b","blockquote","br","code","dd","del","details","div","dl","dt","em","h1","h2","h3","h4","h5","h6","hr","i","img","input","ins","kbd","li","ol","p","picture","pre","q","rp","rt","ruby","s","samp","section","source","span","strike","strong","sub","summary","sup","table","tbody","td","tfoot","th","thead","tr","tt","ul","var"]},w={}.hasOwnProperty;function We(e,s){let a={type:"root",children:[]};const n={schema:s?{...V,...s}:V,stack:[]},r=se(n,e);return r&&(Array.isArray(r)?r.length===1?a=r[0]:a.children=r:a=r),a}function se(e,s){if(s&&typeof s=="object"){const a=s;switch(typeof a.type=="string"?a.type:""){case"comment":return Ee(e,a);case"doctype":return Ae(e,a);case"element":return $e(e,a);case"root":return Be(e,a);case"text":return _e(e,a)}}}function Ee(e,s){if(e.schema.allowComments){const a=typeof s.value=="string"?s.value:"",n=a.indexOf("-->"),l={type:"comment",value:n<0?a:a.slice(0,n)};return M(l,s),l}}function Ae(e,s){if(e.schema.allowDoctypes){const a={type:"doctype"};return M(a,s),a}}function $e(e,s){const a=typeof s.tagName=="string"?s.tagName:"";e.stack.push(a);const n=ae(e,s.children),r=Qe(e,s.properties);e.stack.pop();let l=!1;if(a&&a!=="*"&&(!e.schema.tagNames||e.schema.tagNames.includes(a))&&(l=!0,e.schema.ancestors&&w.call(e.schema.ancestors,a))){const m=e.schema.ancestors[a];let p=-1;for(l=!1;++p<m.length;)e.stack.includes(m[p])&&(l=!0)}if(!l)return e.schema.strip&&!e.schema.strip.includes(a)?n:void 0;const o={type:"element",tagName:a,properties:r,children:n};return M(o,s),o}function Be(e,s){const n={type:"root",children:ae(e,s.children)};return M(n,s),n}function _e(e,s){const n={type:"text",value:typeof s.value=="string"?s.value:""};return M(n,s),n}function ae(e,s){const a=[];if(Array.isArray(s)){const n=s;let r=-1;for(;++r<n.length;){const l=se(e,n[r]);l&&(Array.isArray(l)?a.push(...l):a.push(l))}}return a}function Qe(e,s){const a=e.stack[e.stack.length-1],n=e.schema.attributes,r=e.schema.required,l=n&&w.call(n,a)?n[a]:void 0,o=n&&w.call(n,"*")?n["*"]:void 0,m=s&&typeof s=="object"?s:{},p={};let d;for(d in m)if(w.call(m,d)){const f=m[d];let g=K(e,z(l,d),d,f);g==null&&(g=K(e,z(o,d),d,f)),g!=null&&(p[d]=g)}if(r&&w.call(r,a)){const f=r[a];for(d in f)w.call(f,d)&&!w.call(p,d)&&(p[d]=f[d])}return p}function K(e,s,a,n){return s?Array.isArray(n)?Ue(e,s,a,n):ne(e,s,a,n):void 0}function Ue(e,s,a,n){let r=-1;const l=[];for(;++r<n.length;){const o=ne(e,s,a,n[r]);(typeof o=="number"||typeof o=="string")&&l.push(o)}return l}function ne(e,s,a,n){if(!(typeof n!="boolean"&&typeof n!="number"&&typeof n!="string")&&Ve(e,a,n)){if(typeof s=="object"&&s.length>1){let r=!1,l=0;for(;++l<s.length;){const o=s[l];if(o&&typeof o=="object"&&"flags"in o){if(o.test(String(n))){r=!0;break}}else if(o===n){r=!0;break}}if(!r)return}return e.schema.clobber&&e.schema.clobberPrefix&&e.schema.clobber.includes(a)?e.schema.clobberPrefix+n:n}}function Ve(e,s,a){const n=e.schema.protocols&&w.call(e.schema.protocols,s)?e.schema.protocols[s]:void 0;if(!n||n.length===0)return!0;const r=String(a),l=r.indexOf(":"),o=r.indexOf("?"),m=r.indexOf("#"),p=r.indexOf("/");if(l<0||p>-1&&l>p||o>-1&&l>o||m>-1&&l>m)return!0;let d=-1;for(;++d<n.length;){const f=n[d];if(l===f.length&&r.slice(0,f.length)===f)return!0}return!1}function M(e,s){const a=he(s);s.data&&(e.data=xe(s.data)),a&&(e.position=a)}function z(e,s){let a,n=-1;if(e)for(;++n<e.length;){const r=e[n],l=typeof r=="string"?r:r[0];if(l===s)return r;l==="data*"&&(a=r)}if(s.length>4&&s.slice(0,4).toLowerCase()==="data")return a}function G(e){return function(s){return We(s,e)}}function H(e){return{function:{symbol:"λ",label:"Function"},async_function:{symbol:"λ",label:"Async Function"},class:{symbol:"◇",label:"Class"},method:{symbol:"◈",label:"Method"},interface:{symbol:"△",label:"Interface"},variable:{symbol:"•",label:"Variable"},constant:{symbol:"⬡",label:"Constant"}}[e]||{symbol:"•",label:"Symbol"}}function Y(e){return{function:"text-blue-500",async_function:"text-blue-400",class:"text-purple-500",method:"text-purple-400",interface:"text-teal-500",variable:"text-gray-500",constant:"text-amber-500"}[e]||"text-gray-500"}const J={h1:({children:e})=>t.jsx("h1",{className:"text-xl font-bold mt-6 mb-3 text-foreground",children:e}),h2:({children:e})=>t.jsx("h2",{className:"text-lg font-semibold mt-5 mb-2 text-foreground",children:e}),h3:({children:e})=>t.jsx("h3",{className:"text-base font-semibold mt-4 mb-2 text-foreground",children:e}),p:({children:e})=>t.jsx("p",{className:"mb-3 leading-relaxed text-foreground/90",children:e}),a:({href:e,children:s})=>t.jsx("a",{href:e,className:"text-primary hover:underline",target:e!=null&&e.startsWith("http")?"_blank":void 0,rel:e!=null&&e.startsWith("http")?"noopener noreferrer":void 0,children:s}),code:({className:e,children:s})=>e?t.jsx("code",{className:j("block bg-muted p-3 rounded-md text-sm font-mono overflow-x-auto",e),children:s}):t.jsx("code",{className:"bg-muted px-1.5 py-0.5 rounded text-sm font-mono",children:s}),pre:({children:e})=>t.jsx("pre",{className:"bg-muted p-4 rounded-lg my-4 overflow-x-auto",children:e}),ul:({children:e})=>t.jsx("ul",{className:"list-disc list-inside mb-3 space-y-1",children:e}),ol:({children:e})=>t.jsx("ol",{className:"list-decimal list-inside mb-3 space-y-1",children:e}),blockquote:({children:e})=>t.jsx("blockquote",{className:"border-l-4 border-primary/50 pl-4 my-4 italic text-muted-foreground",children:e}),table:({children:e})=>t.jsx("div",{className:"overflow-x-auto my-4",children:t.jsx("table",{className:"min-w-full border border-border",children:e})}),thead:({children:e})=>t.jsx("thead",{className:"bg-muted",children:e}),th:({children:e})=>t.jsx("th",{className:"border border-border px-3 py-2 text-left font-medium",children:e}),td:({children:e})=>t.jsx("td",{className:"border border-border px-3 py-2",children:e})};function Ke({doc:e,content:s,symbols:a,isLoading:n=!1,error:r=null,filePath:l}){var g;const{formatMessage:o}=$(),[m,p]=b.useState(null),d=b.useCallback((c,h)=>{const u=new URL(window.location.href);l&&u.searchParams.set("file",l),u.hash=h.replace("#",""),navigator.clipboard.writeText(u.toString()).then(()=>{p(c),setTimeout(()=>p(null),2e3)})},[l]),f=b.useMemo(()=>{if(!s)return[];const c=/<!-- deepwiki-symbol-start name="([^"]+)" type="([^"]+)" -->([\s\S]*?)<!-- deepwiki-symbol-end -->/g,h=[];let u;for(;(u=c.exec(s))!==null;)h.push({name:u[1],type:u[2],content:u[3].trim()});return h.length===0&&s.trim()&&h.push({name:"Documentation",type:"document",content:s.trim()}),h},[s]);return n?t.jsx(y,{className:"flex-1 p-6",children:t.jsxs("div",{className:"space-y-4 animate-pulse",children:[t.jsx("div",{className:"h-8 bg-muted rounded w-1/3"}),t.jsx("div",{className:"h-4 bg-muted rounded w-2/3"}),t.jsx("div",{className:"h-4 bg-muted rounded w-1/2"}),t.jsx("div",{className:"h-32 bg-muted rounded mt-6"}),t.jsx("div",{className:"h-4 bg-muted rounded w-3/4"}),t.jsx("div",{className:"h-4 bg-muted rounded w-2/3"})]})}):r?t.jsxs(y,{className:"flex-1 p-6 flex flex-col items-center justify-center text-center",children:[t.jsx(pe,{className:"w-12 h-12 text-destructive/50 mb-4"}),t.jsx("h3",{className:"text-lg font-medium text-foreground mb-2",children:o({id:"deepwiki.viewer.error.title",defaultMessage:"Error Loading Document"})}),t.jsx("p",{className:"text-sm text-muted-foreground",children:r.message})]}):!e&&!s?t.jsxs(y,{className:"flex-1 p-6 flex flex-col items-center justify-center text-center",children:[t.jsx(C,{className:"w-12 h-12 text-muted-foreground/30 mb-4"}),t.jsx("h3",{className:"text-lg font-medium text-foreground mb-2",children:o({id:"deepwiki.viewer.empty.title",defaultMessage:"Select a File"})}),t.jsx("p",{className:"text-sm text-muted-foreground",children:o({id:"deepwiki.viewer.empty.message",defaultMessage:"Choose a file from the list to view its documentation"})})]}):t.jsxs(y,{className:"flex-1 flex flex-col overflow-hidden",children:[t.jsx("div",{className:"p-4 border-b border-border",children:t.jsx("div",{className:"flex items-start justify-between gap-4",children:t.jsxs("div",{children:[t.jsxs("h2",{className:"text-lg font-semibold text-foreground flex items-center gap-2",children:[t.jsx(C,{className:"w-5 h-5 text-primary"}),t.jsx("span",{className:"font-mono text-sm",title:e==null?void 0:e.path,children:((g=e==null?void 0:e.path)==null?void 0:g.split("/").pop())||"Documentation"})]}),e&&t.jsxs("div",{className:"flex items-center gap-3 mt-1.5 text-xs text-muted-foreground",children:[e.generatedAt&&t.jsxs("span",{className:"flex items-center gap-1",children:[t.jsx(te,{className:"w-3 h-3"}),new Date(e.generatedAt).toLocaleString()]}),e.llmTool&&t.jsxs("span",{className:"flex items-center gap-1",children:[t.jsx(ge,{className:"w-3 h-3"}),e.llmTool]})]})]})})}),t.jsxs("div",{className:"flex-1 flex overflow-hidden",children:[t.jsxs("div",{className:"flex-1 overflow-y-auto p-6",children:[a.length>0&&t.jsx("div",{className:"mb-6 flex flex-wrap gap-2",children:a.map(c=>{const h=H(c.type);return t.jsxs("a",{href:`#${c.anchor.replace("#","")}`,className:j("inline-flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium","bg-muted/50 hover:bg-muted transition-colors",Y(c.type)),"aria-label":`${h.label}: ${c.name}`,children:[t.jsx("span",{"aria-hidden":"true",children:h.symbol}),t.jsx("span",{children:c.name}),t.jsx(T,{variant:"outline",className:"text-[10px] px-1",children:c.type})]},c.name)})}),t.jsxs("div",{className:"space-y-6",children:[f.map((c,h)=>t.jsx("section",{id:c.name.toLowerCase().replace(/\s+/g,"-"),className:"scroll-mt-4",children:t.jsx(_,{remarkPlugins:[Q],rehypePlugins:[G],components:J,children:c.content})},`${c.name}-${h}`)),f.length===0&&s&&t.jsx(_,{remarkPlugins:[Q],rehypePlugins:[G],components:J,children:s})]})]}),a.length>0&&t.jsxs("div",{className:"w-48 border-l border-border p-4 overflow-y-auto hidden lg:block",children:[t.jsxs("h4",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-3 flex items-center gap-2",children:[t.jsx(F,{className:"w-3 h-3"}),o({id:"deepwiki.viewer.toc",defaultMessage:"Symbols"})]}),t.jsx("nav",{className:"space-y-1",role:"list","aria-label":"Document symbols",children:a.map(c=>{const h=H(c.type);return t.jsxs("div",{className:"group flex items-center gap-1",children:[t.jsxs("a",{href:`#${c.anchor.replace("#","")}`,className:j("flex-1 text-xs py-1.5 px-2 rounded transition-colors","text-muted-foreground hover:text-foreground hover:bg-muted/50","font-mono"),role:"listitem","aria-label":`${h.label}: ${c.name}`,children:[t.jsx("span",{className:j("mr-1",Y(c.type)),"aria-hidden":"true",children:h.symbol}),c.name]}),t.jsx("button",{onClick:()=>d(c.name,c.anchor),className:j("opacity-0 group-hover:opacity-100 p-1 rounded transition-all","hover:bg-muted/50",m===c.name?"text-green-500":"text-muted-foreground hover:text-foreground"),"aria-label":m===c.name?o({id:"deepwiki.viewer.linkCopied",defaultMessage:"Link copied"}):o({id:"deepwiki.viewer.copyLink",defaultMessage:"Copy deep link to {name}"},{name:c.name}),children:m===c.name?t.jsx(be,{className:"w-3 h-3","aria-hidden":"true"}):t.jsx(ve,{className:"w-3 h-3","aria-hidden":"true"})})]},c.name)})})]})]})]})}function L({label:e,value:s,icon:a,color:n}){return t.jsx(y,{className:"p-4",children:t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx("div",{className:j("p-2 rounded-lg",n),children:t.jsx(a,{className:"w-5 h-5"})}),t.jsxs("div",{children:[t.jsx("p",{className:"text-2xl font-bold text-foreground",children:s}),t.jsx("p",{className:"text-xs text-muted-foreground",children:e})]})]})})}function Ze(){const{formatMessage:e}=$(),[s,a]=ye(),[n,r]=b.useState("documents"),[l,o]=b.useState(""),m=b.useRef(!1),p=s.get("file"),d=window.location.hash.slice(1),[f,g]=b.useState(p),{files:c,isLoading:h,isFetching:u,refetch:N}=Le(),{stats:i,isLoading:k,refetch:O}=De(),{doc:R,content:W,symbols:re,isLoading:E,error:le}=Te(f),{symbols:B,isLoading:ie}=qe(l,{enabled:n==="index"}),oe=b.useCallback(x=>{g(x),a({file:x}),m.current=!1},[a]);b.useEffect(()=>{d&&W&&!E&&!m.current&&(m.current=!0,setTimeout(()=>{const x=document.getElementById(d);x&&x.scrollIntoView({behavior:"smooth",block:"start"})},100))},[d,W,E]);const ce=()=>{N(),O()};return t.jsxs("div",{className:"h-full flex flex-col space-y-4",children:[t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4",children:[t.jsxs("div",{children:[t.jsxs("h1",{className:"text-2xl font-bold text-foreground flex items-center gap-2",children:[t.jsx(U,{className:"w-6 h-6 text-primary"}),e({id:"deepwiki.title",defaultMessage:"DeepWiki"})]}),t.jsx("p",{className:"text-muted-foreground mt-1",children:e({id:"deepwiki.description",defaultMessage:"Code documentation with deep-linking to source symbols"})})]}),t.jsx("div",{className:"flex gap-2",children:t.jsxs(ee,{variant:"outline",onClick:ce,disabled:u,children:[t.jsx(A,{className:j("w-4 h-4 mr-2",u&&"animate-spin")}),e({id:"common.actions.refresh",defaultMessage:"Refresh"})]})})]}),t.jsx(Ne,{value:n,onValueChange:x=>r(x),tabs:[{value:"documents",label:e({id:"deepwiki.tabs.documents",defaultMessage:"Documents"})},{value:"index",label:e({id:"deepwiki.tabs.index",defaultMessage:"Symbol Index"})},{value:"stats",label:e({id:"deepwiki.tabs.stats",defaultMessage:"Statistics"})}]}),n==="documents"&&t.jsxs("div",{className:"flex-1 flex gap-4 min-h-0",children:[t.jsx("div",{className:"w-80 flex-shrink-0",children:t.jsx(Re,{files:c,selectedPath:f,onSelectFile:oe,isLoading:h,isFetching:u,onRefresh:()=>N()})}),t.jsx(Ke,{doc:R,content:W,symbols:re,isLoading:E,error:le,filePath:f??void 0})]}),n==="index"&&t.jsx("div",{className:"flex-1 overflow-y-auto",children:t.jsxs(y,{className:"p-4 h-full flex flex-col",children:[t.jsx("div",{className:"mb-4",children:t.jsx("input",{type:"text",placeholder:e({id:"deepwiki.index.search",defaultMessage:"Search symbols..."}),value:l,onChange:x=>o(x.target.value),className:"w-full px-4 py-2 rounded-md border border-input bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-primary"})}),ie?t.jsx("div",{className:"flex-1 flex items-center justify-center",children:t.jsx(A,{className:"w-6 h-6 animate-spin text-muted-foreground"})}):B.length>0?t.jsx("div",{className:"flex-1 overflow-y-auto space-y-2",children:B.map(x=>t.jsxs("button",{onClick:()=>{g(x.sourceFile),r("documents")},className:"w-full p-3 rounded-md border border-border hover:bg-muted/50 transition-colors text-left",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(F,{className:"w-4 h-4 text-primary"}),t.jsx("span",{className:"font-medium text-foreground",children:x.name}),t.jsx(T,{variant:"outline",className:"text-xs",children:x.type})]}),t.jsxs("p",{className:"text-xs text-muted-foreground mt-1 font-mono truncate",children:[x.sourceFile,":",x.lineRange[0],"-",x.lineRange[1]]})]},`${x.name}-${x.sourceFile}`))}):l?t.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center text-center",children:[t.jsx(F,{className:"w-10 h-10 text-muted-foreground/30 mb-3"}),t.jsx("p",{className:"text-sm text-muted-foreground",children:e({id:"deepwiki.index.noResults",defaultMessage:"No symbols found"})})]}):t.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center text-center",children:[t.jsx(F,{className:"w-10 h-10 text-muted-foreground/30 mb-3"}),t.jsx("p",{className:"text-sm text-muted-foreground",children:e({id:"deepwiki.index.placeholder",defaultMessage:"Enter a search query to find symbols"})})]})]})}),n==="stats"&&t.jsx("div",{className:"flex-1 overflow-y-auto space-y-4",children:k?t.jsx(y,{className:"p-6",children:t.jsxs("div",{className:"space-y-4 animate-pulse",children:[t.jsx("div",{className:"h-20 bg-muted rounded"}),t.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[t.jsx("div",{className:"h-24 bg-muted rounded"}),t.jsx("div",{className:"h-24 bg-muted rounded"}),t.jsx("div",{className:"h-24 bg-muted rounded"}),t.jsx("div",{className:"h-24 bg-muted rounded"})]})]})}):t.jsxs(t.Fragment,{children:[t.jsx(y,{className:"p-4",children:t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx("div",{className:j("w-3 h-3 rounded-full",i!=null&&i.available?"bg-green-500":"bg-red-500")}),t.jsx("span",{className:"text-sm font-medium text-foreground",children:i!=null&&i.available?e({id:"deepwiki.stats.available",defaultMessage:"Database Connected"}):e({id:"deepwiki.stats.unavailable",defaultMessage:"Database Not Available"})})]}),(i==null?void 0:i.dbPath)&&t.jsx("code",{className:"text-xs text-muted-foreground bg-muted px-2 py-1 rounded",children:i.dbPath})]})}),t.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[t.jsx(L,{label:e({id:"deepwiki.stats.files",defaultMessage:"Files"}),value:(i==null?void 0:i.files)??0,icon:C,color:"bg-blue-500/10 text-blue-500"}),t.jsx(L,{label:e({id:"deepwiki.stats.symbols",defaultMessage:"Symbols"}),value:(i==null?void 0:i.symbols)??0,icon:F,color:"bg-purple-500/10 text-purple-500"}),t.jsx(L,{label:e({id:"deepwiki.stats.docs",defaultMessage:"Documents"}),value:(i==null?void 0:i.docs)??0,icon:U,color:"bg-green-500/10 text-green-500"}),t.jsx(L,{label:e({id:"deepwiki.stats.needingDocs",defaultMessage:"Need Docs"}),value:(i==null?void 0:i.filesNeedingDocs)??0,icon:je,color:"bg-amber-500/10 text-amber-500"})]}),t.jsxs(y,{className:"p-4",children:[t.jsx("h3",{className:"text-sm font-medium text-foreground mb-2",children:e({id:"deepwiki.stats.howTo.title",defaultMessage:"Documentation Index"})}),t.jsx("p",{className:"text-sm text-muted-foreground",children:e({id:"deepwiki.stats.howTo.description",defaultMessage:"DeepWiki automatically indexes symbols and documentation from code. Currently in read-only mode."})})]})]})})]})}export{Ze as DeepWikiPage,Ze as default};
|
|
2
|
-
//# sourceMappingURL=DeepWikiPage-
|
|
1
|
+
import{a9 as X,aa as Z,ab as D,u as $,r as b,j as t,C as y,B as T,e as ee,R as A,c as j,b as de,I as me,N as ue,M as fe,l as te,g8 as he,g9 as xe,m as pe,U as ge,cl as _,cm as Q,bq as be,bs as ye,Y as U,a8 as je}from"./index-dWT2M6Ef.js";import{T as Ne}from"./TabsNavigation-qqt70VYL.js";import{u as we}from"./useDebounce-bXiFhQx9.js";import{F as C}from"./file-text-DrJFiOUB.js";import{H as F}from"./hash-CRPT_tJQ.js";import{L as ve}from"./link-2-DE9lMxa-.js";const v={all:["deepWiki"],files:e=>[...v.all,"files",e],doc:e=>[...v.all,"doc",e],stats:e=>[...v.all,"stats",e],search:e=>[...v.all,"search",e]},q=300*1e3,P=600*1e3,ke=10*1e3;async function I(e,s=ke){const a=new AbortController,n=setTimeout(()=>a.abort(),s);try{return await fetch(e,{signal:a.signal})}finally{clearTimeout(n)}}async function Se(){const e=await I("/api/deepwiki/files");if(!e.ok)throw new Error(`Failed to fetch files: ${e.statusText}`);return e.json()}async function Ce(e){const s=await I(`/api/deepwiki/doc?path=${encodeURIComponent(e)}`);if(!s.ok){if(s.status===404)return{doc:null,content:"",symbols:[]};throw new Error(`Failed to fetch document: ${s.statusText}`)}return s.json()}async function Fe(){const e=await I("/api/deepwiki/stats");if(!e.ok)throw new Error(`Failed to fetch stats: ${e.statusText}`);return e.json()}async function Me(e,s=50){const a=await I(`/api/deepwiki/search?q=${encodeURIComponent(e)}&limit=${s}`);if(!a.ok)throw new Error(`Failed to search symbols: ${a.statusText}`);return a.json()}function Le(e={}){const{staleTime:s=q,enabled:a=!0}=e,n=X(Z),r=D({queryKey:v.files(n??""),queryFn:Se,staleTime:s,gcTime:P,enabled:a&&!!n,retry:2,refetchOnMount:!1,refetchOnReconnect:!1,refetchOnWindowFocus:!1});return{files:r.data??[],isLoading:r.isLoading,isFetching:r.isFetching,error:r.error,refetch:async()=>{await r.refetch()}}}function Te(e,s={}){var l,o,m;const{staleTime:a=q,enabled:n=!0}=s,r=D({queryKey:v.doc(e??""),queryFn:()=>Ce(e),staleTime:a,gcTime:P,enabled:n&&!!e,retry:2,refetchOnMount:!1,refetchOnReconnect:!1,refetchOnWindowFocus:!1});return{doc:((l=r.data)==null?void 0:l.doc)??null,content:((o=r.data)==null?void 0:o.content)??"",symbols:((m=r.data)==null?void 0:m.symbols)??[],isLoading:r.isLoading,isFetching:r.isFetching,error:r.error,refetch:async()=>{await r.refetch()}}}function De(e={}){const{staleTime:s=q,enabled:a=!0}=e,n=X(Z),r=D({queryKey:v.stats(n??""),queryFn:Fe,staleTime:s,gcTime:P,enabled:a&&!!n,retry:2,refetchOnMount:!1,refetchOnReconnect:!1,refetchOnWindowFocus:!1});return{stats:r.data??null,isLoading:r.isLoading,isFetching:r.isFetching,error:r.error,refetch:async()=>{await r.refetch()}}}function qe(e,s={}){const{limit:a=50,staleTime:n=q,enabled:r=!0}=s,l=D({queryKey:v.search(e),queryFn:()=>Me(e,a),staleTime:n,gcTime:P,enabled:r&&e.length>0,retry:2,refetchOnMount:!1,refetchOnReconnect:!1,refetchOnWindowFocus:!1});return{symbols:l.data??[],isLoading:l.isLoading,isFetching:l.isFetching,error:l.error,refetch:async()=>{await l.refetch()}}}function Pe(e){const s=e.replace(/\\/g,"/").split("/"),a=s.findIndex(n=>n==="src");return a>=0?s.slice(a).join("/"):s.length>3?".../"+s.slice(-3).join("/"):s.join("/")}function Ie(e){const s=e.split(".");return s.length>1?s[s.length-1].toLowerCase():""}function Oe(e){return{ts:"text-blue-500",tsx:"text-blue-500",js:"text-yellow-500",jsx:"text-yellow-500",py:"text-green-500",go:"text-cyan-500",rs:"text-orange-500",java:"text-red-500",swift:"text-orange-500"}[e]||"text-gray-500"}function Re({files:e,selectedPath:s,onSelectFile:a,isLoading:n=!1,isFetching:r=!1,onRefresh:l}){const{formatMessage:o}=$(),[m,p]=b.useState(""),d=we(m,300),[f,g]=b.useState(!1),c=b.useMemo(()=>{if(!d.trim())return e;const u=d.toLowerCase();return e.filter(N=>N.path.toLowerCase().includes(u))},[e,d]);b.useEffect(()=>{g(m!==d)},[m,d]);const h=b.useMemo(()=>{const u={};for(const N of c){const i=N.path.replace(/\\/g,"/").split("/"),k=i.length>1?i.slice(0,-1).join("/"):"root";u[k]||(u[k]=[]),u[k].push(N)}return u},[c]);return n?t.jsx(y,{className:"p-4",children:t.jsx("div",{className:"space-y-3",children:[1,2,3,4,5].map(u=>t.jsx("div",{className:"h-12 bg-muted animate-pulse rounded"},u))})}):t.jsxs(y,{className:"flex flex-col h-full",children:[t.jsxs("div",{className:"p-4 border-b border-border",children:[t.jsxs("div",{className:"flex items-center justify-between mb-3",children:[t.jsxs("h3",{className:"text-sm font-medium text-foreground flex items-center gap-2",children:[t.jsx(C,{className:"w-4 h-4"}),o({id:"deepwiki.files.title",defaultMessage:"Documented Files"}),t.jsx(T,{variant:"secondary",className:"text-xs",children:e.length})]}),l&&t.jsx(ee,{variant:"ghost",size:"sm",className:"h-7 w-7 p-0",onClick:()=>l(),disabled:r,children:t.jsx(A,{className:j("w-4 h-4",r&&"animate-spin")})})]}),t.jsxs("div",{className:"relative",children:[t.jsx(de,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground"}),t.jsx(me,{placeholder:o({id:"deepwiki.files.search",defaultMessage:"Search files..."}),value:m,onChange:u=>p(u.target.value),className:"pl-9 h-8 text-sm"}),f&&t.jsx(ue,{className:"absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 animate-spin text-muted-foreground"})]})]}),t.jsx("div",{className:"flex-1 overflow-y-auto p-2",children:c.length===0?t.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-center",children:[t.jsx(C,{className:"w-10 h-10 text-muted-foreground/40 mb-3"}),t.jsx("p",{className:"text-sm text-muted-foreground",children:o(m?{id:"deepwiki.files.noResults",defaultMessage:"No files match your search"}:{id:"deepwiki.files.empty",defaultMessage:"No documented files yet"})})]}):t.jsx("div",{className:"space-y-1",children:Object.entries(h).map(([u,N])=>t.jsx("div",{children:t.jsx("div",{className:"space-y-0.5",children:N.map(i=>{const k=Ie(i.path),O=Oe(k),R=s===i.path;return t.jsxs("button",{onClick:()=>a(i.path),className:j("w-full flex items-center gap-2 px-3 py-2 rounded-md text-left transition-colors","hover:bg-muted/70",R&&"bg-primary/10 border border-primary/30"),children:[t.jsx(C,{className:j("w-4 h-4 flex-shrink-0",O)}),t.jsx("span",{className:"flex-1 text-sm truncate font-mono",title:i.path,children:Pe(i.path)}),t.jsxs("div",{className:"flex items-center gap-1.5 flex-shrink-0",children:[i.docsGenerated?t.jsx(fe,{className:"w-3.5 h-3.5 text-green-500"}):t.jsx(te,{className:"w-3.5 h-3.5 text-yellow-500"}),i.symbolsCount>0&&t.jsx(T,{variant:"outline",className:"text-xs px-1.5 py-0",children:i.symbolsCount})]})]},i.path)})})},u))})})]})}const S=["ariaDescribedBy","ariaLabel","ariaLabelledBy"],V={ancestors:{tbody:["table"],td:["table"],th:["table"],thead:["table"],tfoot:["table"],tr:["table"]},attributes:{a:[...S,"dataFootnoteBackref","dataFootnoteRef",["className","data-footnote-backref"],"href"],blockquote:["cite"],code:[["className",/^language-./]],del:["cite"],div:["itemScope","itemType"],dl:[...S],h2:[["className","sr-only"]],img:[...S,"longDesc","src"],input:[["disabled",!0],["type","checkbox"]],ins:["cite"],li:[["className","task-list-item"]],ol:[...S,["className","contains-task-list"]],q:["cite"],section:["dataFootnotes",["className","footnotes"]],source:["srcSet"],summary:[...S],table:[...S],ul:[...S,["className","contains-task-list"]],"*":["abbr","accept","acceptCharset","accessKey","action","align","alt","axis","border","cellPadding","cellSpacing","char","charOff","charSet","checked","clear","colSpan","color","cols","compact","coords","dateTime","dir","encType","frame","hSpace","headers","height","hrefLang","htmlFor","id","isMap","itemProp","label","lang","maxLength","media","method","multiple","name","noHref","noShade","noWrap","open","prompt","readOnly","rev","rowSpan","rows","rules","scope","selected","shape","size","span","start","summary","tabIndex","title","useMap","vAlign","value","width"]},clobber:["ariaDescribedBy","ariaLabelledBy","id","name"],clobberPrefix:"user-content-",protocols:{cite:["http","https"],href:["http","https","irc","ircs","mailto","xmpp"],longDesc:["http","https"],src:["http","https"]},required:{input:{disabled:!0,type:"checkbox"}},strip:["script"],tagNames:["a","b","blockquote","br","code","dd","del","details","div","dl","dt","em","h1","h2","h3","h4","h5","h6","hr","i","img","input","ins","kbd","li","ol","p","picture","pre","q","rp","rt","ruby","s","samp","section","source","span","strike","strong","sub","summary","sup","table","tbody","td","tfoot","th","thead","tr","tt","ul","var"]},w={}.hasOwnProperty;function We(e,s){let a={type:"root",children:[]};const n={schema:s?{...V,...s}:V,stack:[]},r=se(n,e);return r&&(Array.isArray(r)?r.length===1?a=r[0]:a.children=r:a=r),a}function se(e,s){if(s&&typeof s=="object"){const a=s;switch(typeof a.type=="string"?a.type:""){case"comment":return Ee(e,a);case"doctype":return Ae(e,a);case"element":return $e(e,a);case"root":return Be(e,a);case"text":return _e(e,a)}}}function Ee(e,s){if(e.schema.allowComments){const a=typeof s.value=="string"?s.value:"",n=a.indexOf("-->"),l={type:"comment",value:n<0?a:a.slice(0,n)};return M(l,s),l}}function Ae(e,s){if(e.schema.allowDoctypes){const a={type:"doctype"};return M(a,s),a}}function $e(e,s){const a=typeof s.tagName=="string"?s.tagName:"";e.stack.push(a);const n=ae(e,s.children),r=Qe(e,s.properties);e.stack.pop();let l=!1;if(a&&a!=="*"&&(!e.schema.tagNames||e.schema.tagNames.includes(a))&&(l=!0,e.schema.ancestors&&w.call(e.schema.ancestors,a))){const m=e.schema.ancestors[a];let p=-1;for(l=!1;++p<m.length;)e.stack.includes(m[p])&&(l=!0)}if(!l)return e.schema.strip&&!e.schema.strip.includes(a)?n:void 0;const o={type:"element",tagName:a,properties:r,children:n};return M(o,s),o}function Be(e,s){const n={type:"root",children:ae(e,s.children)};return M(n,s),n}function _e(e,s){const n={type:"text",value:typeof s.value=="string"?s.value:""};return M(n,s),n}function ae(e,s){const a=[];if(Array.isArray(s)){const n=s;let r=-1;for(;++r<n.length;){const l=se(e,n[r]);l&&(Array.isArray(l)?a.push(...l):a.push(l))}}return a}function Qe(e,s){const a=e.stack[e.stack.length-1],n=e.schema.attributes,r=e.schema.required,l=n&&w.call(n,a)?n[a]:void 0,o=n&&w.call(n,"*")?n["*"]:void 0,m=s&&typeof s=="object"?s:{},p={};let d;for(d in m)if(w.call(m,d)){const f=m[d];let g=K(e,z(l,d),d,f);g==null&&(g=K(e,z(o,d),d,f)),g!=null&&(p[d]=g)}if(r&&w.call(r,a)){const f=r[a];for(d in f)w.call(f,d)&&!w.call(p,d)&&(p[d]=f[d])}return p}function K(e,s,a,n){return s?Array.isArray(n)?Ue(e,s,a,n):ne(e,s,a,n):void 0}function Ue(e,s,a,n){let r=-1;const l=[];for(;++r<n.length;){const o=ne(e,s,a,n[r]);(typeof o=="number"||typeof o=="string")&&l.push(o)}return l}function ne(e,s,a,n){if(!(typeof n!="boolean"&&typeof n!="number"&&typeof n!="string")&&Ve(e,a,n)){if(typeof s=="object"&&s.length>1){let r=!1,l=0;for(;++l<s.length;){const o=s[l];if(o&&typeof o=="object"&&"flags"in o){if(o.test(String(n))){r=!0;break}}else if(o===n){r=!0;break}}if(!r)return}return e.schema.clobber&&e.schema.clobberPrefix&&e.schema.clobber.includes(a)?e.schema.clobberPrefix+n:n}}function Ve(e,s,a){const n=e.schema.protocols&&w.call(e.schema.protocols,s)?e.schema.protocols[s]:void 0;if(!n||n.length===0)return!0;const r=String(a),l=r.indexOf(":"),o=r.indexOf("?"),m=r.indexOf("#"),p=r.indexOf("/");if(l<0||p>-1&&l>p||o>-1&&l>o||m>-1&&l>m)return!0;let d=-1;for(;++d<n.length;){const f=n[d];if(l===f.length&&r.slice(0,f.length)===f)return!0}return!1}function M(e,s){const a=he(s);s.data&&(e.data=xe(s.data)),a&&(e.position=a)}function z(e,s){let a,n=-1;if(e)for(;++n<e.length;){const r=e[n],l=typeof r=="string"?r:r[0];if(l===s)return r;l==="data*"&&(a=r)}if(s.length>4&&s.slice(0,4).toLowerCase()==="data")return a}function G(e){return function(s){return We(s,e)}}function H(e){return{function:{symbol:"λ",label:"Function"},async_function:{symbol:"λ",label:"Async Function"},class:{symbol:"◇",label:"Class"},method:{symbol:"◈",label:"Method"},interface:{symbol:"△",label:"Interface"},variable:{symbol:"•",label:"Variable"},constant:{symbol:"⬡",label:"Constant"}}[e]||{symbol:"•",label:"Symbol"}}function Y(e){return{function:"text-blue-500",async_function:"text-blue-400",class:"text-purple-500",method:"text-purple-400",interface:"text-teal-500",variable:"text-gray-500",constant:"text-amber-500"}[e]||"text-gray-500"}const J={h1:({children:e})=>t.jsx("h1",{className:"text-xl font-bold mt-6 mb-3 text-foreground",children:e}),h2:({children:e})=>t.jsx("h2",{className:"text-lg font-semibold mt-5 mb-2 text-foreground",children:e}),h3:({children:e})=>t.jsx("h3",{className:"text-base font-semibold mt-4 mb-2 text-foreground",children:e}),p:({children:e})=>t.jsx("p",{className:"mb-3 leading-relaxed text-foreground/90",children:e}),a:({href:e,children:s})=>t.jsx("a",{href:e,className:"text-primary hover:underline",target:e!=null&&e.startsWith("http")?"_blank":void 0,rel:e!=null&&e.startsWith("http")?"noopener noreferrer":void 0,children:s}),code:({className:e,children:s})=>e?t.jsx("code",{className:j("block bg-muted p-3 rounded-md text-sm font-mono overflow-x-auto",e),children:s}):t.jsx("code",{className:"bg-muted px-1.5 py-0.5 rounded text-sm font-mono",children:s}),pre:({children:e})=>t.jsx("pre",{className:"bg-muted p-4 rounded-lg my-4 overflow-x-auto",children:e}),ul:({children:e})=>t.jsx("ul",{className:"list-disc list-inside mb-3 space-y-1",children:e}),ol:({children:e})=>t.jsx("ol",{className:"list-decimal list-inside mb-3 space-y-1",children:e}),blockquote:({children:e})=>t.jsx("blockquote",{className:"border-l-4 border-primary/50 pl-4 my-4 italic text-muted-foreground",children:e}),table:({children:e})=>t.jsx("div",{className:"overflow-x-auto my-4",children:t.jsx("table",{className:"min-w-full border border-border",children:e})}),thead:({children:e})=>t.jsx("thead",{className:"bg-muted",children:e}),th:({children:e})=>t.jsx("th",{className:"border border-border px-3 py-2 text-left font-medium",children:e}),td:({children:e})=>t.jsx("td",{className:"border border-border px-3 py-2",children:e})};function Ke({doc:e,content:s,symbols:a,isLoading:n=!1,error:r=null,filePath:l}){var g;const{formatMessage:o}=$(),[m,p]=b.useState(null),d=b.useCallback((c,h)=>{const u=new URL(window.location.href);l&&u.searchParams.set("file",l),u.hash=h.replace("#",""),navigator.clipboard.writeText(u.toString()).then(()=>{p(c),setTimeout(()=>p(null),2e3)})},[l]),f=b.useMemo(()=>{if(!s)return[];const c=/<!-- deepwiki-symbol-start name="([^"]+)" type="([^"]+)" -->([\s\S]*?)<!-- deepwiki-symbol-end -->/g,h=[];let u;for(;(u=c.exec(s))!==null;)h.push({name:u[1],type:u[2],content:u[3].trim()});return h.length===0&&s.trim()&&h.push({name:"Documentation",type:"document",content:s.trim()}),h},[s]);return n?t.jsx(y,{className:"flex-1 p-6",children:t.jsxs("div",{className:"space-y-4 animate-pulse",children:[t.jsx("div",{className:"h-8 bg-muted rounded w-1/3"}),t.jsx("div",{className:"h-4 bg-muted rounded w-2/3"}),t.jsx("div",{className:"h-4 bg-muted rounded w-1/2"}),t.jsx("div",{className:"h-32 bg-muted rounded mt-6"}),t.jsx("div",{className:"h-4 bg-muted rounded w-3/4"}),t.jsx("div",{className:"h-4 bg-muted rounded w-2/3"})]})}):r?t.jsxs(y,{className:"flex-1 p-6 flex flex-col items-center justify-center text-center",children:[t.jsx(pe,{className:"w-12 h-12 text-destructive/50 mb-4"}),t.jsx("h3",{className:"text-lg font-medium text-foreground mb-2",children:o({id:"deepwiki.viewer.error.title",defaultMessage:"Error Loading Document"})}),t.jsx("p",{className:"text-sm text-muted-foreground",children:r.message})]}):!e&&!s?t.jsxs(y,{className:"flex-1 p-6 flex flex-col items-center justify-center text-center",children:[t.jsx(C,{className:"w-12 h-12 text-muted-foreground/30 mb-4"}),t.jsx("h3",{className:"text-lg font-medium text-foreground mb-2",children:o({id:"deepwiki.viewer.empty.title",defaultMessage:"Select a File"})}),t.jsx("p",{className:"text-sm text-muted-foreground",children:o({id:"deepwiki.viewer.empty.message",defaultMessage:"Choose a file from the list to view its documentation"})})]}):t.jsxs(y,{className:"flex-1 flex flex-col overflow-hidden",children:[t.jsx("div",{className:"p-4 border-b border-border",children:t.jsx("div",{className:"flex items-start justify-between gap-4",children:t.jsxs("div",{children:[t.jsxs("h2",{className:"text-lg font-semibold text-foreground flex items-center gap-2",children:[t.jsx(C,{className:"w-5 h-5 text-primary"}),t.jsx("span",{className:"font-mono text-sm",title:e==null?void 0:e.path,children:((g=e==null?void 0:e.path)==null?void 0:g.split("/").pop())||"Documentation"})]}),e&&t.jsxs("div",{className:"flex items-center gap-3 mt-1.5 text-xs text-muted-foreground",children:[e.generatedAt&&t.jsxs("span",{className:"flex items-center gap-1",children:[t.jsx(te,{className:"w-3 h-3"}),new Date(e.generatedAt).toLocaleString()]}),e.llmTool&&t.jsxs("span",{className:"flex items-center gap-1",children:[t.jsx(ge,{className:"w-3 h-3"}),e.llmTool]})]})]})})}),t.jsxs("div",{className:"flex-1 flex overflow-hidden",children:[t.jsxs("div",{className:"flex-1 overflow-y-auto p-6",children:[a.length>0&&t.jsx("div",{className:"mb-6 flex flex-wrap gap-2",children:a.map(c=>{const h=H(c.type);return t.jsxs("a",{href:`#${c.anchor.replace("#","")}`,className:j("inline-flex items-center gap-1.5 px-2 py-1 rounded-md text-xs font-medium","bg-muted/50 hover:bg-muted transition-colors",Y(c.type)),"aria-label":`${h.label}: ${c.name}`,children:[t.jsx("span",{"aria-hidden":"true",children:h.symbol}),t.jsx("span",{children:c.name}),t.jsx(T,{variant:"outline",className:"text-[10px] px-1",children:c.type})]},c.name)})}),t.jsxs("div",{className:"space-y-6",children:[f.map((c,h)=>t.jsx("section",{id:c.name.toLowerCase().replace(/\s+/g,"-"),className:"scroll-mt-4",children:t.jsx(_,{remarkPlugins:[Q],rehypePlugins:[G],components:J,children:c.content})},`${c.name}-${h}`)),f.length===0&&s&&t.jsx(_,{remarkPlugins:[Q],rehypePlugins:[G],components:J,children:s})]})]}),a.length>0&&t.jsxs("div",{className:"w-48 border-l border-border p-4 overflow-y-auto hidden lg:block",children:[t.jsxs("h4",{className:"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-3 flex items-center gap-2",children:[t.jsx(F,{className:"w-3 h-3"}),o({id:"deepwiki.viewer.toc",defaultMessage:"Symbols"})]}),t.jsx("nav",{className:"space-y-1",role:"list","aria-label":"Document symbols",children:a.map(c=>{const h=H(c.type);return t.jsxs("div",{className:"group flex items-center gap-1",children:[t.jsxs("a",{href:`#${c.anchor.replace("#","")}`,className:j("flex-1 text-xs py-1.5 px-2 rounded transition-colors","text-muted-foreground hover:text-foreground hover:bg-muted/50","font-mono"),role:"listitem","aria-label":`${h.label}: ${c.name}`,children:[t.jsx("span",{className:j("mr-1",Y(c.type)),"aria-hidden":"true",children:h.symbol}),c.name]}),t.jsx("button",{onClick:()=>d(c.name,c.anchor),className:j("opacity-0 group-hover:opacity-100 p-1 rounded transition-all","hover:bg-muted/50",m===c.name?"text-green-500":"text-muted-foreground hover:text-foreground"),"aria-label":m===c.name?o({id:"deepwiki.viewer.linkCopied",defaultMessage:"Link copied"}):o({id:"deepwiki.viewer.copyLink",defaultMessage:"Copy deep link to {name}"},{name:c.name}),children:m===c.name?t.jsx(be,{className:"w-3 h-3","aria-hidden":"true"}):t.jsx(ve,{className:"w-3 h-3","aria-hidden":"true"})})]},c.name)})})]})]})]})}function L({label:e,value:s,icon:a,color:n}){return t.jsx(y,{className:"p-4",children:t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx("div",{className:j("p-2 rounded-lg",n),children:t.jsx(a,{className:"w-5 h-5"})}),t.jsxs("div",{children:[t.jsx("p",{className:"text-2xl font-bold text-foreground",children:s}),t.jsx("p",{className:"text-xs text-muted-foreground",children:e})]})]})})}function Ze(){const{formatMessage:e}=$(),[s,a]=ye(),[n,r]=b.useState("documents"),[l,o]=b.useState(""),m=b.useRef(!1),p=s.get("file"),d=window.location.hash.slice(1),[f,g]=b.useState(p),{files:c,isLoading:h,isFetching:u,refetch:N}=Le(),{stats:i,isLoading:k,refetch:O}=De(),{doc:R,content:W,symbols:re,isLoading:E,error:le}=Te(f),{symbols:B,isLoading:ie}=qe(l,{enabled:n==="index"}),oe=b.useCallback(x=>{g(x),a({file:x}),m.current=!1},[a]);b.useEffect(()=>{d&&W&&!E&&!m.current&&(m.current=!0,setTimeout(()=>{const x=document.getElementById(d);x&&x.scrollIntoView({behavior:"smooth",block:"start"})},100))},[d,W,E]);const ce=()=>{N(),O()};return t.jsxs("div",{className:"h-full flex flex-col space-y-4",children:[t.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4",children:[t.jsxs("div",{children:[t.jsxs("h1",{className:"text-2xl font-bold text-foreground flex items-center gap-2",children:[t.jsx(U,{className:"w-6 h-6 text-primary"}),e({id:"deepwiki.title",defaultMessage:"DeepWiki"})]}),t.jsx("p",{className:"text-muted-foreground mt-1",children:e({id:"deepwiki.description",defaultMessage:"Code documentation with deep-linking to source symbols"})})]}),t.jsx("div",{className:"flex gap-2",children:t.jsxs(ee,{variant:"outline",onClick:ce,disabled:u,children:[t.jsx(A,{className:j("w-4 h-4 mr-2",u&&"animate-spin")}),e({id:"common.actions.refresh",defaultMessage:"Refresh"})]})})]}),t.jsx(Ne,{value:n,onValueChange:x=>r(x),tabs:[{value:"documents",label:e({id:"deepwiki.tabs.documents",defaultMessage:"Documents"})},{value:"index",label:e({id:"deepwiki.tabs.index",defaultMessage:"Symbol Index"})},{value:"stats",label:e({id:"deepwiki.tabs.stats",defaultMessage:"Statistics"})}]}),n==="documents"&&t.jsxs("div",{className:"flex-1 flex gap-4 min-h-0",children:[t.jsx("div",{className:"w-80 flex-shrink-0",children:t.jsx(Re,{files:c,selectedPath:f,onSelectFile:oe,isLoading:h,isFetching:u,onRefresh:()=>N()})}),t.jsx(Ke,{doc:R,content:W,symbols:re,isLoading:E,error:le,filePath:f??void 0})]}),n==="index"&&t.jsx("div",{className:"flex-1 overflow-y-auto",children:t.jsxs(y,{className:"p-4 h-full flex flex-col",children:[t.jsx("div",{className:"mb-4",children:t.jsx("input",{type:"text",placeholder:e({id:"deepwiki.index.search",defaultMessage:"Search symbols..."}),value:l,onChange:x=>o(x.target.value),className:"w-full px-4 py-2 rounded-md border border-input bg-background text-foreground focus:outline-none focus:ring-2 focus:ring-primary"})}),ie?t.jsx("div",{className:"flex-1 flex items-center justify-center",children:t.jsx(A,{className:"w-6 h-6 animate-spin text-muted-foreground"})}):B.length>0?t.jsx("div",{className:"flex-1 overflow-y-auto space-y-2",children:B.map(x=>t.jsxs("button",{onClick:()=>{g(x.sourceFile),r("documents")},className:"w-full p-3 rounded-md border border-border hover:bg-muted/50 transition-colors text-left",children:[t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(F,{className:"w-4 h-4 text-primary"}),t.jsx("span",{className:"font-medium text-foreground",children:x.name}),t.jsx(T,{variant:"outline",className:"text-xs",children:x.type})]}),t.jsxs("p",{className:"text-xs text-muted-foreground mt-1 font-mono truncate",children:[x.sourceFile,":",x.lineRange[0],"-",x.lineRange[1]]})]},`${x.name}-${x.sourceFile}`))}):l?t.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center text-center",children:[t.jsx(F,{className:"w-10 h-10 text-muted-foreground/30 mb-3"}),t.jsx("p",{className:"text-sm text-muted-foreground",children:e({id:"deepwiki.index.noResults",defaultMessage:"No symbols found"})})]}):t.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center text-center",children:[t.jsx(F,{className:"w-10 h-10 text-muted-foreground/30 mb-3"}),t.jsx("p",{className:"text-sm text-muted-foreground",children:e({id:"deepwiki.index.placeholder",defaultMessage:"Enter a search query to find symbols"})})]})]})}),n==="stats"&&t.jsx("div",{className:"flex-1 overflow-y-auto space-y-4",children:k?t.jsx(y,{className:"p-6",children:t.jsxs("div",{className:"space-y-4 animate-pulse",children:[t.jsx("div",{className:"h-20 bg-muted rounded"}),t.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[t.jsx("div",{className:"h-24 bg-muted rounded"}),t.jsx("div",{className:"h-24 bg-muted rounded"}),t.jsx("div",{className:"h-24 bg-muted rounded"}),t.jsx("div",{className:"h-24 bg-muted rounded"})]})]})}):t.jsxs(t.Fragment,{children:[t.jsx(y,{className:"p-4",children:t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx("div",{className:j("w-3 h-3 rounded-full",i!=null&&i.available?"bg-green-500":"bg-red-500")}),t.jsx("span",{className:"text-sm font-medium text-foreground",children:i!=null&&i.available?e({id:"deepwiki.stats.available",defaultMessage:"Database Connected"}):e({id:"deepwiki.stats.unavailable",defaultMessage:"Database Not Available"})})]}),(i==null?void 0:i.dbPath)&&t.jsx("code",{className:"text-xs text-muted-foreground bg-muted px-2 py-1 rounded",children:i.dbPath})]})}),t.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-4",children:[t.jsx(L,{label:e({id:"deepwiki.stats.files",defaultMessage:"Files"}),value:(i==null?void 0:i.files)??0,icon:C,color:"bg-blue-500/10 text-blue-500"}),t.jsx(L,{label:e({id:"deepwiki.stats.symbols",defaultMessage:"Symbols"}),value:(i==null?void 0:i.symbols)??0,icon:F,color:"bg-purple-500/10 text-purple-500"}),t.jsx(L,{label:e({id:"deepwiki.stats.docs",defaultMessage:"Documents"}),value:(i==null?void 0:i.docs)??0,icon:U,color:"bg-green-500/10 text-green-500"}),t.jsx(L,{label:e({id:"deepwiki.stats.needingDocs",defaultMessage:"Need Docs"}),value:(i==null?void 0:i.filesNeedingDocs)??0,icon:je,color:"bg-amber-500/10 text-amber-500"})]}),t.jsxs(y,{className:"p-4",children:[t.jsx("h3",{className:"text-sm font-medium text-foreground mb-2",children:e({id:"deepwiki.stats.howTo.title",defaultMessage:"Documentation Index"})}),t.jsx("p",{className:"text-sm text-muted-foreground",children:e({id:"deepwiki.stats.howTo.description",defaultMessage:"DeepWiki automatically indexes symbols and documentation from code. Currently in read-only mode."})})]})]})})]})}export{Ze as DeepWikiPage,Ze as default};
|
|
2
|
+
//# sourceMappingURL=DeepWikiPage-CvleOtJy.js.map
|