@ai-coders/context 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -146
- package/dist/fragments/compose.d.ts +30 -0
- package/dist/fragments/compose.d.ts.map +1 -0
- package/dist/fragments/compose.js +274 -0
- package/dist/fragments/compose.js.map +1 -0
- package/dist/fragments/extractors/index.d.ts +26 -0
- package/dist/fragments/extractors/index.d.ts.map +1 -0
- package/dist/fragments/extractors/index.js +58 -0
- package/dist/fragments/extractors/index.js.map +1 -0
- package/dist/fragments/extractors/module.d.ts +12 -0
- package/dist/fragments/extractors/module.d.ts.map +1 -0
- package/dist/fragments/extractors/module.js +302 -0
- package/dist/fragments/extractors/module.js.map +1 -0
- package/dist/fragments/extractors/project.d.ts +12 -0
- package/dist/fragments/extractors/project.d.ts.map +1 -0
- package/dist/fragments/extractors/project.js +274 -0
- package/dist/fragments/extractors/project.js.map +1 -0
- package/dist/fragments/extractors/semantic.d.ts +12 -0
- package/dist/fragments/extractors/semantic.d.ts.map +1 -0
- package/dist/fragments/extractors/semantic.js +329 -0
- package/dist/fragments/extractors/semantic.js.map +1 -0
- package/dist/fragments/index.d.ts +47 -0
- package/dist/fragments/index.d.ts.map +1 -0
- package/dist/fragments/index.js +75 -0
- package/dist/fragments/index.js.map +1 -0
- package/dist/fragments/query.d.ts +101 -0
- package/dist/fragments/query.d.ts.map +1 -0
- package/dist/fragments/query.js +200 -0
- package/dist/fragments/query.js.map +1 -0
- package/dist/fragments/render/compact.d.ts +15 -0
- package/dist/fragments/render/compact.d.ts.map +1 -0
- package/dist/fragments/render/compact.js +209 -0
- package/dist/fragments/render/compact.js.map +1 -0
- package/dist/fragments/render/index.d.ts +17 -0
- package/dist/fragments/render/index.d.ts.map +1 -0
- package/dist/fragments/render/index.js +40 -0
- package/dist/fragments/render/index.js.map +1 -0
- package/dist/fragments/render/json.d.ts +9 -0
- package/dist/fragments/render/json.d.ts.map +1 -0
- package/dist/fragments/render/json.js +44 -0
- package/dist/fragments/render/json.js.map +1 -0
- package/dist/fragments/render/markdown.d.ts +9 -0
- package/dist/fragments/render/markdown.d.ts.map +1 -0
- package/dist/fragments/render/markdown.js +291 -0
- package/dist/fragments/render/markdown.js.map +1 -0
- package/dist/fragments/store.d.ts +49 -0
- package/dist/fragments/store.d.ts.map +1 -0
- package/dist/fragments/store.js +161 -0
- package/dist/fragments/store.js.map +1 -0
- package/dist/fragments/types.d.ts +241 -0
- package/dist/fragments/types.d.ts.map +1 -0
- package/dist/fragments/types.js +8 -0
- package/dist/fragments/types.js.map +1 -0
- package/dist/generators/agents/agentGenerator.d.ts +8 -1
- package/dist/generators/agents/agentGenerator.d.ts.map +1 -1
- package/dist/generators/agents/agentGenerator.js +108 -10
- package/dist/generators/agents/agentGenerator.js.map +1 -1
- package/dist/generators/agents/templates/playbookTemplate.d.ts +3 -2
- package/dist/generators/agents/templates/playbookTemplate.d.ts.map +1 -1
- package/dist/generators/agents/templates/playbookTemplate.js +147 -45
- package/dist/generators/agents/templates/playbookTemplate.js.map +1 -1
- package/dist/generators/agents/templates/types.d.ts +9 -1
- package/dist/generators/agents/templates/types.d.ts.map +1 -1
- package/dist/generators/documentation/documentationGenerator.d.ts +2 -0
- package/dist/generators/documentation/documentationGenerator.d.ts.map +1 -1
- package/dist/generators/documentation/documentationGenerator.js +18 -3
- package/dist/generators/documentation/documentationGenerator.js.map +1 -1
- package/dist/generators/documentation/guideRegistry.d.ts.map +1 -1
- package/dist/generators/documentation/guideRegistry.js +0 -8
- package/dist/generators/documentation/guideRegistry.js.map +1 -1
- package/dist/generators/documentation/templates/apiReferenceTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/apiReferenceTemplate.js +3 -22
- package/dist/generators/documentation/templates/apiReferenceTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/architectureTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/architectureTemplate.js +174 -36
- package/dist/generators/documentation/templates/architectureTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/common.d.ts +33 -1
- package/dist/generators/documentation/templates/common.d.ts.map +1 -1
- package/dist/generators/documentation/templates/common.js +144 -10
- package/dist/generators/documentation/templates/common.js.map +1 -1
- package/dist/generators/documentation/templates/dataFlowTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/dataFlowTemplate.js +106 -22
- package/dist/generators/documentation/templates/dataFlowTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/developmentWorkflowTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/developmentWorkflowTemplate.js +4 -19
- package/dist/generators/documentation/templates/developmentWorkflowTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/glossaryTemplate.d.ts +1 -1
- package/dist/generators/documentation/templates/glossaryTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/glossaryTemplate.js +57 -25
- package/dist/generators/documentation/templates/glossaryTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/indexTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/indexTemplate.js +1 -18
- package/dist/generators/documentation/templates/indexTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/migrationTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/migrationTemplate.js +3 -23
- package/dist/generators/documentation/templates/migrationTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/onboardingTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/onboardingTemplate.js +3 -23
- package/dist/generators/documentation/templates/onboardingTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/projectOverviewTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/projectOverviewTemplate.js +94 -28
- package/dist/generators/documentation/templates/projectOverviewTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/securityTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/securityTemplate.js +11 -22
- package/dist/generators/documentation/templates/securityTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/testingTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/testingTemplate.js +4 -19
- package/dist/generators/documentation/templates/testingTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/toolingTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/toolingTemplate.js +11 -25
- package/dist/generators/documentation/templates/toolingTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/troubleshootingTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/troubleshootingTemplate.js +3 -23
- package/dist/generators/documentation/templates/troubleshootingTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/types.d.ts +2 -1
- package/dist/generators/documentation/templates/types.d.ts.map +1 -1
- package/dist/generators/plans/planGenerator.d.ts +4 -0
- package/dist/generators/plans/planGenerator.d.ts.map +1 -1
- package/dist/generators/plans/planGenerator.js +30 -2
- package/dist/generators/plans/planGenerator.js.map +1 -1
- package/dist/generators/plans/templates/indexTemplate.d.ts.map +1 -1
- package/dist/generators/plans/templates/indexTemplate.js +3 -12
- package/dist/generators/plans/templates/indexTemplate.js.map +1 -1
- package/dist/generators/plans/templates/planTemplate.d.ts.map +1 -1
- package/dist/generators/plans/templates/planTemplate.js +57 -33
- package/dist/generators/plans/templates/planTemplate.js.map +1 -1
- package/dist/generators/plans/templates/types.d.ts +10 -0
- package/dist/generators/plans/templates/types.d.ts.map +1 -1
- package/dist/generators/shared/generatorUtils.d.ts.map +1 -1
- package/dist/generators/shared/generatorUtils.js +6 -9
- package/dist/generators/shared/generatorUtils.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +646 -114
- package/dist/index.js.map +1 -1
- package/dist/prompts/defaults.d.ts +2 -2
- package/dist/prompts/defaults.d.ts.map +1 -1
- package/dist/prompts/defaults.js +26 -56
- package/dist/prompts/defaults.js.map +1 -1
- package/dist/services/ai/agentEvents.d.ts +45 -0
- package/dist/services/ai/agentEvents.d.ts.map +1 -0
- package/dist/services/ai/agentEvents.js +61 -0
- package/dist/services/ai/agentEvents.js.map +1 -0
- package/dist/services/ai/agents/documentationAgent.d.ts +53 -0
- package/dist/services/ai/agents/documentationAgent.d.ts.map +1 -0
- package/dist/services/ai/agents/documentationAgent.js +217 -0
- package/dist/services/ai/agents/documentationAgent.js.map +1 -0
- package/dist/services/ai/agents/index.d.ts +7 -0
- package/dist/services/ai/agents/index.d.ts.map +1 -0
- package/dist/services/ai/agents/index.js +10 -0
- package/dist/services/ai/agents/index.js.map +1 -0
- package/dist/services/ai/agents/planAgent.d.ts +68 -0
- package/dist/services/ai/agents/planAgent.d.ts.map +1 -0
- package/dist/services/ai/agents/planAgent.js +342 -0
- package/dist/services/ai/agents/planAgent.js.map +1 -0
- package/dist/services/ai/agents/playbookAgent.d.ts +54 -0
- package/dist/services/ai/agents/playbookAgent.d.ts.map +1 -0
- package/dist/services/ai/agents/playbookAgent.js +244 -0
- package/dist/services/ai/agents/playbookAgent.js.map +1 -0
- package/dist/services/ai/aiSdkClient.d.ts +67 -0
- package/dist/services/ai/aiSdkClient.d.ts.map +1 -0
- package/dist/services/ai/aiSdkClient.js +143 -0
- package/dist/services/ai/aiSdkClient.js.map +1 -0
- package/dist/services/ai/index.d.ts +7 -0
- package/dist/services/ai/index.d.ts.map +1 -0
- package/dist/services/ai/index.js +49 -0
- package/dist/services/ai/index.js.map +1 -0
- package/dist/services/ai/prompts/index.d.ts +2 -0
- package/dist/services/ai/prompts/index.d.ts.map +1 -0
- package/dist/services/ai/prompts/index.js +12 -0
- package/dist/services/ai/prompts/index.js.map +1 -0
- package/dist/services/ai/prompts/sharedPrompts.d.ts +33 -0
- package/dist/services/ai/prompts/sharedPrompts.d.ts.map +1 -0
- package/dist/services/ai/prompts/sharedPrompts.js +136 -0
- package/dist/services/ai/prompts/sharedPrompts.js.map +1 -0
- package/dist/services/ai/providerFactory.d.ts +35 -0
- package/dist/services/ai/providerFactory.d.ts.map +1 -0
- package/dist/services/ai/providerFactory.js +107 -0
- package/dist/services/ai/providerFactory.js.map +1 -0
- package/dist/services/ai/schemas.d.ts +331 -0
- package/dist/services/ai/schemas.d.ts.map +1 -0
- package/dist/services/ai/schemas.js +236 -0
- package/dist/services/ai/schemas.js.map +1 -0
- package/dist/services/ai/toolRegistry.d.ts +27 -0
- package/dist/services/ai/toolRegistry.d.ts.map +1 -0
- package/dist/services/ai/toolRegistry.js +126 -0
- package/dist/services/ai/toolRegistry.js.map +1 -0
- package/dist/services/ai/tools/analyzeSymbolsTool.d.ts +33 -0
- package/dist/services/ai/tools/analyzeSymbolsTool.d.ts.map +1 -0
- package/dist/services/ai/tools/analyzeSymbolsTool.js +57 -0
- package/dist/services/ai/tools/analyzeSymbolsTool.js.map +1 -0
- package/dist/services/ai/tools/checkScaffoldingTool.d.ts +18 -0
- package/dist/services/ai/tools/checkScaffoldingTool.d.ts.map +1 -0
- package/dist/services/ai/tools/checkScaffoldingTool.js +86 -0
- package/dist/services/ai/tools/checkScaffoldingTool.js.map +1 -0
- package/dist/services/ai/tools/fillScaffoldingTool.d.ts +108 -0
- package/dist/services/ai/tools/fillScaffoldingTool.d.ts.map +1 -0
- package/dist/services/ai/tools/fillScaffoldingTool.js +463 -0
- package/dist/services/ai/tools/fillScaffoldingTool.js.map +1 -0
- package/dist/services/ai/tools/getFileStructureTool.d.ts +29 -0
- package/dist/services/ai/tools/getFileStructureTool.d.ts.map +1 -0
- package/dist/services/ai/tools/getFileStructureTool.js +48 -0
- package/dist/services/ai/tools/getFileStructureTool.js.map +1 -0
- package/dist/services/ai/tools/index.d.ts +20 -0
- package/dist/services/ai/tools/index.d.ts.map +1 -0
- package/dist/services/ai/tools/index.js +68 -0
- package/dist/services/ai/tools/index.js.map +1 -0
- package/dist/services/ai/tools/initializeContextTool.d.ts +25 -0
- package/dist/services/ai/tools/initializeContextTool.d.ts.map +1 -0
- package/dist/services/ai/tools/initializeContextTool.js +121 -0
- package/dist/services/ai/tools/initializeContextTool.js.map +1 -0
- package/dist/services/ai/tools/listFilesTool.d.ts +18 -0
- package/dist/services/ai/tools/listFilesTool.d.ts.map +1 -0
- package/dist/services/ai/tools/listFilesTool.js +34 -0
- package/dist/services/ai/tools/listFilesTool.js.map +1 -0
- package/dist/services/ai/tools/readFileTool.d.ts +17 -0
- package/dist/services/ai/tools/readFileTool.d.ts.map +1 -0
- package/dist/services/ai/tools/readFileTool.js +63 -0
- package/dist/services/ai/tools/readFileTool.js.map +1 -0
- package/dist/services/ai/tools/scaffoldPlanTool.d.ts +19 -0
- package/dist/services/ai/tools/scaffoldPlanTool.d.ts.map +1 -0
- package/dist/services/ai/tools/scaffoldPlanTool.js +81 -0
- package/dist/services/ai/tools/scaffoldPlanTool.js.map +1 -0
- package/dist/services/ai/tools/searchCodeTool.d.ts +25 -0
- package/dist/services/ai/tools/searchCodeTool.d.ts.map +1 -0
- package/dist/services/ai/tools/searchCodeTool.js +96 -0
- package/dist/services/ai/tools/searchCodeTool.js.map +1 -0
- package/dist/services/fill/fillService.d.ts +11 -1
- package/dist/services/fill/fillService.d.ts.map +1 -1
- package/dist/services/fill/fillService.js +157 -40
- package/dist/services/fill/fillService.js.map +1 -1
- package/dist/services/init/initService.d.ts +1 -0
- package/dist/services/init/initService.d.ts.map +1 -1
- package/dist/services/init/initService.js +12 -7
- package/dist/services/init/initService.js.map +1 -1
- package/dist/services/llmClientFactory.d.ts +36 -2
- package/dist/services/llmClientFactory.d.ts.map +1 -1
- package/dist/services/llmClientFactory.js +57 -11
- package/dist/services/llmClientFactory.js.map +1 -1
- package/dist/services/mcp/index.d.ts +2 -0
- package/dist/services/mcp/index.d.ts.map +1 -0
- package/dist/services/mcp/index.js +7 -0
- package/dist/services/mcp/index.js.map +1 -0
- package/dist/services/mcp/mcpServer.d.ts +45 -0
- package/dist/services/mcp/mcpServer.d.ts.map +1 -0
- package/dist/services/mcp/mcpServer.js +411 -0
- package/dist/services/mcp/mcpServer.js.map +1 -0
- package/dist/services/openRouterClient.js +1 -1
- package/dist/services/openRouterClient.js.map +1 -1
- package/dist/services/passthrough/commandRouter.d.ts +53 -0
- package/dist/services/passthrough/commandRouter.d.ts.map +1 -0
- package/dist/services/passthrough/commandRouter.js +349 -0
- package/dist/services/passthrough/commandRouter.js.map +1 -0
- package/dist/services/passthrough/index.d.ts +7 -0
- package/dist/services/passthrough/index.d.ts.map +1 -0
- package/dist/services/passthrough/index.js +23 -0
- package/dist/services/passthrough/index.js.map +1 -0
- package/dist/services/passthrough/protocol.d.ts +269 -0
- package/dist/services/passthrough/protocol.d.ts.map +1 -0
- package/dist/services/passthrough/protocol.js +151 -0
- package/dist/services/passthrough/protocol.js.map +1 -0
- package/dist/services/passthrough/stdinReader.d.ts +42 -0
- package/dist/services/passthrough/stdinReader.d.ts.map +1 -0
- package/dist/services/passthrough/stdinReader.js +111 -0
- package/dist/services/passthrough/stdinReader.js.map +1 -0
- package/dist/services/plan/planService.d.ts +3 -1
- package/dist/services/plan/planService.d.ts.map +1 -1
- package/dist/services/plan/planService.js +49 -41
- package/dist/services/plan/planService.js.map +1 -1
- package/dist/services/semantic/codebaseAnalyzer.d.ts +40 -0
- package/dist/services/semantic/codebaseAnalyzer.d.ts.map +1 -0
- package/dist/services/semantic/codebaseAnalyzer.js +540 -0
- package/dist/services/semantic/codebaseAnalyzer.js.map +1 -0
- package/dist/services/semantic/contextBuilder.d.ts +79 -0
- package/dist/services/semantic/contextBuilder.d.ts.map +1 -0
- package/dist/services/semantic/contextBuilder.js +538 -0
- package/dist/services/semantic/contextBuilder.js.map +1 -0
- package/dist/services/semantic/index.d.ts +12 -0
- package/dist/services/semantic/index.d.ts.map +1 -0
- package/dist/services/semantic/index.js +33 -0
- package/dist/services/semantic/index.js.map +1 -0
- package/dist/services/semantic/lsp/index.d.ts +2 -0
- package/dist/services/semantic/lsp/index.d.ts.map +1 -0
- package/dist/services/semantic/lsp/index.js +6 -0
- package/dist/services/semantic/lsp/index.js.map +1 -0
- package/dist/services/semantic/lsp/lspLayer.d.ts +32 -0
- package/dist/services/semantic/lsp/lspLayer.d.ts.map +1 -0
- package/dist/services/semantic/lsp/lspLayer.js +378 -0
- package/dist/services/semantic/lsp/lspLayer.js.map +1 -0
- package/dist/services/semantic/treeSitter/index.d.ts +2 -0
- package/dist/services/semantic/treeSitter/index.d.ts.map +1 -0
- package/dist/services/semantic/treeSitter/index.js +6 -0
- package/dist/services/semantic/treeSitter/index.js.map +1 -0
- package/dist/services/semantic/treeSitter/treeSitterLayer.d.ts +37 -0
- package/dist/services/semantic/treeSitter/treeSitterLayer.d.ts.map +1 -0
- package/dist/services/semantic/treeSitter/treeSitterLayer.js +518 -0
- package/dist/services/semantic/treeSitter/treeSitterLayer.js.map +1 -0
- package/dist/services/semantic/types.d.ts +122 -0
- package/dist/services/semantic/types.d.ts.map +1 -0
- package/dist/services/semantic/types.js +31 -0
- package/dist/services/semantic/types.js.map +1 -0
- package/dist/services/serve/index.d.ts +2 -0
- package/dist/services/serve/index.d.ts.map +1 -0
- package/dist/services/serve/index.js +6 -0
- package/dist/services/serve/index.js.map +1 -0
- package/dist/services/serve/serveService.d.ts +38 -0
- package/dist/services/serve/serveService.d.ts.map +1 -0
- package/dist/services/serve/serveService.js +99 -0
- package/dist/services/serve/serveService.js.map +1 -0
- package/dist/services/shared/llmConfig.d.ts +19 -3
- package/dist/services/shared/llmConfig.d.ts.map +1 -1
- package/dist/services/shared/llmConfig.js +39 -10
- package/dist/services/shared/llmConfig.js.map +1 -1
- package/dist/services/state/index.d.ts +2 -0
- package/dist/services/state/index.d.ts.map +1 -0
- package/dist/services/state/index.js +6 -0
- package/dist/services/state/index.js.map +1 -0
- package/dist/services/state/stateDetector.d.ts +53 -0
- package/dist/services/state/stateDetector.d.ts.map +1 -0
- package/dist/services/state/stateDetector.js +189 -0
- package/dist/services/state/stateDetector.js.map +1 -0
- package/dist/services/sync/index.d.ts +6 -0
- package/dist/services/sync/index.d.ts.map +1 -0
- package/dist/services/sync/index.js +16 -0
- package/dist/services/sync/index.js.map +1 -0
- package/dist/services/sync/markdownReferenceHandler.d.ts +3 -0
- package/dist/services/sync/markdownReferenceHandler.d.ts.map +1 -0
- package/dist/services/sync/markdownReferenceHandler.js +133 -0
- package/dist/services/sync/markdownReferenceHandler.js.map +1 -0
- package/dist/services/sync/presets.d.ts +6 -0
- package/dist/services/sync/presets.d.ts.map +1 -0
- package/dist/services/sync/presets.js +49 -0
- package/dist/services/sync/presets.js.map +1 -0
- package/dist/services/sync/symlinkHandler.d.ts +7 -0
- package/dist/services/sync/symlinkHandler.d.ts.map +1 -0
- package/dist/services/sync/symlinkHandler.js +129 -0
- package/dist/services/sync/symlinkHandler.js.map +1 -0
- package/dist/services/sync/syncService.d.ts +15 -0
- package/dist/services/sync/syncService.d.ts.map +1 -0
- package/dist/services/sync/syncService.js +222 -0
- package/dist/services/sync/syncService.js.map +1 -0
- package/dist/services/sync/types.d.ts +62 -0
- package/dist/services/sync/types.d.ts.map +1 -0
- package/dist/services/sync/types.js +3 -0
- package/dist/services/sync/types.js.map +1 -0
- package/dist/services/update/index.d.ts +2 -0
- package/dist/services/update/index.d.ts.map +1 -0
- package/dist/services/update/index.js +6 -0
- package/dist/services/update/index.js.map +1 -0
- package/dist/services/update/updateService.d.ts +64 -0
- package/dist/services/update/updateService.d.ts.map +1 -0
- package/dist/services/update/updateService.js +295 -0
- package/dist/services/update/updateService.js.map +1 -0
- package/dist/types.d.ts +2 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/cliUI.d.ts +33 -0
- package/dist/utils/cliUI.d.ts.map +1 -1
- package/dist/utils/cliUI.js +157 -107
- package/dist/utils/cliUI.js.map +1 -1
- package/dist/utils/contentSanitizer.d.ts +42 -0
- package/dist/utils/contentSanitizer.d.ts.map +1 -0
- package/dist/utils/contentSanitizer.js +238 -0
- package/dist/utils/contentSanitizer.js.map +1 -0
- package/dist/utils/frontMatter.d.ts +55 -0
- package/dist/utils/frontMatter.d.ts.map +1 -0
- package/dist/utils/frontMatter.js +173 -0
- package/dist/utils/frontMatter.js.map +1 -0
- package/dist/utils/gitService.d.ts.map +1 -1
- package/dist/utils/gitService.js +12 -14
- package/dist/utils/gitService.js.map +1 -1
- package/dist/utils/i18n.d.ts +101 -13
- package/dist/utils/i18n.d.ts.map +1 -1
- package/dist/utils/i18n.js +204 -28
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/prompts/configSummary.d.ts +7 -0
- package/dist/utils/prompts/configSummary.d.ts.map +1 -0
- package/dist/utils/prompts/configSummary.js +63 -0
- package/dist/utils/prompts/configSummary.js.map +1 -0
- package/dist/utils/prompts/index.d.ts +22 -0
- package/dist/utils/prompts/index.d.ts.map +1 -0
- package/dist/utils/prompts/index.js +122 -0
- package/dist/utils/prompts/index.js.map +1 -0
- package/dist/utils/prompts/llmPrompts.d.ts +11 -0
- package/dist/utils/prompts/llmPrompts.d.ts.map +1 -0
- package/dist/utils/prompts/llmPrompts.js +96 -0
- package/dist/utils/prompts/llmPrompts.js.map +1 -0
- package/dist/utils/prompts/smartDefaults.d.ts +15 -0
- package/dist/utils/prompts/smartDefaults.d.ts.map +1 -0
- package/dist/utils/prompts/smartDefaults.js +105 -0
- package/dist/utils/prompts/smartDefaults.js.map +1 -0
- package/dist/utils/prompts/types.d.ts +38 -0
- package/dist/utils/prompts/types.d.ts.map +1 -0
- package/dist/utils/prompts/types.js +3 -0
- package/dist/utils/prompts/types.js.map +1 -0
- package/dist/utils/theme.d.ts +66 -0
- package/dist/utils/theme.d.ts.map +1 -0
- package/dist/utils/theme.js +93 -0
- package/dist/utils/theme.js.map +1 -0
- package/dist/version.d.ts +8 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +15 -0
- package/dist/version.js.map +1 -0
- package/package.json +12 -2
- package/prompts/update_scaffold_prompt.md +14 -34
- package/dist/commands/shared/agents.d.ts +0 -2
- package/dist/commands/shared/agents.d.ts.map +0 -1
- package/dist/commands/shared/agents.js +0 -15
- package/dist/commands/shared/agents.js.map +0 -1
- package/dist/commands/shared/selection.d.ts +0 -12
- package/dist/commands/shared/selection.d.ts.map +0 -1
- package/dist/commands/shared/selection.js +0 -95
- package/dist/commands/shared/selection.js.map +0 -1
- package/dist/generators/documentation/templates/frontMatter.d.ts +0 -11
- package/dist/generators/documentation/templates/frontMatter.d.ts.map +0 -1
- package/dist/generators/documentation/templates/frontMatter.js +0 -29
- package/dist/generators/documentation/templates/frontMatter.js.map +0 -1
- package/dist/services/anthropicClient.d.ts +0 -12
- package/dist/services/anthropicClient.d.ts.map +0 -1
- package/dist/services/anthropicClient.js +0 -98
- package/dist/services/anthropicClient.js.map +0 -1
- package/dist/services/geminiClient.d.ts +0 -12
- package/dist/services/geminiClient.d.ts.map +0 -1
- package/dist/services/geminiClient.js +0 -96
- package/dist/services/geminiClient.js.map +0 -1
- package/dist/services/grokClient.d.ts +0 -12
- package/dist/services/grokClient.d.ts.map +0 -1
- package/dist/services/grokClient.js +0 -101
- package/dist/services/grokClient.js.map +0 -1
- package/dist/services/openaiClient.d.ts +0 -12
- package/dist/services/openaiClient.d.ts.map +0 -1
- package/dist/services/openaiClient.js +0 -98
- package/dist/services/openaiClient.js.map +0 -1
- package/dist/utils/pricing.d.ts +0 -14
- package/dist/utils/pricing.d.ts.map +0 -1
- package/dist/utils/pricing.js +0 -115
- package/dist/utils/pricing.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -47,8 +47,8 @@ exports.runLlmFill = runLlmFill;
|
|
|
47
47
|
const commander_1 = require("commander");
|
|
48
48
|
const path = __importStar(require("path"));
|
|
49
49
|
const dotenv = __importStar(require("dotenv"));
|
|
50
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
51
50
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
51
|
+
const theme_1 = require("./utils/theme");
|
|
52
52
|
const planGenerator_1 = require("./generators/plans/planGenerator");
|
|
53
53
|
const cliUI_1 = require("./utils/cliUI");
|
|
54
54
|
const versionChecker_1 = require("./utils/versionChecker");
|
|
@@ -56,6 +56,13 @@ const i18n_1 = require("./utils/i18n");
|
|
|
56
56
|
const initService_1 = require("./services/init/initService");
|
|
57
57
|
const fillService_1 = require("./services/fill/fillService");
|
|
58
58
|
const planService_1 = require("./services/plan/planService");
|
|
59
|
+
const syncService_1 = require("./services/sync/syncService");
|
|
60
|
+
const serve_1 = require("./services/serve");
|
|
61
|
+
const mcp_1 = require("./services/mcp");
|
|
62
|
+
const state_1 = require("./services/state");
|
|
63
|
+
const update_1 = require("./services/update");
|
|
64
|
+
const prompts_1 = require("./utils/prompts");
|
|
65
|
+
const version_1 = require("./version");
|
|
59
66
|
dotenv.config();
|
|
60
67
|
const initialLocale = (0, i18n_1.detectLocale)(process.argv.slice(2), process.env.AI_CONTEXT_LANG);
|
|
61
68
|
let currentLocale = initialLocale;
|
|
@@ -67,37 +74,44 @@ const localeLabelKeys = {
|
|
|
67
74
|
};
|
|
68
75
|
const program = new commander_1.Command();
|
|
69
76
|
const ui = new cliUI_1.CLIInterface(t);
|
|
70
|
-
const
|
|
71
|
-
const PACKAGE_NAME = '@ai-coders/context';
|
|
72
|
-
const DEFAULT_MODEL = 'x-ai/grok-4-fast';
|
|
77
|
+
const DEFAULT_MODEL = 'gemini-3-flash-preview';
|
|
73
78
|
const initService = new initService_1.InitService({
|
|
74
79
|
ui,
|
|
75
80
|
t,
|
|
76
|
-
version: VERSION
|
|
81
|
+
version: version_1.VERSION
|
|
77
82
|
});
|
|
78
83
|
const fillService = new fillService_1.FillService({
|
|
79
84
|
ui,
|
|
80
85
|
t,
|
|
81
|
-
version: VERSION,
|
|
86
|
+
version: version_1.VERSION,
|
|
82
87
|
defaultModel: DEFAULT_MODEL
|
|
83
88
|
});
|
|
84
89
|
const planService = new planService_1.PlanService({
|
|
85
90
|
ui,
|
|
86
91
|
t,
|
|
87
|
-
version: VERSION,
|
|
92
|
+
version: version_1.VERSION,
|
|
88
93
|
defaultModel: DEFAULT_MODEL
|
|
89
94
|
});
|
|
95
|
+
const syncService = new syncService_1.SyncService({
|
|
96
|
+
ui,
|
|
97
|
+
t,
|
|
98
|
+
version: version_1.VERSION
|
|
99
|
+
});
|
|
100
|
+
const updateService = new update_1.UpdateService({
|
|
101
|
+
ui,
|
|
102
|
+
t
|
|
103
|
+
});
|
|
90
104
|
program
|
|
91
105
|
.name('ai-context')
|
|
92
106
|
.description(t('cli.description'))
|
|
93
|
-
.version(VERSION);
|
|
107
|
+
.version(version_1.VERSION);
|
|
94
108
|
program.option('-l, --lang <locale>', t('global.options.lang'), initialLocale);
|
|
95
109
|
let versionCheckPromise = null;
|
|
96
110
|
function scheduleVersionCheck(force = false) {
|
|
97
111
|
if (!versionCheckPromise || force) {
|
|
98
112
|
versionCheckPromise = (0, versionChecker_1.checkForUpdates)({
|
|
99
|
-
packageName: PACKAGE_NAME,
|
|
100
|
-
currentVersion: VERSION,
|
|
113
|
+
packageName: version_1.PACKAGE_NAME,
|
|
114
|
+
currentVersion: version_1.VERSION,
|
|
101
115
|
ui,
|
|
102
116
|
t,
|
|
103
117
|
force
|
|
@@ -117,6 +131,7 @@ program
|
|
|
117
131
|
.option('--exclude <patterns...>', t('commands.init.options.exclude'))
|
|
118
132
|
.option('--include <patterns...>', t('commands.init.options.include'))
|
|
119
133
|
.option('-v, --verbose', t('commands.init.options.verbose'))
|
|
134
|
+
.option('--no-semantic', t('commands.init.options.noSemantic'))
|
|
120
135
|
.action(async (repoPath, type, options) => {
|
|
121
136
|
try {
|
|
122
137
|
await initService.run(repoPath, type, options);
|
|
@@ -140,6 +155,9 @@ program
|
|
|
140
155
|
.option('--exclude <patterns...>', t('commands.fill.options.exclude'))
|
|
141
156
|
.option('--include <patterns...>', t('commands.fill.options.include'))
|
|
142
157
|
.option('-v, --verbose', t('commands.fill.options.verbose'))
|
|
158
|
+
.option('--no-semantic', t('commands.fill.options.noSemantic'))
|
|
159
|
+
.option('--languages <langs>', t('commands.fill.options.languages'))
|
|
160
|
+
.option('--use-lsp', t('commands.fill.options.useLsp'))
|
|
143
161
|
.action(async (repoPath, options) => {
|
|
144
162
|
try {
|
|
145
163
|
await fillService.run(repoPath, options);
|
|
@@ -149,6 +167,64 @@ program
|
|
|
149
167
|
process.exit(1);
|
|
150
168
|
}
|
|
151
169
|
});
|
|
170
|
+
program
|
|
171
|
+
.command('update')
|
|
172
|
+
.description('Analyze code changes and update affected documentation')
|
|
173
|
+
.argument('[repo-path]', 'Repository path to analyze', '.')
|
|
174
|
+
.option('-o, --output <dir>', 'Output directory', './.context')
|
|
175
|
+
.option('--days <number>', 'Days to look back for changes', (v) => parseInt(v, 10), 30)
|
|
176
|
+
.option('--dry-run', 'Show what would be updated without making changes')
|
|
177
|
+
.option('--no-git', 'Use mtime instead of git for change detection')
|
|
178
|
+
.option('-k, --api-key <key>', 'API key for LLM provider')
|
|
179
|
+
.option('-m, --model <model>', 'Model to use', DEFAULT_MODEL)
|
|
180
|
+
.option('-p, --provider <provider>', 'LLM provider')
|
|
181
|
+
.option('--base-url <url>', 'Custom base URL for API')
|
|
182
|
+
.option('-v, --verbose', 'Verbose output')
|
|
183
|
+
.action(async (repoPath, options) => {
|
|
184
|
+
try {
|
|
185
|
+
const outputDir = path.resolve(options.output || './.context');
|
|
186
|
+
const analysis = await updateService.analyze(repoPath, {
|
|
187
|
+
output: options.output,
|
|
188
|
+
days: options.days,
|
|
189
|
+
useGit: options.git !== false,
|
|
190
|
+
verbose: options.verbose
|
|
191
|
+
});
|
|
192
|
+
updateService.displayAnalysis(analysis);
|
|
193
|
+
if (options.dryRun) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const filesToUpdate = updateService.getFilesToUpdate(analysis);
|
|
197
|
+
if (filesToUpdate.length === 0) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const { proceed } = await inquirer_1.default.prompt([{
|
|
201
|
+
type: 'confirm',
|
|
202
|
+
name: 'proceed',
|
|
203
|
+
message: `Update ${filesToUpdate.length} document(s)?`,
|
|
204
|
+
default: true
|
|
205
|
+
}]);
|
|
206
|
+
if (!proceed) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
// Run fill on affected docs
|
|
210
|
+
// Convert absolute paths to relative paths from the output directory
|
|
211
|
+
await fillService.run(repoPath, {
|
|
212
|
+
output: options.output,
|
|
213
|
+
include: filesToUpdate.map(f => path.relative(outputDir, f)),
|
|
214
|
+
model: options.model,
|
|
215
|
+
provider: options.provider,
|
|
216
|
+
apiKey: options.apiKey,
|
|
217
|
+
baseUrl: options.baseUrl,
|
|
218
|
+
verbose: options.verbose,
|
|
219
|
+
semantic: true
|
|
220
|
+
});
|
|
221
|
+
ui.displaySuccess('Documentation updated!');
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
ui.displayError('Failed to update documentation', error);
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
152
228
|
program
|
|
153
229
|
.command('plan')
|
|
154
230
|
.description(t('commands.plan.description'))
|
|
@@ -168,6 +244,8 @@ program
|
|
|
168
244
|
.option('--include <patterns...>', t('commands.plan.options.include'))
|
|
169
245
|
.option('--exclude <patterns...>', t('commands.plan.options.exclude'))
|
|
170
246
|
.option('-v, --verbose', t('commands.plan.options.verbose'))
|
|
247
|
+
.option('--no-semantic', t('commands.plan.options.noSemantic'))
|
|
248
|
+
.option('--no-lsp', t('commands.plan.options.noLsp'))
|
|
171
249
|
.action(async (planName, rawOptions) => {
|
|
172
250
|
const outputDir = path.resolve(rawOptions.output || './.context');
|
|
173
251
|
if (rawOptions.fill) {
|
|
@@ -195,10 +273,12 @@ program
|
|
|
195
273
|
title: rawOptions.title,
|
|
196
274
|
summary: rawOptions.summary,
|
|
197
275
|
force: Boolean(rawOptions.force),
|
|
198
|
-
verbose: Boolean(rawOptions.verbose)
|
|
276
|
+
verbose: Boolean(rawOptions.verbose),
|
|
277
|
+
semantic: rawOptions.semantic !== false,
|
|
278
|
+
projectPath: rawOptions.repo ? path.resolve(rawOptions.repo) : path.resolve(rawOptions.output || './.context', '..')
|
|
199
279
|
});
|
|
200
280
|
ui.updateSpinner(t('spinner.plan.created'), 'success');
|
|
201
|
-
ui.displaySuccess(t('success.plan.createdAt', { path:
|
|
281
|
+
ui.displaySuccess(t('success.plan.createdAt', { path: theme_1.colors.accent(result.relativePath) }));
|
|
202
282
|
}
|
|
203
283
|
catch (error) {
|
|
204
284
|
ui.updateSpinner(t('spinner.plan.creationFailed'), 'fail');
|
|
@@ -209,6 +289,75 @@ program
|
|
|
209
289
|
ui.stopSpinner();
|
|
210
290
|
}
|
|
211
291
|
});
|
|
292
|
+
program
|
|
293
|
+
.command('sync-agents')
|
|
294
|
+
.description(t('commands.sync.description'))
|
|
295
|
+
.option('-s, --source <dir>', t('commands.sync.options.source'), './.context/agents')
|
|
296
|
+
.option('-t, --target <paths...>', t('commands.sync.options.target'))
|
|
297
|
+
.option('-m, --mode <type>', t('commands.sync.options.mode'), 'symlink')
|
|
298
|
+
.option('-p, --preset <name>', t('commands.sync.options.preset'))
|
|
299
|
+
.option('--force', t('commands.sync.options.force'))
|
|
300
|
+
.option('--dry-run', t('commands.sync.options.dryRun'))
|
|
301
|
+
.option('-v, --verbose', t('commands.sync.options.verbose'))
|
|
302
|
+
.action(async (options) => {
|
|
303
|
+
try {
|
|
304
|
+
await syncService.run(options);
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
ui.displayError(t('errors.sync.failed'), error);
|
|
308
|
+
process.exit(1);
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
program
|
|
312
|
+
.command('serve')
|
|
313
|
+
.description('Start passthrough server for external AI agents (stdin/stdout JSON)')
|
|
314
|
+
.option('-r, --repo-path <path>', 'Default repository path for tools')
|
|
315
|
+
.option('-f, --format <format>', 'Output format: json or jsonl', 'jsonl')
|
|
316
|
+
.option('-v, --verbose', 'Enable verbose logging to stderr')
|
|
317
|
+
.action(async (options) => {
|
|
318
|
+
const service = new serve_1.ServeService({
|
|
319
|
+
repoPath: options.repoPath,
|
|
320
|
+
format: options.format,
|
|
321
|
+
verbose: options.verbose
|
|
322
|
+
});
|
|
323
|
+
try {
|
|
324
|
+
await service.run();
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
if (options.verbose) {
|
|
328
|
+
process.stderr.write(`[serve] Error: ${error}\n`);
|
|
329
|
+
}
|
|
330
|
+
process.exit(1);
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
program
|
|
334
|
+
.command('mcp')
|
|
335
|
+
.description('Start MCP (Model Context Protocol) server for Claude Code integration')
|
|
336
|
+
.option('-r, --repo-path <path>', 'Default repository path for tools')
|
|
337
|
+
.option('-v, --verbose', 'Enable verbose logging to stderr')
|
|
338
|
+
.action(async (options) => {
|
|
339
|
+
try {
|
|
340
|
+
const server = await (0, mcp_1.startMCPServer)({
|
|
341
|
+
repoPath: options.repoPath,
|
|
342
|
+
verbose: options.verbose
|
|
343
|
+
});
|
|
344
|
+
// Handle graceful shutdown
|
|
345
|
+
process.on('SIGINT', async () => {
|
|
346
|
+
await server.stop();
|
|
347
|
+
process.exit(0);
|
|
348
|
+
});
|
|
349
|
+
process.on('SIGTERM', async () => {
|
|
350
|
+
await server.stop();
|
|
351
|
+
process.exit(0);
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
if (options.verbose) {
|
|
356
|
+
process.stderr.write(`[mcp] Error: ${error}\n`);
|
|
357
|
+
}
|
|
358
|
+
process.exit(1);
|
|
359
|
+
}
|
|
360
|
+
});
|
|
212
361
|
async function runInit(repoPath, type, rawOptions) {
|
|
213
362
|
await initService.run(repoPath, type, rawOptions);
|
|
214
363
|
}
|
|
@@ -255,27 +404,150 @@ async function selectLocale(showWelcome) {
|
|
|
255
404
|
currentLocale = normalizedLocale;
|
|
256
405
|
translateFn = (0, i18n_1.createTranslator)(normalizedLocale);
|
|
257
406
|
if (showWelcome) {
|
|
258
|
-
ui.displayWelcome(VERSION);
|
|
407
|
+
ui.displayWelcome(version_1.VERSION);
|
|
259
408
|
}
|
|
260
409
|
}
|
|
261
410
|
async function runInteractive() {
|
|
262
411
|
await selectLocale(true);
|
|
263
|
-
|
|
264
|
-
|
|
412
|
+
const projectPath = process.cwd();
|
|
413
|
+
const detector = new state_1.StateDetector({ projectPath });
|
|
414
|
+
const result = await detector.detect();
|
|
415
|
+
// Display project info
|
|
416
|
+
console.log('');
|
|
417
|
+
ui.displayInfo(`${version_1.PACKAGE_NAME} v${version_1.VERSION}`, `Project: ${projectPath}`);
|
|
418
|
+
// Show state-specific information
|
|
419
|
+
switch (result.state) {
|
|
420
|
+
case 'new':
|
|
421
|
+
console.log(theme_1.colors.secondaryDim(' No context documentation found.\n'));
|
|
422
|
+
break;
|
|
423
|
+
case 'unfilled':
|
|
424
|
+
console.log(theme_1.colors.secondaryDim(` Context: ${result.details.unfilledFiles} files need filling\n`));
|
|
425
|
+
break;
|
|
426
|
+
case 'outdated':
|
|
427
|
+
console.log(theme_1.colors.warning(` Code modified ${result.details.daysBehind} day(s) ago (docs not updated)\n`));
|
|
428
|
+
break;
|
|
429
|
+
case 'ready':
|
|
430
|
+
console.log(theme_1.colors.success(` Context: ${result.details.totalFiles} docs, all up to date\n`));
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
// Handle state-based flow
|
|
434
|
+
if (result.state === 'new') {
|
|
265
435
|
const { action } = await inquirer_1.default.prompt([
|
|
266
436
|
{
|
|
267
437
|
type: 'list',
|
|
268
438
|
name: 'action',
|
|
269
439
|
message: t('prompts.main.action'),
|
|
270
440
|
choices: [
|
|
271
|
-
{ name: t('prompts.main.choice.
|
|
441
|
+
{ name: t('prompts.main.choice.create'), value: 'create' },
|
|
442
|
+
{ name: t('prompts.main.choice.exit'), value: 'exit' }
|
|
443
|
+
]
|
|
444
|
+
}
|
|
445
|
+
]);
|
|
446
|
+
if (action === 'create') {
|
|
447
|
+
// Run init + fill automatically
|
|
448
|
+
await runQuickSetup(projectPath);
|
|
449
|
+
}
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
if (result.state === 'unfilled') {
|
|
453
|
+
const { action } = await inquirer_1.default.prompt([
|
|
454
|
+
{
|
|
455
|
+
type: 'list',
|
|
456
|
+
name: 'action',
|
|
457
|
+
message: t('prompts.main.unfilledPrompt', { count: result.details.unfilledFiles }),
|
|
458
|
+
choices: [
|
|
272
459
|
{ name: t('prompts.main.choice.fill'), value: 'fill' },
|
|
273
|
-
{ name: t('prompts.main.choice.
|
|
274
|
-
{ name: t('prompts.main.choice.changeLanguage'), value: 'changeLanguage' },
|
|
460
|
+
{ name: t('prompts.main.choice.moreOptions'), value: 'menu' },
|
|
275
461
|
{ name: t('prompts.main.choice.exit'), value: 'exit' }
|
|
276
462
|
]
|
|
277
463
|
}
|
|
278
464
|
]);
|
|
465
|
+
if (action === 'fill') {
|
|
466
|
+
await runInteractiveLlmFill();
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
else if (action === 'menu') {
|
|
470
|
+
await runFullMenu();
|
|
471
|
+
}
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
// For 'ready' or 'outdated' states, show full menu
|
|
475
|
+
await runFullMenu(result.state === 'outdated' ? result.details.daysBehind : undefined);
|
|
476
|
+
}
|
|
477
|
+
async function runQuickSetup(projectPath) {
|
|
478
|
+
const { confirm } = await inquirer_1.default.prompt([
|
|
479
|
+
{
|
|
480
|
+
type: 'confirm',
|
|
481
|
+
name: 'confirm',
|
|
482
|
+
message: t('prompts.setup.confirmContinue'),
|
|
483
|
+
default: true
|
|
484
|
+
}
|
|
485
|
+
]);
|
|
486
|
+
if (!confirm) {
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
// Run init
|
|
490
|
+
ui.startSpinner(t('spinner.setup.creatingStructure'));
|
|
491
|
+
try {
|
|
492
|
+
const initService = new initService_1.InitService({ ui, t, version: version_1.VERSION });
|
|
493
|
+
await initService.run(projectPath, 'both', {
|
|
494
|
+
semantic: true
|
|
495
|
+
});
|
|
496
|
+
ui.stopSpinner();
|
|
497
|
+
}
|
|
498
|
+
catch (error) {
|
|
499
|
+
ui.stopSpinner();
|
|
500
|
+
ui.displayError('Failed to create structure', error);
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
// Prompt for LLM config and run fill
|
|
504
|
+
const llmConfig = await (0, prompts_1.promptLLMConfig)(t);
|
|
505
|
+
if (!llmConfig) {
|
|
506
|
+
ui.displayInfo(t('info.setup.incomplete.title'), t('info.setup.incomplete.detail'));
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
ui.startSpinner(t('spinner.setup.fillingDocs'));
|
|
510
|
+
try {
|
|
511
|
+
const fillService = new fillService_1.FillService({ ui, t, version: version_1.VERSION, defaultModel: DEFAULT_MODEL });
|
|
512
|
+
await fillService.run(projectPath, {
|
|
513
|
+
model: llmConfig.model,
|
|
514
|
+
provider: llmConfig.provider,
|
|
515
|
+
apiKey: llmConfig.apiKey,
|
|
516
|
+
baseUrl: llmConfig.baseUrl,
|
|
517
|
+
verbose: false,
|
|
518
|
+
semantic: true
|
|
519
|
+
});
|
|
520
|
+
ui.stopSpinner();
|
|
521
|
+
ui.displaySuccess(t('success.setup.docsCreated'));
|
|
522
|
+
console.log(theme_1.colors.secondaryDim(` ${t('info.setup.reviewFiles')}`));
|
|
523
|
+
}
|
|
524
|
+
catch (error) {
|
|
525
|
+
ui.stopSpinner();
|
|
526
|
+
ui.displayError('Failed to fill documentation', error);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
async function runFullMenu(daysBehind) {
|
|
530
|
+
let exitRequested = false;
|
|
531
|
+
while (!exitRequested) {
|
|
532
|
+
const updateLabel = daysBehind
|
|
533
|
+
? t('prompts.main.choice.updateDocsBehind', { daysBehind })
|
|
534
|
+
: t('prompts.main.choice.updateDocs');
|
|
535
|
+
const choices = [
|
|
536
|
+
{ name: t('prompts.main.choice.plan'), value: 'plan' },
|
|
537
|
+
{ name: updateLabel, value: 'fill' },
|
|
538
|
+
{ name: t('prompts.main.choice.syncAgents'), value: 'syncAgents' },
|
|
539
|
+
{ name: t('prompts.main.choice.rescaffold'), value: 'scaffold' },
|
|
540
|
+
{ name: t('prompts.main.choice.changeLanguage'), value: 'changeLanguage' },
|
|
541
|
+
{ name: t('prompts.main.choice.exit'), value: 'exit' }
|
|
542
|
+
];
|
|
543
|
+
const { action } = await inquirer_1.default.prompt([
|
|
544
|
+
{
|
|
545
|
+
type: 'list',
|
|
546
|
+
name: 'action',
|
|
547
|
+
message: t('prompts.main.action'),
|
|
548
|
+
choices
|
|
549
|
+
}
|
|
550
|
+
]);
|
|
279
551
|
if (action === 'changeLanguage') {
|
|
280
552
|
await selectLocale(true);
|
|
281
553
|
continue;
|
|
@@ -290,9 +562,12 @@ async function runInteractive() {
|
|
|
290
562
|
else if (action === 'fill') {
|
|
291
563
|
await runInteractiveLlmFill();
|
|
292
564
|
}
|
|
293
|
-
else {
|
|
565
|
+
else if (action === 'plan') {
|
|
294
566
|
await runInteractivePlan();
|
|
295
567
|
}
|
|
568
|
+
else if (action === 'syncAgents') {
|
|
569
|
+
await runInteractiveSync();
|
|
570
|
+
}
|
|
296
571
|
ui.displayInfo(t('info.interactive.returning.title'), t('info.interactive.returning.detail'));
|
|
297
572
|
}
|
|
298
573
|
ui.displaySuccess(t('success.interactive.goodbye'));
|
|
@@ -339,16 +614,65 @@ async function runInteractiveScaffold() {
|
|
|
339
614
|
]);
|
|
340
615
|
await runInit(resolvedRepo, scaffoldType, {
|
|
341
616
|
output: outputDir,
|
|
342
|
-
verbose
|
|
617
|
+
verbose,
|
|
618
|
+
semantic: true
|
|
343
619
|
});
|
|
344
620
|
}
|
|
345
621
|
async function runInteractiveLlmFill() {
|
|
622
|
+
const defaults = await (0, prompts_1.detectSmartDefaults)();
|
|
623
|
+
const interactiveMode = await (0, prompts_1.promptInteractiveMode)(t);
|
|
624
|
+
if (interactiveMode === 'quick') {
|
|
625
|
+
// Quick mode: minimal prompts with smart defaults
|
|
626
|
+
const { confirmRepo } = await inquirer_1.default.prompt([
|
|
627
|
+
{
|
|
628
|
+
type: 'confirm',
|
|
629
|
+
name: 'confirmRepo',
|
|
630
|
+
message: `${t('prompts.quick.confirmRepo')} (${defaults.repoPath})`,
|
|
631
|
+
default: true
|
|
632
|
+
}
|
|
633
|
+
]);
|
|
634
|
+
const resolvedRepo = confirmRepo ? defaults.repoPath : (await inquirer_1.default.prompt([
|
|
635
|
+
{ type: 'input', name: 'repoPath', message: t('prompts.fill.repoPath'), default: defaults.repoPath }
|
|
636
|
+
])).repoPath;
|
|
637
|
+
// Get LLM config (auto-detected or prompt for API key)
|
|
638
|
+
const llmConfig = await (0, prompts_1.promptLLMConfig)(t, { defaultModel: DEFAULT_MODEL, skipIfConfigured: true });
|
|
639
|
+
// Build summary
|
|
640
|
+
const summary = {
|
|
641
|
+
operation: 'fill',
|
|
642
|
+
repoPath: resolvedRepo,
|
|
643
|
+
outputDir: defaults.outputDir,
|
|
644
|
+
provider: llmConfig.provider,
|
|
645
|
+
model: llmConfig.model,
|
|
646
|
+
apiKeySource: llmConfig.autoDetected ? 'env' : llmConfig.apiKey ? 'provided' : 'none',
|
|
647
|
+
options: {
|
|
648
|
+
Semantic: true,
|
|
649
|
+
Languages: defaults.detectedLanguages.join(', '),
|
|
650
|
+
LSP: false
|
|
651
|
+
}
|
|
652
|
+
};
|
|
653
|
+
(0, prompts_1.displayConfigSummary)(summary, t);
|
|
654
|
+
const proceed = await (0, prompts_1.promptConfirmProceed)(t);
|
|
655
|
+
if (proceed) {
|
|
656
|
+
await fillService.run(resolvedRepo, {
|
|
657
|
+
output: defaults.outputDir,
|
|
658
|
+
model: llmConfig.model,
|
|
659
|
+
provider: llmConfig.provider,
|
|
660
|
+
apiKey: llmConfig.apiKey,
|
|
661
|
+
verbose: false,
|
|
662
|
+
semantic: true,
|
|
663
|
+
languages: defaults.detectedLanguages,
|
|
664
|
+
useLsp: false
|
|
665
|
+
});
|
|
666
|
+
}
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
// Advanced mode: full configuration
|
|
346
670
|
const { repoPath } = await inquirer_1.default.prompt([
|
|
347
671
|
{
|
|
348
672
|
type: 'input',
|
|
349
673
|
name: 'repoPath',
|
|
350
674
|
message: t('prompts.fill.repoPath'),
|
|
351
|
-
default:
|
|
675
|
+
default: defaults.repoPath
|
|
352
676
|
}
|
|
353
677
|
]);
|
|
354
678
|
const resolvedRepo = path.resolve(repoPath.trim() || '.');
|
|
@@ -378,75 +702,154 @@ async function runInteractiveLlmFill() {
|
|
|
378
702
|
]);
|
|
379
703
|
const limitValue = limit ? parseInt(limit, 10) : undefined;
|
|
380
704
|
const parsedLimit = Number.isNaN(limitValue) ? undefined : limitValue;
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
705
|
+
// Use shared LLM prompt helper
|
|
706
|
+
const llmConfig = await (0, prompts_1.promptLLMConfig)(t, { defaultModel: DEFAULT_MODEL, skipIfConfigured: false });
|
|
707
|
+
// Use shared analysis options prompt
|
|
708
|
+
const analysisOptions = await (0, prompts_1.promptAnalysisOptions)(t, {
|
|
709
|
+
languages: defaults.detectedLanguages,
|
|
710
|
+
useLsp: false
|
|
711
|
+
});
|
|
712
|
+
// Show summary before execution
|
|
713
|
+
const summary = {
|
|
714
|
+
operation: 'fill',
|
|
715
|
+
repoPath: resolvedRepo,
|
|
716
|
+
outputDir,
|
|
717
|
+
provider: llmConfig.provider,
|
|
718
|
+
model: llmConfig.model,
|
|
719
|
+
apiKeySource: llmConfig.autoDetected ? 'env' : llmConfig.apiKey ? 'provided' : 'none',
|
|
720
|
+
options: {
|
|
721
|
+
Semantic: analysisOptions.semantic,
|
|
722
|
+
Languages: analysisOptions.languages?.join(', ') || 'none',
|
|
723
|
+
LSP: analysisOptions.useLsp,
|
|
724
|
+
Verbose: analysisOptions.verbose,
|
|
725
|
+
...(parsedLimit ? { Limit: String(parsedLimit) } : {})
|
|
387
726
|
}
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
if (
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
727
|
+
};
|
|
728
|
+
(0, prompts_1.displayConfigSummary)(summary, t);
|
|
729
|
+
const proceed = await (0, prompts_1.promptConfirmProceed)(t);
|
|
730
|
+
if (proceed) {
|
|
731
|
+
await fillService.run(resolvedRepo, {
|
|
732
|
+
output: outputDir,
|
|
733
|
+
prompt: promptPath,
|
|
734
|
+
limit: parsedLimit,
|
|
735
|
+
model: llmConfig.model,
|
|
736
|
+
provider: llmConfig.provider,
|
|
737
|
+
apiKey: llmConfig.apiKey,
|
|
738
|
+
verbose: analysisOptions.verbose,
|
|
739
|
+
semantic: analysisOptions.semantic,
|
|
740
|
+
languages: analysisOptions.languages,
|
|
741
|
+
useLsp: analysisOptions.useLsp
|
|
742
|
+
});
|
|
402
743
|
}
|
|
403
|
-
|
|
744
|
+
}
|
|
745
|
+
function generatePlanSlug(goal) {
|
|
746
|
+
return goal
|
|
747
|
+
.toLowerCase()
|
|
748
|
+
.replace(/[àáâãäå]/g, 'a')
|
|
749
|
+
.replace(/[èéêë]/g, 'e')
|
|
750
|
+
.replace(/[ìíîï]/g, 'i')
|
|
751
|
+
.replace(/[òóôõö]/g, 'o')
|
|
752
|
+
.replace(/[ùúûü]/g, 'u')
|
|
753
|
+
.replace(/[ç]/g, 'c')
|
|
754
|
+
.replace(/[ñ]/g, 'n')
|
|
755
|
+
.replace(/[^a-z0-9\s-]/g, '')
|
|
756
|
+
.trim()
|
|
757
|
+
.replace(/\s+/g, '-')
|
|
758
|
+
.replace(/-+/g, '-')
|
|
759
|
+
.substring(0, 50)
|
|
760
|
+
.replace(/-$/, '') || 'new-plan';
|
|
761
|
+
}
|
|
762
|
+
async function runInteractivePlan() {
|
|
763
|
+
const defaults = await (0, prompts_1.detectSmartDefaults)();
|
|
764
|
+
// Ask what should be planned
|
|
765
|
+
const { planGoal } = await inquirer_1.default.prompt([
|
|
404
766
|
{
|
|
405
|
-
type: '
|
|
406
|
-
name: '
|
|
407
|
-
message: t('prompts.
|
|
408
|
-
|
|
767
|
+
type: 'input',
|
|
768
|
+
name: 'planGoal',
|
|
769
|
+
message: t('prompts.plan.goal'),
|
|
770
|
+
validate: (input) => input.trim().length > 0 || 'Please describe what should be planned'
|
|
409
771
|
}
|
|
410
772
|
]);
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
773
|
+
const planName = generatePlanSlug(planGoal);
|
|
774
|
+
const planSummary = planGoal;
|
|
775
|
+
const interactiveMode = await (0, prompts_1.promptInteractiveMode)(t);
|
|
776
|
+
if (interactiveMode === 'quick') {
|
|
777
|
+
// Quick mode: choose scaffold or fill with defaults
|
|
778
|
+
const { action } = await inquirer_1.default.prompt([
|
|
414
779
|
{
|
|
415
|
-
type: '
|
|
416
|
-
name: '
|
|
417
|
-
message: t('prompts.
|
|
418
|
-
|
|
780
|
+
type: 'list',
|
|
781
|
+
name: 'action',
|
|
782
|
+
message: t('prompts.plan.mode'),
|
|
783
|
+
choices: [
|
|
784
|
+
{ name: t('prompts.plan.modeScaffold'), value: 'scaffold' },
|
|
785
|
+
{ name: t('prompts.plan.modeFill'), value: 'fill' }
|
|
786
|
+
],
|
|
787
|
+
default: 'scaffold'
|
|
419
788
|
}
|
|
420
789
|
]);
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
790
|
+
if (action === 'scaffold') {
|
|
791
|
+
// Quick scaffold: just create the template
|
|
792
|
+
const generator = new planGenerator_1.PlanGenerator();
|
|
793
|
+
ui.startSpinner(t('spinner.plan.creating'));
|
|
794
|
+
try {
|
|
795
|
+
const result = await generator.generatePlan({
|
|
796
|
+
planName,
|
|
797
|
+
summary: planSummary,
|
|
798
|
+
outputDir: defaults.outputDir,
|
|
799
|
+
verbose: false,
|
|
800
|
+
semantic: true,
|
|
801
|
+
projectPath: defaults.repoPath
|
|
802
|
+
});
|
|
803
|
+
ui.updateSpinner(t('spinner.plan.created'), 'success');
|
|
804
|
+
ui.displaySuccess(t('success.plan.createdAt', { path: theme_1.colors.accent(result.relativePath) }));
|
|
805
|
+
}
|
|
806
|
+
catch (error) {
|
|
807
|
+
ui.updateSpinner(t('spinner.plan.creationFailed'), 'fail');
|
|
808
|
+
ui.displayError(t('errors.plan.creationFailed'), error);
|
|
809
|
+
}
|
|
810
|
+
finally {
|
|
811
|
+
ui.stopSpinner();
|
|
812
|
+
}
|
|
813
|
+
return;
|
|
429
814
|
}
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
815
|
+
// Quick fill: use auto-detected LLM config
|
|
816
|
+
const llmConfig = await (0, prompts_1.promptLLMConfig)(t, { defaultModel: DEFAULT_MODEL, skipIfConfigured: true });
|
|
817
|
+
const configSummary = {
|
|
818
|
+
operation: 'plan',
|
|
819
|
+
repoPath: defaults.repoPath,
|
|
820
|
+
outputDir: defaults.outputDir,
|
|
821
|
+
provider: llmConfig.provider,
|
|
822
|
+
model: llmConfig.model,
|
|
823
|
+
apiKeySource: llmConfig.autoDetected ? 'env' : llmConfig.apiKey ? 'provided' : 'none',
|
|
824
|
+
options: {
|
|
825
|
+
Goal: planSummary,
|
|
826
|
+
'File': `${planName}.md`,
|
|
827
|
+
LSP: true,
|
|
828
|
+
'Dry Run': false
|
|
829
|
+
}
|
|
830
|
+
};
|
|
831
|
+
(0, prompts_1.displayConfigSummary)(configSummary, t);
|
|
832
|
+
const proceed = await (0, prompts_1.promptConfirmProceed)(t);
|
|
833
|
+
if (proceed) {
|
|
834
|
+
try {
|
|
835
|
+
await planService.scaffoldPlanIfNeeded(planName, defaults.outputDir, { summary: planSummary });
|
|
836
|
+
await planService.fillPlan(planName, {
|
|
837
|
+
output: defaults.outputDir,
|
|
838
|
+
repo: defaults.repoPath,
|
|
839
|
+
dryRun: false,
|
|
840
|
+
provider: llmConfig.provider,
|
|
841
|
+
model: llmConfig.model,
|
|
842
|
+
apiKey: llmConfig.apiKey,
|
|
843
|
+
lsp: true
|
|
844
|
+
});
|
|
845
|
+
}
|
|
846
|
+
catch (error) {
|
|
847
|
+
ui.displayError(t('errors.plan.fillFailed'), error);
|
|
848
|
+
}
|
|
448
849
|
}
|
|
449
|
-
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
// Advanced mode: full configuration
|
|
450
853
|
const defaultOutput = path.resolve(process.cwd(), '.context');
|
|
451
854
|
const { mode } = await inquirer_1.default.prompt([
|
|
452
855
|
{
|
|
@@ -469,14 +872,6 @@ async function runInteractivePlan() {
|
|
|
469
872
|
}
|
|
470
873
|
]);
|
|
471
874
|
if (mode === 'fill') {
|
|
472
|
-
const { summary } = await inquirer_1.default.prompt([
|
|
473
|
-
{
|
|
474
|
-
type: 'input',
|
|
475
|
-
name: 'summary',
|
|
476
|
-
message: t('prompts.plan.summary'),
|
|
477
|
-
filter: (value) => value.trim()
|
|
478
|
-
}
|
|
479
|
-
]);
|
|
480
875
|
const { repoPath } = await inquirer_1.default.prompt([
|
|
481
876
|
{
|
|
482
877
|
type: 'input',
|
|
@@ -485,6 +880,8 @@ async function runInteractivePlan() {
|
|
|
485
880
|
default: process.cwd()
|
|
486
881
|
}
|
|
487
882
|
]);
|
|
883
|
+
// Use shared LLM prompt helper
|
|
884
|
+
const llmConfig = await (0, prompts_1.promptLLMConfig)(t, { defaultModel: DEFAULT_MODEL, skipIfConfigured: false });
|
|
488
885
|
const { dryRun } = await inquirer_1.default.prompt([
|
|
489
886
|
{
|
|
490
887
|
type: 'confirm',
|
|
@@ -493,41 +890,67 @@ async function runInteractivePlan() {
|
|
|
493
890
|
default: true
|
|
494
891
|
}
|
|
495
892
|
]);
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
893
|
+
const { useLsp } = await inquirer_1.default.prompt([
|
|
894
|
+
{
|
|
895
|
+
type: 'confirm',
|
|
896
|
+
name: 'useLsp',
|
|
897
|
+
message: t('prompts.plan.useLsp'),
|
|
898
|
+
default: true
|
|
899
|
+
}
|
|
900
|
+
]);
|
|
901
|
+
// Show summary before execution
|
|
902
|
+
const advancedConfigSummary = {
|
|
903
|
+
operation: 'plan',
|
|
904
|
+
repoPath,
|
|
905
|
+
outputDir,
|
|
906
|
+
provider: llmConfig.provider,
|
|
907
|
+
model: llmConfig.model,
|
|
908
|
+
apiKeySource: llmConfig.autoDetected ? 'env' : llmConfig.apiKey ? 'provided' : 'none',
|
|
909
|
+
options: {
|
|
910
|
+
Goal: planSummary,
|
|
911
|
+
'File': `${planName}.md`,
|
|
912
|
+
LSP: useLsp,
|
|
913
|
+
'Dry Run': dryRun
|
|
914
|
+
}
|
|
915
|
+
};
|
|
916
|
+
(0, prompts_1.displayConfigSummary)(advancedConfigSummary, t);
|
|
917
|
+
const proceed = await (0, prompts_1.promptConfirmProceed)(t);
|
|
918
|
+
if (proceed) {
|
|
919
|
+
try {
|
|
920
|
+
const resolvedOutput = path.resolve(outputDir.trim() || defaultOutput);
|
|
921
|
+
await planService.scaffoldPlanIfNeeded(planName, resolvedOutput, {
|
|
922
|
+
summary: planSummary
|
|
923
|
+
});
|
|
924
|
+
await planService.fillPlan(planName, {
|
|
925
|
+
output: resolvedOutput,
|
|
926
|
+
repo: repoPath,
|
|
927
|
+
dryRun,
|
|
928
|
+
provider: llmConfig.provider,
|
|
929
|
+
model: llmConfig.model,
|
|
930
|
+
apiKey: llmConfig.apiKey,
|
|
931
|
+
lsp: useLsp
|
|
932
|
+
});
|
|
933
|
+
}
|
|
934
|
+
catch (error) {
|
|
935
|
+
ui.displayError(t('errors.plan.fillFailed'), error);
|
|
936
|
+
}
|
|
509
937
|
}
|
|
510
938
|
return;
|
|
511
939
|
}
|
|
512
|
-
|
|
513
|
-
{
|
|
514
|
-
type: 'input',
|
|
515
|
-
name: 'summary',
|
|
516
|
-
message: t('prompts.plan.summary'),
|
|
517
|
-
filter: (value) => value.trim()
|
|
518
|
-
}
|
|
519
|
-
]);
|
|
940
|
+
// Scaffold mode - use planSummary from goal input
|
|
520
941
|
const generator = new planGenerator_1.PlanGenerator();
|
|
521
942
|
ui.startSpinner(t('spinner.plan.creating'));
|
|
522
943
|
try {
|
|
523
944
|
const result = await generator.generatePlan({
|
|
524
945
|
planName,
|
|
525
946
|
outputDir: path.resolve(outputDir.trim() || defaultOutput),
|
|
526
|
-
summary:
|
|
527
|
-
verbose: false
|
|
947
|
+
summary: planSummary,
|
|
948
|
+
verbose: false,
|
|
949
|
+
semantic: true,
|
|
950
|
+
projectPath: path.resolve(outputDir.trim() || defaultOutput, '..')
|
|
528
951
|
});
|
|
529
952
|
ui.updateSpinner(t('spinner.plan.created'), 'success');
|
|
530
|
-
ui.displaySuccess(t('success.plan.createdAt', { path:
|
|
953
|
+
ui.displaySuccess(t('success.plan.createdAt', { path: theme_1.colors.accent(result.relativePath) }));
|
|
531
954
|
}
|
|
532
955
|
catch (error) {
|
|
533
956
|
ui.updateSpinner(t('spinner.plan.creationFailed'), 'fail');
|
|
@@ -537,6 +960,82 @@ async function runInteractivePlan() {
|
|
|
537
960
|
ui.stopSpinner();
|
|
538
961
|
}
|
|
539
962
|
}
|
|
963
|
+
async function runInteractiveSync() {
|
|
964
|
+
const defaults = await (0, prompts_1.detectSmartDefaults)();
|
|
965
|
+
const defaultSource = path.resolve(defaults.repoPath, '.context/agents');
|
|
966
|
+
// Simplified: single prompt for target selection with common presets
|
|
967
|
+
const { quickTarget } = await inquirer_1.default.prompt([
|
|
968
|
+
{
|
|
969
|
+
type: 'list',
|
|
970
|
+
name: 'quickTarget',
|
|
971
|
+
message: t('prompts.sync.quickTarget'),
|
|
972
|
+
choices: [
|
|
973
|
+
{ name: t('prompts.sync.quickTarget.common'), value: 'common' },
|
|
974
|
+
{ name: t('prompts.sync.quickTarget.claude'), value: 'claude' },
|
|
975
|
+
{ name: t('prompts.sync.quickTarget.all'), value: 'all' },
|
|
976
|
+
{ name: t('prompts.sync.quickTarget.custom'), value: 'custom' }
|
|
977
|
+
],
|
|
978
|
+
default: 'common'
|
|
979
|
+
}
|
|
980
|
+
]);
|
|
981
|
+
let preset;
|
|
982
|
+
let target;
|
|
983
|
+
let sourcePath = defaultSource;
|
|
984
|
+
if (quickTarget === 'custom') {
|
|
985
|
+
// Custom path: ask for source and target
|
|
986
|
+
const answers = await inquirer_1.default.prompt([
|
|
987
|
+
{
|
|
988
|
+
type: 'input',
|
|
989
|
+
name: 'sourcePath',
|
|
990
|
+
message: t('prompts.sync.source'),
|
|
991
|
+
default: defaultSource
|
|
992
|
+
},
|
|
993
|
+
{
|
|
994
|
+
type: 'input',
|
|
995
|
+
name: 'customPath',
|
|
996
|
+
message: t('prompts.sync.customPath')
|
|
997
|
+
}
|
|
998
|
+
]);
|
|
999
|
+
sourcePath = answers.sourcePath;
|
|
1000
|
+
target = [answers.customPath];
|
|
1001
|
+
}
|
|
1002
|
+
else if (quickTarget === 'common') {
|
|
1003
|
+
// Common: Claude + GitHub - use explicit target paths instead of preset
|
|
1004
|
+
target = [
|
|
1005
|
+
path.resolve(defaults.repoPath, '.claude/agents'),
|
|
1006
|
+
path.resolve(defaults.repoPath, '.github/agents')
|
|
1007
|
+
];
|
|
1008
|
+
}
|
|
1009
|
+
else {
|
|
1010
|
+
preset = quickTarget;
|
|
1011
|
+
}
|
|
1012
|
+
// Show summary
|
|
1013
|
+
const summary = {
|
|
1014
|
+
operation: 'sync',
|
|
1015
|
+
repoPath: sourcePath,
|
|
1016
|
+
options: {
|
|
1017
|
+
Target: quickTarget === 'custom' ? (target?.[0] || 'custom') : quickTarget,
|
|
1018
|
+
Mode: 'symlink'
|
|
1019
|
+
}
|
|
1020
|
+
};
|
|
1021
|
+
(0, prompts_1.displayConfigSummary)(summary, t);
|
|
1022
|
+
const proceed = await (0, prompts_1.promptConfirmProceed)(t);
|
|
1023
|
+
if (proceed) {
|
|
1024
|
+
try {
|
|
1025
|
+
await syncService.run({
|
|
1026
|
+
source: sourcePath,
|
|
1027
|
+
mode: 'symlink',
|
|
1028
|
+
preset: preset,
|
|
1029
|
+
target,
|
|
1030
|
+
force: false,
|
|
1031
|
+
dryRun: false
|
|
1032
|
+
});
|
|
1033
|
+
}
|
|
1034
|
+
catch (error) {
|
|
1035
|
+
ui.displayError(t('errors.sync.failed'), error);
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
540
1039
|
function filterOutLocaleArgs(args) {
|
|
541
1040
|
const filtered = [];
|
|
542
1041
|
for (let index = 0; index < args.length; index += 1) {
|
|
@@ -562,10 +1061,43 @@ async function main() {
|
|
|
562
1061
|
}
|
|
563
1062
|
await program.parseAsync(process.argv);
|
|
564
1063
|
}
|
|
1064
|
+
/**
|
|
1065
|
+
* Check if an error is from user interrupt (Ctrl+C)
|
|
1066
|
+
*/
|
|
1067
|
+
function isUserInterrupt(error) {
|
|
1068
|
+
if (error instanceof Error) {
|
|
1069
|
+
// Inquirer's ExitPromptError when user presses Ctrl+C
|
|
1070
|
+
if (error.name === 'ExitPromptError')
|
|
1071
|
+
return true;
|
|
1072
|
+
// Check message patterns
|
|
1073
|
+
if (error.message.includes('force closed'))
|
|
1074
|
+
return true;
|
|
1075
|
+
if (error.message.includes('User force closed'))
|
|
1076
|
+
return true;
|
|
1077
|
+
}
|
|
1078
|
+
return false;
|
|
1079
|
+
}
|
|
1080
|
+
/**
|
|
1081
|
+
* Handle graceful exit
|
|
1082
|
+
*/
|
|
1083
|
+
function handleGracefulExit() {
|
|
1084
|
+
console.log('');
|
|
1085
|
+
ui.displaySuccess(t('success.interactive.goodbye'));
|
|
1086
|
+
process.exit(0);
|
|
1087
|
+
}
|
|
1088
|
+
// Handle SIGINT (Ctrl+C) at process level
|
|
1089
|
+
process.on('SIGINT', () => {
|
|
1090
|
+
handleGracefulExit();
|
|
1091
|
+
});
|
|
565
1092
|
if (require.main === module) {
|
|
566
1093
|
main().catch(error => {
|
|
567
|
-
|
|
568
|
-
|
|
1094
|
+
if (isUserInterrupt(error)) {
|
|
1095
|
+
handleGracefulExit();
|
|
1096
|
+
}
|
|
1097
|
+
else {
|
|
1098
|
+
ui.displayError(t('errors.cli.executionFailed'), error);
|
|
1099
|
+
process.exit(1);
|
|
1100
|
+
}
|
|
569
1101
|
});
|
|
570
1102
|
}
|
|
571
1103
|
//# sourceMappingURL=index.js.map
|