@ai-coders/context 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -68
- package/dist/commands/export.d.ts +4 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +39 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/fill.d.ts +13 -0
- package/dist/commands/fill.d.ts.map +1 -0
- package/dist/commands/fill.js +65 -0
- package/dist/commands/fill.js.map +1 -0
- package/dist/commands/index.d.ts +29 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +74 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +12 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +64 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp.d.ts +4 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +92 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/plan.d.ts +9 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +126 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/report.d.ts +4 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +36 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/serve.d.ts +4 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +29 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/skill.d.ts +4 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +217 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/start.d.ts +4 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +56 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/sync.d.ts +9 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +134 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/types.d.ts +17 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +3 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +111 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/workflow.d.ts +4 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +171 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/generators/agents/agentGenerator.d.ts +2 -0
- package/dist/generators/agents/agentGenerator.d.ts.map +1 -1
- package/dist/generators/agents/agentGenerator.js +46 -2
- package/dist/generators/agents/agentGenerator.js.map +1 -1
- package/dist/generators/agents/templates/index.d.ts +0 -1
- package/dist/generators/agents/templates/index.d.ts.map +1 -1
- package/dist/generators/agents/templates/index.js +1 -3
- package/dist/generators/agents/templates/index.js.map +1 -1
- package/dist/generators/agents/templates/playbookTemplate.d.ts.map +1 -1
- package/dist/generators/agents/templates/playbookTemplate.js +11 -0
- package/dist/generators/agents/templates/playbookTemplate.js.map +1 -1
- package/dist/generators/documentation/documentationGenerator.d.ts +2 -1
- package/dist/generators/documentation/documentationGenerator.d.ts.map +1 -1
- package/dist/generators/documentation/documentationGenerator.js +53 -34
- package/dist/generators/documentation/documentationGenerator.js.map +1 -1
- package/dist/generators/documentation/templates/apiReferenceTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/apiReferenceTemplate.js +11 -0
- package/dist/generators/documentation/templates/apiReferenceTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/architectureTemplate.d.ts +11 -0
- package/dist/generators/documentation/templates/architectureTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/architectureTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/dataFlowTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/dataFlowTemplate.js +11 -0
- 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 +11 -0
- package/dist/generators/documentation/templates/developmentWorkflowTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/glossaryTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/glossaryTemplate.js.map +1 -1
- package/dist/generators/documentation/templates/index.d.ts +0 -12
- package/dist/generators/documentation/templates/index.d.ts.map +1 -1
- package/dist/generators/documentation/templates/index.js +1 -25
- package/dist/generators/documentation/templates/index.js.map +1 -1
- package/dist/generators/documentation/templates/migrationTemplate.d.ts.map +1 -1
- package/dist/generators/documentation/templates/migrationTemplate.js +11 -0
- 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 +11 -0
- 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 +11 -0
- 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 -0
- 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 +11 -0
- 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 -0
- 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 +11 -0
- package/dist/generators/documentation/templates/troubleshootingTemplate.js.map +1 -1
- package/dist/generators/plans/templates/planTemplate.d.ts +11 -0
- package/dist/generators/plans/templates/planTemplate.d.ts.map +1 -1
- package/dist/generators/plans/templates/planTemplate.js.map +1 -1
- package/dist/generators/shared/index.d.ts +1 -0
- package/dist/generators/shared/index.d.ts.map +1 -1
- package/dist/generators/shared/index.js +16 -0
- package/dist/generators/shared/index.js.map +1 -1
- package/dist/generators/shared/scaffoldStructures.d.ts +13 -0
- package/dist/generators/shared/scaffoldStructures.d.ts.map +1 -0
- package/dist/generators/shared/scaffoldStructures.js +30 -0
- package/dist/generators/shared/scaffoldStructures.js.map +1 -0
- package/dist/generators/shared/structures/agents/definitions.d.ts +18 -0
- package/dist/generators/shared/structures/agents/definitions.d.ts.map +1 -0
- package/dist/generators/shared/structures/agents/definitions.js +22 -0
- package/dist/generators/shared/structures/agents/definitions.js.map +1 -0
- package/dist/generators/shared/structures/agents/factory.d.ts +9 -0
- package/dist/generators/shared/structures/agents/factory.d.ts.map +1 -0
- package/dist/generators/shared/structures/agents/factory.js +112 -0
- package/dist/generators/shared/structures/agents/factory.js.map +1 -0
- package/dist/generators/shared/structures/agents/index.d.ts +6 -0
- package/dist/generators/shared/structures/agents/index.d.ts.map +1 -0
- package/dist/generators/shared/structures/agents/index.js +24 -0
- package/dist/generators/shared/structures/agents/index.js.map +1 -0
- package/dist/generators/shared/structures/documentation/apiReference.d.ts +3 -0
- package/dist/generators/shared/structures/documentation/apiReference.d.ts.map +1 -0
- package/dist/generators/shared/structures/documentation/apiReference.js +100 -0
- package/dist/generators/shared/structures/documentation/apiReference.js.map +1 -0
- package/dist/generators/shared/structures/documentation/architecture.d.ts +3 -0
- package/dist/generators/shared/structures/documentation/architecture.d.ts.map +1 -0
- package/dist/generators/shared/structures/documentation/architecture.js +121 -0
- package/dist/generators/shared/structures/documentation/architecture.js.map +1 -0
- package/dist/generators/shared/structures/documentation/dataFlow.d.ts +3 -0
- package/dist/generators/shared/structures/documentation/dataFlow.d.ts.map +1 -0
- package/dist/generators/shared/structures/documentation/dataFlow.js +72 -0
- package/dist/generators/shared/structures/documentation/dataFlow.js.map +1 -0
- package/dist/generators/shared/structures/documentation/glossary.d.ts +3 -0
- package/dist/generators/shared/structures/documentation/glossary.d.ts.map +1 -0
- package/dist/generators/shared/structures/documentation/glossary.js +71 -0
- package/dist/generators/shared/structures/documentation/glossary.js.map +1 -0
- package/dist/generators/shared/structures/documentation/index.d.ts +16 -0
- package/dist/generators/shared/structures/documentation/index.d.ts.map +1 -0
- package/dist/generators/shared/structures/documentation/index.js +31 -0
- package/dist/generators/shared/structures/documentation/index.js.map +1 -0
- package/dist/generators/shared/structures/documentation/migration.d.ts +3 -0
- package/dist/generators/shared/structures/documentation/migration.d.ts.map +1 -0
- package/dist/generators/shared/structures/documentation/migration.js +113 -0
- package/dist/generators/shared/structures/documentation/migration.js.map +1 -0
- package/dist/generators/shared/structures/documentation/onboarding.d.ts +3 -0
- package/dist/generators/shared/structures/documentation/onboarding.d.ts.map +1 -0
- package/dist/generators/shared/structures/documentation/onboarding.js +99 -0
- package/dist/generators/shared/structures/documentation/onboarding.js.map +1 -0
- package/dist/generators/shared/structures/documentation/projectOverview.d.ts +3 -0
- package/dist/generators/shared/structures/documentation/projectOverview.d.ts.map +1 -0
- package/dist/generators/shared/structures/documentation/projectOverview.js +115 -0
- package/dist/generators/shared/structures/documentation/projectOverview.js.map +1 -0
- package/dist/generators/shared/structures/documentation/security.d.ts +3 -0
- package/dist/generators/shared/structures/documentation/security.d.ts.map +1 -0
- package/dist/generators/shared/structures/documentation/security.js +55 -0
- package/dist/generators/shared/structures/documentation/security.js.map +1 -0
- package/dist/generators/shared/structures/documentation/testing.d.ts +3 -0
- package/dist/generators/shared/structures/documentation/testing.d.ts.map +1 -0
- package/dist/generators/shared/structures/documentation/testing.js +57 -0
- package/dist/generators/shared/structures/documentation/testing.js.map +1 -0
- package/dist/generators/shared/structures/documentation/tooling.d.ts +3 -0
- package/dist/generators/shared/structures/documentation/tooling.d.ts.map +1 -0
- package/dist/generators/shared/structures/documentation/tooling.js +55 -0
- package/dist/generators/shared/structures/documentation/tooling.js.map +1 -0
- package/dist/generators/shared/structures/documentation/troubleshooting.d.ts +3 -0
- package/dist/generators/shared/structures/documentation/troubleshooting.d.ts.map +1 -0
- package/dist/generators/shared/structures/documentation/troubleshooting.js +91 -0
- package/dist/generators/shared/structures/documentation/troubleshooting.js.map +1 -0
- package/dist/generators/shared/structures/documentation/workflow.d.ts +3 -0
- package/dist/generators/shared/structures/documentation/workflow.d.ts.map +1 -0
- package/dist/generators/shared/structures/documentation/workflow.js +56 -0
- package/dist/generators/shared/structures/documentation/workflow.js.map +1 -0
- package/dist/generators/shared/structures/index.d.ts +15 -0
- package/dist/generators/shared/structures/index.d.ts.map +1 -0
- package/dist/generators/shared/structures/index.js +37 -0
- package/dist/generators/shared/structures/index.js.map +1 -0
- package/dist/generators/shared/structures/plans/index.d.ts +5 -0
- package/dist/generators/shared/structures/plans/index.d.ts.map +1 -0
- package/dist/generators/shared/structures/plans/index.js +9 -0
- package/dist/generators/shared/structures/plans/index.js.map +1 -0
- package/dist/generators/shared/structures/plans/planStructure.d.ts +6 -0
- package/dist/generators/shared/structures/plans/planStructure.d.ts.map +1 -0
- package/dist/generators/shared/structures/plans/planStructure.js +65 -0
- package/dist/generators/shared/structures/plans/planStructure.js.map +1 -0
- package/dist/generators/shared/structures/registry.d.ts +18 -0
- package/dist/generators/shared/structures/registry.d.ts.map +1 -0
- package/dist/generators/shared/structures/registry.js +104 -0
- package/dist/generators/shared/structures/registry.js.map +1 -0
- package/dist/generators/shared/structures/serialization.d.ts +15 -0
- package/dist/generators/shared/structures/serialization.d.ts.map +1 -0
- package/dist/generators/shared/structures/serialization.js +119 -0
- package/dist/generators/shared/structures/serialization.js.map +1 -0
- package/dist/generators/shared/structures/skills/definitions.d.ts +14 -0
- package/dist/generators/shared/structures/skills/definitions.d.ts.map +1 -0
- package/dist/generators/shared/structures/skills/definitions.js +18 -0
- package/dist/generators/shared/structures/skills/definitions.js.map +1 -0
- package/dist/generators/shared/structures/skills/factory.d.ts +9 -0
- package/dist/generators/shared/structures/skills/factory.d.ts.map +1 -0
- package/dist/generators/shared/structures/skills/factory.js +56 -0
- package/dist/generators/shared/structures/skills/factory.js.map +1 -0
- package/dist/generators/shared/structures/skills/index.d.ts +6 -0
- package/dist/generators/shared/structures/skills/index.d.ts.map +1 -0
- package/dist/generators/shared/structures/skills/index.js +20 -0
- package/dist/generators/shared/structures/skills/index.js.map +1 -0
- package/dist/generators/shared/structures/types.d.ts +59 -0
- package/dist/generators/shared/structures/types.d.ts.map +1 -0
- package/dist/generators/shared/structures/types.js +6 -0
- package/dist/generators/shared/structures/types.js.map +1 -0
- package/dist/generators/shared/structures/validation.d.ts +13 -0
- package/dist/generators/shared/structures/validation.d.ts.map +1 -0
- package/dist/generators/shared/structures/validation.js +51 -0
- package/dist/generators/shared/structures/validation.js.map +1 -0
- package/dist/generators/skills/skillGenerator.d.ts +5 -0
- package/dist/generators/skills/skillGenerator.d.ts.map +1 -1
- package/dist/generators/skills/skillGenerator.js +26 -17
- package/dist/generators/skills/skillGenerator.js.map +1 -1
- package/dist/generators/skills/templates/skillTemplate.d.ts +10 -0
- package/dist/generators/skills/templates/skillTemplate.d.ts.map +1 -1
- package/dist/generators/skills/templates/skillTemplate.js +10 -0
- package/dist/generators/skills/templates/skillTemplate.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +203 -5
- package/dist/index.js.map +1 -1
- package/dist/prompts/defaults.d.ts +5 -0
- package/dist/prompts/defaults.d.ts.map +1 -1
- package/dist/prompts/defaults.js +44 -1
- package/dist/prompts/defaults.js.map +1 -1
- package/dist/services/ai/agents/documentationAgent.d.ts +2 -0
- package/dist/services/ai/agents/documentationAgent.d.ts.map +1 -1
- package/dist/services/ai/agents/documentationAgent.js +33 -9
- package/dist/services/ai/agents/documentationAgent.js.map +1 -1
- package/dist/services/ai/agents/playbookAgent.d.ts +2 -0
- package/dist/services/ai/agents/playbookAgent.d.ts.map +1 -1
- package/dist/services/ai/agents/playbookAgent.js +44 -19
- package/dist/services/ai/agents/playbookAgent.js.map +1 -1
- package/dist/services/ai/agents/skillAgent.d.ts +2 -0
- package/dist/services/ai/agents/skillAgent.d.ts.map +1 -1
- package/dist/services/ai/agents/skillAgent.js +54 -22
- package/dist/services/ai/agents/skillAgent.js.map +1 -1
- package/dist/services/ai/schemas.d.ts +136 -9
- package/dist/services/ai/schemas.d.ts.map +1 -1
- package/dist/services/ai/schemas.js +65 -4
- package/dist/services/ai/schemas.js.map +1 -1
- package/dist/services/ai/toolRegistry.d.ts.map +1 -1
- package/dist/services/ai/toolRegistry.js +25 -17
- package/dist/services/ai/toolRegistry.js.map +1 -1
- package/dist/services/ai/tools/checkScaffoldingTool.d.ts.map +1 -1
- package/dist/services/ai/tools/checkScaffoldingTool.js +4 -1
- package/dist/services/ai/tools/checkScaffoldingTool.js.map +1 -1
- package/dist/services/ai/tools/fillScaffoldingTool.d.ts +19 -21
- package/dist/services/ai/tools/fillScaffoldingTool.d.ts.map +1 -1
- package/dist/services/ai/tools/fillScaffoldingTool.js +41 -142
- package/dist/services/ai/tools/fillScaffoldingTool.js.map +1 -1
- package/dist/services/ai/tools/getCodebaseMapTool.d.ts +1 -1
- package/dist/services/ai/tools/getCodebaseMapTool.d.ts.map +1 -1
- package/dist/services/ai/tools/getCodebaseMapTool.js +4 -1
- package/dist/services/ai/tools/getCodebaseMapTool.js.map +1 -1
- package/dist/services/ai/tools/index.d.ts +1 -1
- package/dist/services/ai/tools/index.d.ts.map +1 -1
- package/dist/services/ai/tools/index.js +1 -3
- package/dist/services/ai/tools/index.js.map +1 -1
- package/dist/services/ai/tools/initializeContextTool.d.ts +108 -16
- package/dist/services/ai/tools/initializeContextTool.d.ts.map +1 -1
- package/dist/services/ai/tools/initializeContextTool.js +177 -67
- package/dist/services/ai/tools/initializeContextTool.js.map +1 -1
- package/dist/services/ai/tools/scaffoldPlanTool.d.ts +14 -3
- package/dist/services/ai/tools/scaffoldPlanTool.d.ts.map +1 -1
- package/dist/services/ai/tools/scaffoldPlanTool.js +34 -4
- package/dist/services/ai/tools/scaffoldPlanTool.js.map +1 -1
- package/dist/services/ai/tools/toolFactory.d.ts +35 -0
- package/dist/services/ai/tools/toolFactory.d.ts.map +1 -0
- package/dist/services/ai/tools/toolFactory.js +20 -0
- package/dist/services/ai/tools/toolFactory.js.map +1 -0
- package/dist/services/export/contextExportService.d.ts +45 -0
- package/dist/services/export/contextExportService.d.ts.map +1 -0
- package/dist/services/export/contextExportService.js +161 -0
- package/dist/services/export/contextExportService.js.map +1 -0
- package/dist/services/export/exportRulesService.d.ts +15 -1
- package/dist/services/export/exportRulesService.d.ts.map +1 -1
- package/dist/services/export/exportRulesService.js +100 -36
- package/dist/services/export/exportRulesService.js.map +1 -1
- package/dist/services/export/index.d.ts +2 -0
- package/dist/services/export/index.d.ts.map +1 -1
- package/dist/services/export/index.js +3 -1
- package/dist/services/export/index.js.map +1 -1
- package/dist/services/export/skillExportService.d.ts +6 -1
- package/dist/services/export/skillExportService.d.ts.map +1 -1
- package/dist/services/export/skillExportService.js +46 -22
- package/dist/services/export/skillExportService.js.map +1 -1
- package/dist/services/fill/fillService.d.ts.map +1 -1
- package/dist/services/fill/fillService.js +30 -3
- package/dist/services/fill/fillService.js.map +1 -1
- package/dist/services/fill/skillFillService.d.ts.map +1 -1
- package/dist/services/fill/skillFillService.js +8 -1
- package/dist/services/fill/skillFillService.js.map +1 -1
- package/dist/services/import/presets.d.ts +12 -0
- package/dist/services/import/presets.d.ts.map +1 -1
- package/dist/services/import/presets.js +32 -152
- package/dist/services/import/presets.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 +42 -9
- package/dist/services/init/initService.js.map +1 -1
- package/dist/services/mcp/actionLogger.d.ts +19 -0
- package/dist/services/mcp/actionLogger.d.ts.map +1 -0
- package/dist/services/mcp/actionLogger.js +128 -0
- package/dist/services/mcp/actionLogger.js.map +1 -0
- package/dist/services/mcp/gateway/agent.d.ts +17 -0
- package/dist/services/mcp/gateway/agent.d.ts.map +1 -0
- package/dist/services/mcp/gateway/agent.js +147 -0
- package/dist/services/mcp/gateway/agent.js.map +1 -0
- package/dist/services/mcp/gateway/context.d.ts +21 -0
- package/dist/services/mcp/gateway/context.d.ts.map +1 -0
- package/dist/services/mcp/gateway/context.js +249 -0
- package/dist/services/mcp/gateway/context.js.map +1 -0
- package/dist/services/mcp/gateway/explore.d.ts +16 -0
- package/dist/services/mcp/gateway/explore.d.ts.map +1 -0
- package/dist/services/mcp/gateway/explore.js +60 -0
- package/dist/services/mcp/gateway/explore.js.map +1 -0
- package/dist/services/mcp/gateway/index.d.ts +24 -0
- package/dist/services/mcp/gateway/index.d.ts.map +1 -0
- package/dist/services/mcp/gateway/index.js +53 -0
- package/dist/services/mcp/gateway/index.js.map +1 -0
- package/dist/services/mcp/gateway/metrics.d.ts +56 -0
- package/dist/services/mcp/gateway/metrics.d.ts.map +1 -0
- package/dist/services/mcp/gateway/metrics.js +153 -0
- package/dist/services/mcp/gateway/metrics.js.map +1 -0
- package/dist/services/mcp/gateway/plan.d.ts +18 -0
- package/dist/services/mcp/gateway/plan.d.ts.map +1 -0
- package/dist/services/mcp/gateway/plan.js +273 -0
- package/dist/services/mcp/gateway/plan.js.map +1 -0
- package/dist/services/mcp/gateway/project.d.ts +16 -0
- package/dist/services/mcp/gateway/project.d.ts.map +1 -0
- package/dist/services/mcp/gateway/project.js +149 -0
- package/dist/services/mcp/gateway/project.js.map +1 -0
- package/dist/services/mcp/gateway/projectReport.d.ts +20 -0
- package/dist/services/mcp/gateway/projectReport.d.ts.map +1 -0
- package/dist/services/mcp/gateway/projectReport.js +61 -0
- package/dist/services/mcp/gateway/projectReport.js.map +1 -0
- package/dist/services/mcp/gateway/projectSetup.d.ts +29 -0
- package/dist/services/mcp/gateway/projectSetup.d.ts.map +1 -0
- package/dist/services/mcp/gateway/projectSetup.js +141 -0
- package/dist/services/mcp/gateway/projectSetup.js.map +1 -0
- package/dist/services/mcp/gateway/response.d.ts +45 -0
- package/dist/services/mcp/gateway/response.d.ts.map +1 -0
- package/dist/services/mcp/gateway/response.js +111 -0
- package/dist/services/mcp/gateway/response.js.map +1 -0
- package/dist/services/mcp/gateway/shared.d.ts +38 -0
- package/dist/services/mcp/gateway/shared.d.ts.map +1 -0
- package/dist/services/mcp/gateway/shared.js +39 -0
- package/dist/services/mcp/gateway/shared.js.map +1 -0
- package/dist/services/mcp/gateway/skill.d.ts +17 -0
- package/dist/services/mcp/gateway/skill.d.ts.map +1 -0
- package/dist/services/mcp/gateway/skill.js +323 -0
- package/dist/services/mcp/gateway/skill.js.map +1 -0
- package/dist/services/mcp/gateway/sync.d.ts +17 -0
- package/dist/services/mcp/gateway/sync.d.ts.map +1 -0
- package/dist/services/mcp/gateway/sync.js +219 -0
- package/dist/services/mcp/gateway/sync.js.map +1 -0
- package/dist/services/mcp/gateway/types.d.ts +116 -0
- package/dist/services/mcp/gateway/types.d.ts.map +1 -0
- package/dist/services/mcp/gateway/types.js +12 -0
- package/dist/services/mcp/gateway/types.js.map +1 -0
- package/dist/services/mcp/gateway/workflow.d.ts +18 -0
- package/dist/services/mcp/gateway/workflow.d.ts.map +1 -0
- package/dist/services/mcp/gateway/workflow.js +317 -0
- package/dist/services/mcp/gateway/workflow.js.map +1 -0
- package/dist/services/mcp/gateway/workflowAdvance.d.ts +25 -0
- package/dist/services/mcp/gateway/workflowAdvance.d.ts.map +1 -0
- package/dist/services/mcp/gateway/workflowAdvance.js +133 -0
- package/dist/services/mcp/gateway/workflowAdvance.js.map +1 -0
- package/dist/services/mcp/gateway/workflowInit.d.ts +28 -0
- package/dist/services/mcp/gateway/workflowInit.d.ts.map +1 -0
- package/dist/services/mcp/gateway/workflowInit.js +213 -0
- package/dist/services/mcp/gateway/workflowInit.js.map +1 -0
- package/dist/services/mcp/gateway/workflowManage.d.ts +31 -0
- package/dist/services/mcp/gateway/workflowManage.d.ts.map +1 -0
- package/dist/services/mcp/gateway/workflowManage.js +222 -0
- package/dist/services/mcp/gateway/workflowManage.js.map +1 -0
- package/dist/services/mcp/gateway/workflowStatus.d.ts +17 -0
- package/dist/services/mcp/gateway/workflowStatus.d.ts.map +1 -0
- package/dist/services/mcp/gateway/workflowStatus.js +91 -0
- package/dist/services/mcp/gateway/workflowStatus.js.map +1 -0
- package/dist/services/mcp/gatewayTools.d.ts +15 -0
- package/dist/services/mcp/gatewayTools.d.ts.map +1 -0
- package/dist/services/mcp/gatewayTools.js +38 -0
- package/dist/services/mcp/gatewayTools.js.map +1 -0
- package/dist/services/mcp/index.d.ts +7 -0
- package/dist/services/mcp/index.d.ts.map +1 -1
- package/dist/services/mcp/index.js +22 -1
- package/dist/services/mcp/index.js.map +1 -1
- package/dist/services/mcp/mcpInstallService.d.ts +56 -0
- package/dist/services/mcp/mcpInstallService.d.ts.map +1 -0
- package/dist/services/mcp/mcpInstallService.js +549 -0
- package/dist/services/mcp/mcpInstallService.js.map +1 -0
- package/dist/services/mcp/mcpServer.d.ts +45 -19
- package/dist/services/mcp/mcpServer.d.ts.map +1 -1
- package/dist/services/mcp/mcpServer.js +592 -1845
- package/dist/services/mcp/mcpServer.js.map +1 -1
- package/dist/services/passthrough/protocol.d.ts +4 -4
- package/dist/services/qa/index.d.ts +9 -0
- package/dist/services/qa/index.d.ts.map +1 -0
- package/dist/services/qa/index.js +15 -0
- package/dist/services/qa/index.js.map +1 -0
- package/dist/services/qa/patternInferer.d.ts +41 -0
- package/dist/services/qa/patternInferer.d.ts.map +1 -0
- package/dist/services/qa/patternInferer.js +366 -0
- package/dist/services/qa/patternInferer.js.map +1 -0
- package/dist/services/qa/qaService.d.ts +107 -0
- package/dist/services/qa/qaService.d.ts.map +1 -0
- package/dist/services/qa/qaService.js +874 -0
- package/dist/services/qa/qaService.js.map +1 -0
- package/dist/services/qa/topicDetector.d.ts +54 -0
- package/dist/services/qa/topicDetector.d.ts.map +1 -0
- package/dist/services/qa/topicDetector.js +306 -0
- package/dist/services/qa/topicDetector.js.map +1 -0
- package/dist/services/quickSync/quickSyncService.d.ts.map +1 -1
- package/dist/services/quickSync/quickSyncService.js +6 -10
- package/dist/services/quickSync/quickSyncService.js.map +1 -1
- package/dist/services/reverseSync/importSkillsService.d.ts +47 -0
- package/dist/services/reverseSync/importSkillsService.d.ts.map +1 -0
- package/dist/services/reverseSync/importSkillsService.js +362 -0
- package/dist/services/reverseSync/importSkillsService.js.map +1 -0
- package/dist/services/reverseSync/index.d.ts +12 -0
- package/dist/services/reverseSync/index.d.ts.map +1 -0
- package/dist/services/reverseSync/index.js +49 -0
- package/dist/services/reverseSync/index.js.map +1 -0
- package/dist/services/reverseSync/presets.d.ts +51 -0
- package/dist/services/reverseSync/presets.d.ts.map +1 -0
- package/dist/services/reverseSync/presets.js +77 -0
- package/dist/services/reverseSync/presets.js.map +1 -0
- package/dist/services/reverseSync/reverseQuickSyncService.d.ts +37 -0
- package/dist/services/reverseSync/reverseQuickSyncService.d.ts.map +1 -0
- package/dist/services/reverseSync/reverseQuickSyncService.js +265 -0
- package/dist/services/reverseSync/reverseQuickSyncService.js.map +1 -0
- package/dist/services/reverseSync/skillsDetector.d.ts +36 -0
- package/dist/services/reverseSync/skillsDetector.d.ts.map +1 -0
- package/dist/services/reverseSync/skillsDetector.js +287 -0
- package/dist/services/reverseSync/skillsDetector.js.map +1 -0
- package/dist/services/reverseSync/toolDetector.d.ts +36 -0
- package/dist/services/reverseSync/toolDetector.d.ts.map +1 -0
- package/dist/services/reverseSync/toolDetector.js +174 -0
- package/dist/services/reverseSync/toolDetector.js.map +1 -0
- package/dist/services/reverseSync/types.d.ts +203 -0
- package/dist/services/reverseSync/types.d.ts.map +1 -0
- package/dist/services/reverseSync/types.js +9 -0
- package/dist/services/reverseSync/types.js.map +1 -0
- package/dist/services/semantic/codebaseAnalyzer.d.ts +23 -1
- package/dist/services/semantic/codebaseAnalyzer.d.ts.map +1 -1
- package/dist/services/semantic/codebaseAnalyzer.js +531 -0
- package/dist/services/semantic/codebaseAnalyzer.js.map +1 -1
- package/dist/services/semantic/contextBuilder.d.ts.map +1 -1
- package/dist/services/semantic/contextBuilder.js +23 -8
- package/dist/services/semantic/contextBuilder.js.map +1 -1
- package/dist/services/semantic/types.d.ts +50 -0
- package/dist/services/semantic/types.d.ts.map +1 -1
- package/dist/services/semantic/types.js.map +1 -1
- package/dist/services/shared/contentTypeRegistry.d.ts +66 -0
- package/dist/services/shared/contentTypeRegistry.d.ts.map +1 -0
- package/dist/services/shared/contentTypeRegistry.js +113 -0
- package/dist/services/shared/contentTypeRegistry.js.map +1 -0
- package/dist/services/shared/contextRootResolver.d.ts +57 -0
- package/dist/services/shared/contextRootResolver.d.ts.map +1 -0
- package/dist/services/shared/contextRootResolver.js +102 -0
- package/dist/services/shared/contextRootResolver.js.map +1 -0
- package/dist/services/shared/index.d.ts +4 -1
- package/dist/services/shared/index.d.ts.map +1 -1
- package/dist/services/shared/index.js +39 -1
- package/dist/services/shared/index.js.map +1 -1
- package/dist/services/shared/pathHelpers.d.ts +15 -1
- package/dist/services/shared/pathHelpers.d.ts.map +1 -1
- package/dist/services/shared/pathHelpers.js +26 -1
- package/dist/services/shared/pathHelpers.js.map +1 -1
- package/dist/services/shared/toolRegistry.d.ts +135 -0
- package/dist/services/shared/toolRegistry.d.ts.map +1 -0
- package/dist/services/shared/toolRegistry.js +515 -0
- package/dist/services/shared/toolRegistry.js.map +1 -0
- package/dist/services/stack/scaffoldFilter.d.ts +1 -1
- package/dist/services/sync/presets.d.ts +3 -0
- package/dist/services/sync/presets.d.ts.map +1 -1
- package/dist/services/sync/presets.js +20 -32
- package/dist/services/sync/presets.js.map +1 -1
- package/dist/services/sync/syncService.d.ts +8 -0
- package/dist/services/sync/syncService.d.ts.map +1 -1
- package/dist/services/sync/syncService.js +21 -2
- package/dist/services/sync/syncService.js.map +1 -1
- package/dist/services/sync/types.d.ts +1 -1
- package/dist/services/sync/types.d.ts.map +1 -1
- package/dist/services/tools/index.d.ts +95 -0
- package/dist/services/tools/index.d.ts.map +1 -0
- package/dist/services/tools/index.js +236 -0
- package/dist/services/tools/index.js.map +1 -0
- package/dist/services/workflow/workflowService.d.ts +57 -4
- package/dist/services/workflow/workflowService.d.ts.map +1 -1
- package/dist/services/workflow/workflowService.js +79 -6
- package/dist/services/workflow/workflowService.js.map +1 -1
- package/dist/types/scaffoldFrontmatter.d.ts +145 -0
- package/dist/types/scaffoldFrontmatter.d.ts.map +1 -0
- package/dist/types/scaffoldFrontmatter.js +172 -0
- package/dist/types/scaffoldFrontmatter.js.map +1 -0
- package/dist/utils/cliUI.d.ts +1 -1
- package/dist/utils/cliUI.d.ts.map +1 -1
- package/dist/utils/cliUI.js +4 -1
- package/dist/utils/cliUI.js.map +1 -1
- package/dist/utils/frontMatter.d.ts +48 -0
- package/dist/utils/frontMatter.d.ts.map +1 -1
- package/dist/utils/frontMatter.js +135 -0
- package/dist/utils/frontMatter.js.map +1 -1
- package/dist/utils/gitService.d.ts +26 -0
- package/dist/utils/gitService.d.ts.map +1 -1
- package/dist/utils/gitService.js +96 -0
- package/dist/utils/gitService.js.map +1 -1
- package/dist/utils/i18n.d.ts +43 -2
- package/dist/utils/i18n.d.ts.map +1 -1
- package/dist/utils/i18n.js +96 -6
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/prompts/index.d.ts +4 -0
- package/dist/utils/prompts/index.d.ts.map +1 -1
- package/dist/utils/prompts/index.js +15 -0
- package/dist/utils/prompts/index.js.map +1 -1
- package/dist/workflow/errors.d.ts +48 -0
- package/dist/workflow/errors.d.ts.map +1 -0
- package/dist/workflow/errors.js +52 -0
- package/dist/workflow/errors.js.map +1 -0
- package/dist/workflow/gates/gateChecker.d.ts +93 -0
- package/dist/workflow/gates/gateChecker.d.ts.map +1 -0
- package/dist/workflow/gates/gateChecker.js +197 -0
- package/dist/workflow/gates/gateChecker.js.map +1 -0
- package/dist/workflow/gates/index.d.ts +7 -0
- package/dist/workflow/gates/index.d.ts.map +1 -0
- package/dist/workflow/gates/index.js +13 -0
- package/dist/workflow/gates/index.js.map +1 -0
- package/dist/workflow/index.d.ts +4 -2
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +14 -3
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/orchestrator.d.ts +94 -5
- package/dist/workflow/orchestrator.d.ts.map +1 -1
- package/dist/workflow/orchestrator.js +300 -11
- package/dist/workflow/orchestrator.js.map +1 -1
- package/dist/workflow/plans/planLinker.d.ts +79 -3
- package/dist/workflow/plans/planLinker.d.ts.map +1 -1
- package/dist/workflow/plans/planLinker.js +522 -3
- package/dist/workflow/plans/planLinker.js.map +1 -1
- package/dist/workflow/plans/types.d.ts +64 -0
- package/dist/workflow/plans/types.d.ts.map +1 -1
- package/dist/workflow/roles.d.ts +6 -0
- package/dist/workflow/roles.d.ts.map +1 -1
- package/dist/workflow/roles.js +6 -0
- package/dist/workflow/roles.js.map +1 -1
- package/dist/workflow/scaling.d.ts +1 -0
- package/dist/workflow/scaling.d.ts.map +1 -1
- package/dist/workflow/scaling.js +8 -17
- package/dist/workflow/scaling.js.map +1 -1
- package/dist/workflow/status/statusManager.d.ts +54 -1
- package/dist/workflow/status/statusManager.d.ts.map +1 -1
- package/dist/workflow/status/statusManager.js +539 -9
- package/dist/workflow/status/statusManager.js.map +1 -1
- package/dist/workflow/status/templates.d.ts +14 -5
- package/dist/workflow/status/templates.d.ts.map +1 -1
- package/dist/workflow/status/templates.js +55 -41
- package/dist/workflow/status/templates.js.map +1 -1
- package/dist/workflow/types.d.ts +138 -2
- package/dist/workflow/types.d.ts.map +1 -1
- package/dist/workflow/types.js +0 -1
- package/dist/workflow/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,874 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Q&A Service
|
|
4
|
+
*
|
|
5
|
+
* Generates and manages Q&A content for the codebase.
|
|
6
|
+
* Pre-answers common questions to reduce token usage during sessions.
|
|
7
|
+
*
|
|
8
|
+
* OPTIMIZATION: Uses codebase-map.json when available to avoid re-analyzing
|
|
9
|
+
* the codebase. This provides ~10x faster Q&A generation when the map exists.
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.QAService = void 0;
|
|
46
|
+
const fs = __importStar(require("fs-extra"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const codebaseAnalyzer_1 = require("../semantic/codebaseAnalyzer");
|
|
49
|
+
const stackDetector_1 = require("../stack/stackDetector");
|
|
50
|
+
const topicDetector_1 = require("./topicDetector");
|
|
51
|
+
const patternInferer_1 = require("./patternInferer");
|
|
52
|
+
/**
|
|
53
|
+
* Q&A Service for generating and searching Q&A content
|
|
54
|
+
*/
|
|
55
|
+
class QAService {
|
|
56
|
+
constructor(options) {
|
|
57
|
+
this.analyzer = new codebaseAnalyzer_1.CodebaseAnalyzer(options);
|
|
58
|
+
this.stackDetector = new stackDetector_1.StackDetector();
|
|
59
|
+
this.topicDetector = new topicDetector_1.TopicDetector();
|
|
60
|
+
this.patternInferer = new patternInferer_1.PatternInferer();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Generate Q&A from codebase analysis
|
|
64
|
+
*
|
|
65
|
+
* OPTIMIZATION: Uses codebase-map.json when available to avoid re-analyzing.
|
|
66
|
+
* If the map doesn't exist, falls back to full analysis.
|
|
67
|
+
*/
|
|
68
|
+
async generateFromCodebase(repoPath) {
|
|
69
|
+
const absolutePath = path.resolve(repoPath);
|
|
70
|
+
// Try to use pre-computed codebase map for faster generation
|
|
71
|
+
const codebaseMap = await this.loadCodebaseMap(absolutePath);
|
|
72
|
+
let stack;
|
|
73
|
+
let patterns;
|
|
74
|
+
if (codebaseMap) {
|
|
75
|
+
// Use pre-computed data from codebase-map.json (fast path)
|
|
76
|
+
stack = this.convertMapStackToStackInfo(codebaseMap);
|
|
77
|
+
patterns = this.patternInferer.inferFromMap(codebaseMap);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Fall back to full analysis (slow path)
|
|
81
|
+
stack = await this.stackDetector.detect(absolutePath);
|
|
82
|
+
patterns = await this.analyzer.detectFunctionalPatterns(absolutePath);
|
|
83
|
+
}
|
|
84
|
+
// Determine relevant topics
|
|
85
|
+
const topicDetection = this.topicDetector.detectTopics(stack, patterns);
|
|
86
|
+
// Generate Q&A for each topic
|
|
87
|
+
const generated = [];
|
|
88
|
+
const skipped = [];
|
|
89
|
+
for (const topic of topicDetection.topics) {
|
|
90
|
+
try {
|
|
91
|
+
const entry = await this.generateQAForTopic(absolutePath, topic, stack, patterns, topicDetection);
|
|
92
|
+
if (entry) {
|
|
93
|
+
generated.push(entry);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
skipped.push(topic.slug);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
skipped.push(topic.slug);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Save generated Q&A
|
|
104
|
+
await this.saveQAEntries(absolutePath, generated, topicDetection);
|
|
105
|
+
return {
|
|
106
|
+
generated,
|
|
107
|
+
skipped,
|
|
108
|
+
topicDetection,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Search Q&A entries for a query
|
|
113
|
+
*/
|
|
114
|
+
async search(repoPath, query) {
|
|
115
|
+
const qaDir = path.join(repoPath, '.context', 'docs', 'qa');
|
|
116
|
+
if (!(await fs.pathExists(qaDir))) {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
const results = [];
|
|
120
|
+
const files = await fs.readdir(qaDir);
|
|
121
|
+
const queryLower = query.toLowerCase();
|
|
122
|
+
const queryWords = queryLower.split(/\s+/).filter((w) => w.length > 2);
|
|
123
|
+
for (const file of files) {
|
|
124
|
+
if (!file.endsWith('.md') || file === 'README.md')
|
|
125
|
+
continue;
|
|
126
|
+
try {
|
|
127
|
+
const content = await fs.readFile(path.join(qaDir, file), 'utf-8');
|
|
128
|
+
const entry = this.parseQAEntry(content, file);
|
|
129
|
+
if (!entry)
|
|
130
|
+
continue;
|
|
131
|
+
// Calculate relevance score
|
|
132
|
+
const { score, reason } = this.calculateRelevance(entry, queryLower, queryWords);
|
|
133
|
+
if (score > 0) {
|
|
134
|
+
results.push({
|
|
135
|
+
entry,
|
|
136
|
+
score,
|
|
137
|
+
matchReason: reason,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Skip files that can't be read
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Sort by score descending
|
|
146
|
+
results.sort((a, b) => b.score - a.score);
|
|
147
|
+
return results.slice(0, 10);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get all Q&A entries
|
|
151
|
+
*/
|
|
152
|
+
async getAll(repoPath) {
|
|
153
|
+
const qaDir = path.join(repoPath, '.context', 'docs', 'qa');
|
|
154
|
+
if (!(await fs.pathExists(qaDir))) {
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
const entries = [];
|
|
158
|
+
const files = await fs.readdir(qaDir);
|
|
159
|
+
for (const file of files) {
|
|
160
|
+
if (!file.endsWith('.md') || file === 'README.md')
|
|
161
|
+
continue;
|
|
162
|
+
try {
|
|
163
|
+
const content = await fs.readFile(path.join(qaDir, file), 'utf-8');
|
|
164
|
+
const entry = this.parseQAEntry(content, file);
|
|
165
|
+
if (entry) {
|
|
166
|
+
entries.push(entry);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// Skip files that can't be read
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return entries;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get a specific Q&A entry by slug
|
|
177
|
+
*/
|
|
178
|
+
async getBySlug(repoPath, slug) {
|
|
179
|
+
const qaFile = path.join(repoPath, '.context', 'docs', 'qa', `${slug}.md`);
|
|
180
|
+
if (!(await fs.pathExists(qaFile))) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
const content = await fs.readFile(qaFile, 'utf-8');
|
|
185
|
+
return this.parseQAEntry(content, `${slug}.md`);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Generate Q&A entry for a specific topic
|
|
193
|
+
*/
|
|
194
|
+
async generateQAForTopic(repoPath, topic, stack, patterns, topicResult) {
|
|
195
|
+
const relevantFiles = [];
|
|
196
|
+
let answer = '';
|
|
197
|
+
switch (topic.slug) {
|
|
198
|
+
case 'getting-started':
|
|
199
|
+
answer = this.generateGettingStartedAnswer(stack, repoPath);
|
|
200
|
+
break;
|
|
201
|
+
case 'project-structure':
|
|
202
|
+
answer = await this.generateProjectStructureAnswer(repoPath, stack);
|
|
203
|
+
relevantFiles.push(...(await this.findRelevantFiles(repoPath, ['src/', 'lib/', 'app/'])));
|
|
204
|
+
break;
|
|
205
|
+
case 'cli-commands':
|
|
206
|
+
answer = this.generateCLICommandsAnswer(stack);
|
|
207
|
+
relevantFiles.push(...(await this.findRelevantFiles(repoPath, ['bin/', 'cli', 'commands/'])));
|
|
208
|
+
break;
|
|
209
|
+
case 'cli-arguments':
|
|
210
|
+
answer = this.generateCLIArgumentsAnswer(stack);
|
|
211
|
+
break;
|
|
212
|
+
case 'routing':
|
|
213
|
+
answer = await this.generateRoutingAnswer(repoPath, stack, patterns);
|
|
214
|
+
relevantFiles.push(...(await this.findRelevantFiles(repoPath, ['routes/', 'api/', 'pages/'])));
|
|
215
|
+
break;
|
|
216
|
+
case 'middleware':
|
|
217
|
+
answer = await this.generateMiddlewareAnswer(repoPath, patterns);
|
|
218
|
+
relevantFiles.push(...(await this.findRelevantFiles(repoPath, ['middleware/', 'middlewares/'])));
|
|
219
|
+
break;
|
|
220
|
+
case 'authentication':
|
|
221
|
+
answer = this.generateAuthAnswer(patterns);
|
|
222
|
+
relevantFiles.push(...this.getPatternFiles(patterns, 'auth', repoPath));
|
|
223
|
+
break;
|
|
224
|
+
case 'database':
|
|
225
|
+
answer = this.generateDatabaseAnswer(patterns);
|
|
226
|
+
relevantFiles.push(...this.getPatternFiles(patterns, 'database', repoPath));
|
|
227
|
+
break;
|
|
228
|
+
case 'api-endpoints':
|
|
229
|
+
answer = await this.generateAPIEndpointsAnswer(repoPath, patterns);
|
|
230
|
+
relevantFiles.push(...this.getPatternFiles(patterns, 'api', repoPath));
|
|
231
|
+
break;
|
|
232
|
+
case 'testing':
|
|
233
|
+
answer = this.generateTestingAnswer(stack, patterns);
|
|
234
|
+
relevantFiles.push(...(await this.findRelevantFiles(repoPath, ['test/', 'tests/', '__tests__/', '*.test.', '*.spec.'])));
|
|
235
|
+
break;
|
|
236
|
+
case 'error-handling':
|
|
237
|
+
answer = this.generateErrorHandlingAnswer(patterns);
|
|
238
|
+
relevantFiles.push(...this.getPatternFiles(patterns, 'error-handling', repoPath));
|
|
239
|
+
break;
|
|
240
|
+
case 'caching':
|
|
241
|
+
answer = this.generateCachingAnswer(patterns);
|
|
242
|
+
relevantFiles.push(...this.getPatternFiles(patterns, 'cache', repoPath));
|
|
243
|
+
break;
|
|
244
|
+
case 'realtime':
|
|
245
|
+
answer = this.generateRealtimeAnswer(patterns);
|
|
246
|
+
relevantFiles.push(...this.getPatternFiles(patterns, 'websocket', repoPath));
|
|
247
|
+
break;
|
|
248
|
+
case 'background-jobs':
|
|
249
|
+
answer = this.generateBackgroundJobsAnswer(patterns);
|
|
250
|
+
relevantFiles.push(...this.getPatternFiles(patterns, 'queue', repoPath));
|
|
251
|
+
break;
|
|
252
|
+
case 'deployment':
|
|
253
|
+
answer = this.generateDeploymentAnswer(stack);
|
|
254
|
+
relevantFiles.push(...(await this.findRelevantFiles(repoPath, ['Dockerfile', 'docker-compose', '.github/workflows/'])));
|
|
255
|
+
break;
|
|
256
|
+
default:
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
if (!answer)
|
|
260
|
+
return null;
|
|
261
|
+
return {
|
|
262
|
+
slug: topic.slug,
|
|
263
|
+
question: topic.question,
|
|
264
|
+
answer,
|
|
265
|
+
category: topic.category,
|
|
266
|
+
generatedAt: new Date().toISOString(),
|
|
267
|
+
relevantFiles: [...new Set(relevantFiles)].slice(0, 10),
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
// Answer generation methods
|
|
271
|
+
generateGettingStartedAnswer(stack, repoPath) {
|
|
272
|
+
const lines = [];
|
|
273
|
+
lines.push('## Getting Started\n');
|
|
274
|
+
// Prerequisites
|
|
275
|
+
lines.push('### Prerequisites\n');
|
|
276
|
+
if (stack.primaryLanguage === 'typescript' || stack.primaryLanguage === 'javascript') {
|
|
277
|
+
lines.push('- Node.js (LTS version recommended)');
|
|
278
|
+
if (stack.packageManager) {
|
|
279
|
+
lines.push(`- ${stack.packageManager}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
else if (stack.primaryLanguage === 'python') {
|
|
283
|
+
lines.push('- Python 3.8+');
|
|
284
|
+
if (stack.packageManager === 'poetry') {
|
|
285
|
+
lines.push('- Poetry');
|
|
286
|
+
}
|
|
287
|
+
else if (stack.packageManager === 'pipenv') {
|
|
288
|
+
lines.push('- Pipenv');
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
lines.push('');
|
|
292
|
+
// Installation
|
|
293
|
+
lines.push('### Installation\n');
|
|
294
|
+
lines.push('```bash');
|
|
295
|
+
lines.push('# Clone the repository');
|
|
296
|
+
lines.push('git clone <repository-url>');
|
|
297
|
+
lines.push(`cd ${path.basename(repoPath)}`);
|
|
298
|
+
lines.push('');
|
|
299
|
+
// Install dependencies
|
|
300
|
+
if (stack.packageManager === 'yarn') {
|
|
301
|
+
lines.push('# Install dependencies');
|
|
302
|
+
lines.push('yarn install');
|
|
303
|
+
}
|
|
304
|
+
else if (stack.packageManager === 'pnpm') {
|
|
305
|
+
lines.push('# Install dependencies');
|
|
306
|
+
lines.push('pnpm install');
|
|
307
|
+
}
|
|
308
|
+
else if (stack.packageManager === 'bun') {
|
|
309
|
+
lines.push('# Install dependencies');
|
|
310
|
+
lines.push('bun install');
|
|
311
|
+
}
|
|
312
|
+
else if (stack.primaryLanguage === 'typescript' || stack.primaryLanguage === 'javascript') {
|
|
313
|
+
lines.push('# Install dependencies');
|
|
314
|
+
lines.push('npm install');
|
|
315
|
+
}
|
|
316
|
+
else if (stack.packageManager === 'poetry') {
|
|
317
|
+
lines.push('# Install dependencies');
|
|
318
|
+
lines.push('poetry install');
|
|
319
|
+
}
|
|
320
|
+
else if (stack.packageManager === 'pipenv') {
|
|
321
|
+
lines.push('# Install dependencies');
|
|
322
|
+
lines.push('pipenv install');
|
|
323
|
+
}
|
|
324
|
+
else if (stack.primaryLanguage === 'python') {
|
|
325
|
+
lines.push('# Install dependencies');
|
|
326
|
+
lines.push('pip install -r requirements.txt');
|
|
327
|
+
}
|
|
328
|
+
lines.push('```\n');
|
|
329
|
+
// Running
|
|
330
|
+
lines.push('### Running\n');
|
|
331
|
+
lines.push('```bash');
|
|
332
|
+
if (stack.buildTools.includes('vite')) {
|
|
333
|
+
lines.push('# Development');
|
|
334
|
+
lines.push('npm run dev');
|
|
335
|
+
}
|
|
336
|
+
else if (stack.frameworks.includes('nextjs')) {
|
|
337
|
+
lines.push('# Development');
|
|
338
|
+
lines.push('npm run dev');
|
|
339
|
+
}
|
|
340
|
+
else if (stack.frameworks.includes('express') || stack.frameworks.includes('nestjs') || stack.frameworks.includes('fastify')) {
|
|
341
|
+
lines.push('# Development');
|
|
342
|
+
lines.push('npm run dev');
|
|
343
|
+
lines.push('');
|
|
344
|
+
lines.push('# Production');
|
|
345
|
+
lines.push('npm run build && npm start');
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
lines.push('# See package.json for available scripts');
|
|
349
|
+
lines.push('npm run <script-name>');
|
|
350
|
+
}
|
|
351
|
+
lines.push('```');
|
|
352
|
+
return lines.join('\n');
|
|
353
|
+
}
|
|
354
|
+
async generateProjectStructureAnswer(repoPath, stack) {
|
|
355
|
+
const lines = [];
|
|
356
|
+
lines.push('## Project Structure\n');
|
|
357
|
+
// Try to read actual directory structure
|
|
358
|
+
try {
|
|
359
|
+
const entries = await fs.readdir(repoPath, { withFileTypes: true });
|
|
360
|
+
const dirs = entries
|
|
361
|
+
.filter((e) => e.isDirectory() && !e.name.startsWith('.') && e.name !== 'node_modules')
|
|
362
|
+
.map((e) => e.name)
|
|
363
|
+
.slice(0, 15);
|
|
364
|
+
if (dirs.length > 0) {
|
|
365
|
+
lines.push('```');
|
|
366
|
+
for (const dir of dirs) {
|
|
367
|
+
lines.push(`${dir}/`);
|
|
368
|
+
}
|
|
369
|
+
lines.push('```\n');
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
// Ignore errors
|
|
374
|
+
}
|
|
375
|
+
// Add framework-specific structure hints
|
|
376
|
+
if (stack.frameworks.includes('nextjs')) {
|
|
377
|
+
lines.push('### Next.js Structure\n');
|
|
378
|
+
lines.push('- `app/` or `pages/` - Routes and pages');
|
|
379
|
+
lines.push('- `components/` - Reusable UI components');
|
|
380
|
+
lines.push('- `lib/` - Utility functions');
|
|
381
|
+
lines.push('- `public/` - Static assets');
|
|
382
|
+
}
|
|
383
|
+
else if (stack.frameworks.includes('nestjs')) {
|
|
384
|
+
lines.push('### NestJS Structure\n');
|
|
385
|
+
lines.push('- `src/` - Source code');
|
|
386
|
+
lines.push(' - `modules/` - Feature modules');
|
|
387
|
+
lines.push(' - `common/` - Shared code');
|
|
388
|
+
lines.push(' - `main.ts` - Application entry');
|
|
389
|
+
}
|
|
390
|
+
else if (stack.frameworks.includes('express')) {
|
|
391
|
+
lines.push('### Express Structure\n');
|
|
392
|
+
lines.push('- `src/` - Source code');
|
|
393
|
+
lines.push('- `routes/` - Route handlers');
|
|
394
|
+
lines.push('- `middleware/` - Express middleware');
|
|
395
|
+
lines.push('- `controllers/` - Request handlers');
|
|
396
|
+
}
|
|
397
|
+
return lines.join('\n');
|
|
398
|
+
}
|
|
399
|
+
generateCLICommandsAnswer(stack) {
|
|
400
|
+
const lines = [];
|
|
401
|
+
lines.push('## CLI Commands\n');
|
|
402
|
+
if (stack.cliLibraries?.includes('commander')) {
|
|
403
|
+
lines.push('This CLI is built with Commander.js.\n');
|
|
404
|
+
lines.push('Run `<command> --help` to see available commands and options.\n');
|
|
405
|
+
}
|
|
406
|
+
else if (stack.cliLibraries?.includes('yargs')) {
|
|
407
|
+
lines.push('This CLI is built with Yargs.\n');
|
|
408
|
+
lines.push('Run `<command> --help` to see available commands and options.\n');
|
|
409
|
+
}
|
|
410
|
+
else if (stack.cliLibraries?.includes('oclif')) {
|
|
411
|
+
lines.push('This CLI is built with oclif.\n');
|
|
412
|
+
lines.push('Run `<command> help` to see available commands.\n');
|
|
413
|
+
}
|
|
414
|
+
lines.push('### Common Commands\n');
|
|
415
|
+
lines.push('See the documentation or source code for specific commands.');
|
|
416
|
+
return lines.join('\n');
|
|
417
|
+
}
|
|
418
|
+
generateCLIArgumentsAnswer(stack) {
|
|
419
|
+
const lines = [];
|
|
420
|
+
lines.push('## CLI Arguments and Options\n');
|
|
421
|
+
if (stack.cliLibraries?.includes('commander')) {
|
|
422
|
+
lines.push('### Commander.js Pattern\n');
|
|
423
|
+
lines.push('```bash');
|
|
424
|
+
lines.push('command [options] <required-arg> [optional-arg]');
|
|
425
|
+
lines.push('```\n');
|
|
426
|
+
lines.push('- Options: `--flag` or `-f`');
|
|
427
|
+
lines.push('- Option with value: `--name <value>`');
|
|
428
|
+
}
|
|
429
|
+
else if (stack.cliLibraries?.includes('yargs')) {
|
|
430
|
+
lines.push('### Yargs Pattern\n');
|
|
431
|
+
lines.push('```bash');
|
|
432
|
+
lines.push('command <positional> --flag --option=value');
|
|
433
|
+
lines.push('```');
|
|
434
|
+
}
|
|
435
|
+
return lines.join('\n');
|
|
436
|
+
}
|
|
437
|
+
async generateRoutingAnswer(repoPath, stack, patterns) {
|
|
438
|
+
const lines = [];
|
|
439
|
+
lines.push('## Routing\n');
|
|
440
|
+
if (stack.frameworks.includes('nextjs')) {
|
|
441
|
+
lines.push('### Next.js App Router\n');
|
|
442
|
+
lines.push('Routes are defined by the folder structure in `app/`:\n');
|
|
443
|
+
lines.push('- `app/page.tsx` → `/`');
|
|
444
|
+
lines.push('- `app/about/page.tsx` → `/about`');
|
|
445
|
+
lines.push('- `app/blog/[slug]/page.tsx` → `/blog/:slug`');
|
|
446
|
+
}
|
|
447
|
+
else if (stack.frameworks.includes('express') || stack.frameworks.includes('fastify')) {
|
|
448
|
+
lines.push(`### ${stack.frameworks.includes('express') ? 'Express' : 'Fastify'} Routing\n`);
|
|
449
|
+
lines.push('Routes are typically defined in route files:\n');
|
|
450
|
+
lines.push('```typescript');
|
|
451
|
+
lines.push('router.get(\'/path\', handler);');
|
|
452
|
+
lines.push('router.post(\'/path\', handler);');
|
|
453
|
+
lines.push('```');
|
|
454
|
+
}
|
|
455
|
+
else if (stack.frameworks.includes('nestjs')) {
|
|
456
|
+
lines.push('### NestJS Routing\n');
|
|
457
|
+
lines.push('Routes are defined using decorators:\n');
|
|
458
|
+
lines.push('```typescript');
|
|
459
|
+
lines.push('@Controller(\'users\')');
|
|
460
|
+
lines.push('class UsersController {');
|
|
461
|
+
lines.push(' @Get()');
|
|
462
|
+
lines.push(' findAll() { }');
|
|
463
|
+
lines.push('}');
|
|
464
|
+
lines.push('```');
|
|
465
|
+
}
|
|
466
|
+
// Add API pattern indicators
|
|
467
|
+
if (patterns.hasApiPattern) {
|
|
468
|
+
const apiIndicators = patterns.patterns.find((p) => p.type === 'api')?.indicators;
|
|
469
|
+
if (apiIndicators?.length) {
|
|
470
|
+
lines.push('\n### Detected Route Files\n');
|
|
471
|
+
for (const ind of apiIndicators.slice(0, 5)) {
|
|
472
|
+
if (ind.file) {
|
|
473
|
+
lines.push(`- \`${path.relative(repoPath, ind.file)}\``);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
return lines.join('\n');
|
|
479
|
+
}
|
|
480
|
+
async generateMiddlewareAnswer(repoPath, patterns) {
|
|
481
|
+
const lines = [];
|
|
482
|
+
lines.push('## Middleware\n');
|
|
483
|
+
lines.push('Middleware functions process requests before they reach route handlers.\n');
|
|
484
|
+
if (patterns.hasAuthPattern) {
|
|
485
|
+
lines.push('### Authentication Middleware');
|
|
486
|
+
lines.push('The codebase includes authentication middleware.');
|
|
487
|
+
}
|
|
488
|
+
if (patterns.hasValidationPattern) {
|
|
489
|
+
lines.push('\n### Validation Middleware');
|
|
490
|
+
lines.push('Request validation is implemented using middleware.');
|
|
491
|
+
}
|
|
492
|
+
if (patterns.hasLoggingPattern) {
|
|
493
|
+
lines.push('\n### Logging Middleware');
|
|
494
|
+
lines.push('Request logging is handled by middleware.');
|
|
495
|
+
}
|
|
496
|
+
return lines.join('\n');
|
|
497
|
+
}
|
|
498
|
+
generateAuthAnswer(patterns) {
|
|
499
|
+
const lines = [];
|
|
500
|
+
lines.push('## Authentication\n');
|
|
501
|
+
const authPattern = patterns.patterns.find((p) => p.type === 'auth');
|
|
502
|
+
if (!authPattern) {
|
|
503
|
+
lines.push('Authentication patterns detected in the codebase.');
|
|
504
|
+
return lines.join('\n');
|
|
505
|
+
}
|
|
506
|
+
lines.push('### Implementation Details\n');
|
|
507
|
+
for (const ind of authPattern.indicators.slice(0, 5)) {
|
|
508
|
+
lines.push(`- ${ind.reason}`);
|
|
509
|
+
}
|
|
510
|
+
return lines.join('\n');
|
|
511
|
+
}
|
|
512
|
+
generateDatabaseAnswer(patterns) {
|
|
513
|
+
const lines = [];
|
|
514
|
+
lines.push('## Database\n');
|
|
515
|
+
const dbPattern = patterns.patterns.find((p) => p.type === 'database');
|
|
516
|
+
if (!dbPattern) {
|
|
517
|
+
lines.push('Database patterns detected in the codebase.');
|
|
518
|
+
return lines.join('\n');
|
|
519
|
+
}
|
|
520
|
+
lines.push('### Implementation Details\n');
|
|
521
|
+
for (const ind of dbPattern.indicators.slice(0, 5)) {
|
|
522
|
+
lines.push(`- ${ind.reason}`);
|
|
523
|
+
}
|
|
524
|
+
return lines.join('\n');
|
|
525
|
+
}
|
|
526
|
+
async generateAPIEndpointsAnswer(repoPath, patterns) {
|
|
527
|
+
const lines = [];
|
|
528
|
+
lines.push('## API Endpoints\n');
|
|
529
|
+
const apiPattern = patterns.patterns.find((p) => p.type === 'api');
|
|
530
|
+
if (!apiPattern) {
|
|
531
|
+
lines.push('API patterns detected in the codebase.');
|
|
532
|
+
return lines.join('\n');
|
|
533
|
+
}
|
|
534
|
+
lines.push('### Detected API Files\n');
|
|
535
|
+
for (const ind of apiPattern.indicators.slice(0, 8)) {
|
|
536
|
+
if (ind.file) {
|
|
537
|
+
lines.push(`- \`${path.relative(repoPath, ind.file)}\` - ${ind.reason}`);
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
return lines.join('\n');
|
|
541
|
+
}
|
|
542
|
+
generateTestingAnswer(stack, patterns) {
|
|
543
|
+
const lines = [];
|
|
544
|
+
lines.push('## Testing\n');
|
|
545
|
+
if (stack.testFrameworks.length > 0) {
|
|
546
|
+
lines.push(`### Test Frameworks: ${stack.testFrameworks.join(', ')}\n`);
|
|
547
|
+
}
|
|
548
|
+
lines.push('### Running Tests\n');
|
|
549
|
+
lines.push('```bash');
|
|
550
|
+
if (stack.testFrameworks.includes('jest')) {
|
|
551
|
+
lines.push('npm test');
|
|
552
|
+
lines.push('npm test -- --watch');
|
|
553
|
+
lines.push('npm test -- --coverage');
|
|
554
|
+
}
|
|
555
|
+
else if (stack.testFrameworks.includes('vitest')) {
|
|
556
|
+
lines.push('npm test');
|
|
557
|
+
lines.push('npm test -- --watch');
|
|
558
|
+
}
|
|
559
|
+
else if (stack.testFrameworks.includes('pytest')) {
|
|
560
|
+
lines.push('pytest');
|
|
561
|
+
lines.push('pytest --cov');
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
lines.push('npm test');
|
|
565
|
+
}
|
|
566
|
+
lines.push('```');
|
|
567
|
+
return lines.join('\n');
|
|
568
|
+
}
|
|
569
|
+
generateErrorHandlingAnswer(patterns) {
|
|
570
|
+
const lines = [];
|
|
571
|
+
lines.push('## Error Handling\n');
|
|
572
|
+
const errorPattern = patterns.patterns.find((p) => p.type === 'error-handling');
|
|
573
|
+
if (!errorPattern) {
|
|
574
|
+
lines.push('Error handling patterns detected in the codebase.');
|
|
575
|
+
return lines.join('\n');
|
|
576
|
+
}
|
|
577
|
+
lines.push('### Implementation Details\n');
|
|
578
|
+
for (const ind of errorPattern.indicators.slice(0, 5)) {
|
|
579
|
+
lines.push(`- ${ind.reason}`);
|
|
580
|
+
}
|
|
581
|
+
return lines.join('\n');
|
|
582
|
+
}
|
|
583
|
+
generateCachingAnswer(patterns) {
|
|
584
|
+
const lines = [];
|
|
585
|
+
lines.push('## Caching\n');
|
|
586
|
+
const cachePattern = patterns.patterns.find((p) => p.type === 'cache');
|
|
587
|
+
if (!cachePattern) {
|
|
588
|
+
lines.push('Caching patterns detected in the codebase.');
|
|
589
|
+
return lines.join('\n');
|
|
590
|
+
}
|
|
591
|
+
lines.push('### Implementation Details\n');
|
|
592
|
+
for (const ind of cachePattern.indicators.slice(0, 5)) {
|
|
593
|
+
lines.push(`- ${ind.reason}`);
|
|
594
|
+
}
|
|
595
|
+
return lines.join('\n');
|
|
596
|
+
}
|
|
597
|
+
generateRealtimeAnswer(patterns) {
|
|
598
|
+
const lines = [];
|
|
599
|
+
lines.push('## Real-time Features\n');
|
|
600
|
+
const wsPattern = patterns.patterns.find((p) => p.type === 'websocket');
|
|
601
|
+
if (!wsPattern) {
|
|
602
|
+
lines.push('WebSocket patterns detected in the codebase.');
|
|
603
|
+
return lines.join('\n');
|
|
604
|
+
}
|
|
605
|
+
lines.push('### Implementation Details\n');
|
|
606
|
+
for (const ind of wsPattern.indicators.slice(0, 5)) {
|
|
607
|
+
lines.push(`- ${ind.reason}`);
|
|
608
|
+
}
|
|
609
|
+
return lines.join('\n');
|
|
610
|
+
}
|
|
611
|
+
generateBackgroundJobsAnswer(patterns) {
|
|
612
|
+
const lines = [];
|
|
613
|
+
lines.push('## Background Jobs\n');
|
|
614
|
+
const queuePattern = patterns.patterns.find((p) => p.type === 'queue');
|
|
615
|
+
if (!queuePattern) {
|
|
616
|
+
lines.push('Queue/job patterns detected in the codebase.');
|
|
617
|
+
return lines.join('\n');
|
|
618
|
+
}
|
|
619
|
+
lines.push('### Implementation Details\n');
|
|
620
|
+
for (const ind of queuePattern.indicators.slice(0, 5)) {
|
|
621
|
+
lines.push(`- ${ind.reason}`);
|
|
622
|
+
}
|
|
623
|
+
return lines.join('\n');
|
|
624
|
+
}
|
|
625
|
+
generateDeploymentAnswer(stack) {
|
|
626
|
+
const lines = [];
|
|
627
|
+
lines.push('## Deployment\n');
|
|
628
|
+
if (stack.hasDocker) {
|
|
629
|
+
lines.push('### Docker\n');
|
|
630
|
+
lines.push('This project includes Docker configuration.\n');
|
|
631
|
+
lines.push('```bash');
|
|
632
|
+
lines.push('docker build -t app .');
|
|
633
|
+
lines.push('docker run -p 3000:3000 app');
|
|
634
|
+
lines.push('```\n');
|
|
635
|
+
}
|
|
636
|
+
if (stack.hasCI) {
|
|
637
|
+
lines.push('### CI/CD\n');
|
|
638
|
+
lines.push('CI/CD pipelines are configured for this project.');
|
|
639
|
+
lines.push('Check `.github/workflows/` or equivalent for pipeline configuration.');
|
|
640
|
+
}
|
|
641
|
+
return lines.join('\n');
|
|
642
|
+
}
|
|
643
|
+
// Helper methods
|
|
644
|
+
getPatternFiles(patterns, type, repoPath) {
|
|
645
|
+
const pattern = patterns.patterns.find((p) => p.type === type);
|
|
646
|
+
if (!pattern)
|
|
647
|
+
return [];
|
|
648
|
+
return pattern.indicators
|
|
649
|
+
.filter((i) => i.file)
|
|
650
|
+
.map((i) => path.relative(repoPath, i.file))
|
|
651
|
+
.slice(0, 5);
|
|
652
|
+
}
|
|
653
|
+
async findRelevantFiles(repoPath, patterns) {
|
|
654
|
+
const results = [];
|
|
655
|
+
const excludeDirs = ['node_modules', '.git', 'dist', 'build', '.next', '.nuxt', 'coverage', '__pycache__', 'vendor'];
|
|
656
|
+
try {
|
|
657
|
+
const entries = await fs.readdir(repoPath, { withFileTypes: true, recursive: true });
|
|
658
|
+
for (const entry of entries) {
|
|
659
|
+
const relativePath = path.relative(repoPath, path.join(entry.parentPath || '', entry.name));
|
|
660
|
+
// Skip excluded directories
|
|
661
|
+
if (excludeDirs.some((dir) => relativePath.startsWith(dir + path.sep) || relativePath === dir)) {
|
|
662
|
+
continue;
|
|
663
|
+
}
|
|
664
|
+
for (const pattern of patterns) {
|
|
665
|
+
if (relativePath.includes(pattern)) {
|
|
666
|
+
results.push(relativePath);
|
|
667
|
+
break;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
if (results.length >= 10)
|
|
671
|
+
break;
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
catch {
|
|
675
|
+
// Ignore errors
|
|
676
|
+
}
|
|
677
|
+
return results;
|
|
678
|
+
}
|
|
679
|
+
async saveQAEntries(repoPath, entries, topicResult) {
|
|
680
|
+
const qaDir = path.join(repoPath, '.context', 'docs', 'qa');
|
|
681
|
+
await fs.ensureDir(qaDir);
|
|
682
|
+
// Save individual entries
|
|
683
|
+
for (const entry of entries) {
|
|
684
|
+
const content = this.formatQAEntry(entry);
|
|
685
|
+
await fs.writeFile(path.join(qaDir, `${entry.slug}.md`), content);
|
|
686
|
+
}
|
|
687
|
+
// Generate README index
|
|
688
|
+
const readme = this.generateQAReadme(entries, topicResult);
|
|
689
|
+
await fs.writeFile(path.join(qaDir, 'README.md'), readme);
|
|
690
|
+
}
|
|
691
|
+
formatQAEntry(entry) {
|
|
692
|
+
const lines = [];
|
|
693
|
+
lines.push('---');
|
|
694
|
+
lines.push(`slug: ${entry.slug}`);
|
|
695
|
+
lines.push(`category: ${entry.category}`);
|
|
696
|
+
lines.push(`generatedAt: ${entry.generatedAt}`);
|
|
697
|
+
if (entry.relevantFiles.length > 0) {
|
|
698
|
+
lines.push(`relevantFiles:`);
|
|
699
|
+
for (const file of entry.relevantFiles) {
|
|
700
|
+
lines.push(` - ${file}`);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
lines.push('---\n');
|
|
704
|
+
lines.push(`# ${entry.question}\n`);
|
|
705
|
+
lines.push(entry.answer);
|
|
706
|
+
return lines.join('\n');
|
|
707
|
+
}
|
|
708
|
+
generateQAReadme(entries, topicResult) {
|
|
709
|
+
const lines = [];
|
|
710
|
+
lines.push('# Q&A Index\n');
|
|
711
|
+
lines.push(`Project type: **${topicResult.projectType}**\n`);
|
|
712
|
+
lines.push(`Generated: ${new Date().toISOString()}\n`);
|
|
713
|
+
// Group by category
|
|
714
|
+
const byCategory = new Map();
|
|
715
|
+
for (const entry of entries) {
|
|
716
|
+
if (!byCategory.has(entry.category)) {
|
|
717
|
+
byCategory.set(entry.category, []);
|
|
718
|
+
}
|
|
719
|
+
byCategory.get(entry.category).push(entry);
|
|
720
|
+
}
|
|
721
|
+
for (const [category, catEntries] of byCategory) {
|
|
722
|
+
lines.push(`## ${category.charAt(0).toUpperCase() + category.slice(1)}\n`);
|
|
723
|
+
for (const entry of catEntries) {
|
|
724
|
+
lines.push(`- [${entry.question}](./${entry.slug}.md)`);
|
|
725
|
+
}
|
|
726
|
+
lines.push('');
|
|
727
|
+
}
|
|
728
|
+
return lines.join('\n');
|
|
729
|
+
}
|
|
730
|
+
parseQAEntry(content, filename) {
|
|
731
|
+
try {
|
|
732
|
+
const slug = filename.replace('.md', '');
|
|
733
|
+
// Parse frontmatter
|
|
734
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
735
|
+
let category = 'general';
|
|
736
|
+
let generatedAt = '';
|
|
737
|
+
const relevantFiles = [];
|
|
738
|
+
if (frontmatterMatch) {
|
|
739
|
+
const fm = frontmatterMatch[1];
|
|
740
|
+
const categoryMatch = fm.match(/category:\s*(.+)/);
|
|
741
|
+
if (categoryMatch)
|
|
742
|
+
category = categoryMatch[1].trim();
|
|
743
|
+
const dateMatch = fm.match(/generatedAt:\s*(.+)/);
|
|
744
|
+
if (dateMatch)
|
|
745
|
+
generatedAt = dateMatch[1].trim();
|
|
746
|
+
const filesMatch = fm.match(/relevantFiles:\n([\s\S]*?)(?=\n\w|$)/);
|
|
747
|
+
if (filesMatch) {
|
|
748
|
+
const files = filesMatch[1].match(/- (.+)/g);
|
|
749
|
+
if (files) {
|
|
750
|
+
relevantFiles.push(...files.map((f) => f.replace('- ', '').trim()));
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
// Parse question from first heading
|
|
755
|
+
const questionMatch = content.match(/^#\s+(.+)/m);
|
|
756
|
+
const question = questionMatch ? questionMatch[1] : slug;
|
|
757
|
+
// Get answer (everything after the first heading)
|
|
758
|
+
const answerStart = content.indexOf('\n', content.indexOf('# '));
|
|
759
|
+
const answer = answerStart > 0 ? content.slice(answerStart).trim() : '';
|
|
760
|
+
return {
|
|
761
|
+
slug,
|
|
762
|
+
question,
|
|
763
|
+
answer,
|
|
764
|
+
category,
|
|
765
|
+
generatedAt,
|
|
766
|
+
relevantFiles,
|
|
767
|
+
};
|
|
768
|
+
}
|
|
769
|
+
catch {
|
|
770
|
+
return null;
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
calculateRelevance(entry, queryLower, queryWords) {
|
|
774
|
+
let score = 0;
|
|
775
|
+
const reasons = [];
|
|
776
|
+
// Exact slug match
|
|
777
|
+
if (entry.slug.toLowerCase().includes(queryLower.replace(/\s+/g, '-'))) {
|
|
778
|
+
score += 10;
|
|
779
|
+
reasons.push('slug match');
|
|
780
|
+
}
|
|
781
|
+
// Question match
|
|
782
|
+
const questionLower = entry.question.toLowerCase();
|
|
783
|
+
if (questionLower.includes(queryLower)) {
|
|
784
|
+
score += 8;
|
|
785
|
+
reasons.push('question match');
|
|
786
|
+
}
|
|
787
|
+
// Word matches in question
|
|
788
|
+
for (const word of queryWords) {
|
|
789
|
+
if (questionLower.includes(word)) {
|
|
790
|
+
score += 2;
|
|
791
|
+
reasons.push(`word "${word}" in question`);
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
// Answer match
|
|
795
|
+
const answerLower = entry.answer.toLowerCase();
|
|
796
|
+
for (const word of queryWords) {
|
|
797
|
+
if (answerLower.includes(word)) {
|
|
798
|
+
score += 1;
|
|
799
|
+
reasons.push(`word "${word}" in answer`);
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
// Category match
|
|
803
|
+
if (entry.category.toLowerCase().includes(queryLower)) {
|
|
804
|
+
score += 3;
|
|
805
|
+
reasons.push('category match');
|
|
806
|
+
}
|
|
807
|
+
return {
|
|
808
|
+
score,
|
|
809
|
+
reason: reasons.slice(0, 3).join(', ') || 'partial match',
|
|
810
|
+
};
|
|
811
|
+
}
|
|
812
|
+
/**
|
|
813
|
+
* Load codebase-map.json if it exists
|
|
814
|
+
*/
|
|
815
|
+
async loadCodebaseMap(repoPath) {
|
|
816
|
+
const mapPath = path.join(repoPath, '.context', 'docs', 'codebase-map.json');
|
|
817
|
+
try {
|
|
818
|
+
if (await fs.pathExists(mapPath)) {
|
|
819
|
+
const content = await fs.readFile(mapPath, 'utf-8');
|
|
820
|
+
return JSON.parse(content);
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
catch {
|
|
824
|
+
// If loading fails, return null to fall back to full analysis
|
|
825
|
+
}
|
|
826
|
+
return null;
|
|
827
|
+
}
|
|
828
|
+
/**
|
|
829
|
+
* Convert codebase-map stack section to StackInfo format
|
|
830
|
+
*/
|
|
831
|
+
convertMapStackToStackInfo(map) {
|
|
832
|
+
// Infer CLI-related fields from symbols and architecture
|
|
833
|
+
const hasBinField = map.architecture.entryPoints.some((ep) => ep.startsWith('bin/'));
|
|
834
|
+
const cliLibraries = [];
|
|
835
|
+
// Check for CLI frameworks in the symbols
|
|
836
|
+
const allSymbols = [
|
|
837
|
+
...map.symbols.classes,
|
|
838
|
+
...map.symbols.functions,
|
|
839
|
+
];
|
|
840
|
+
if (allSymbols.some((s) => /commander|yargs|oclif|inquirer/i.test(s.name))) {
|
|
841
|
+
if (/commander/i.test(JSON.stringify(allSymbols)))
|
|
842
|
+
cliLibraries.push('commander');
|
|
843
|
+
if (/yargs/i.test(JSON.stringify(allSymbols)))
|
|
844
|
+
cliLibraries.push('yargs');
|
|
845
|
+
if (/oclif/i.test(JSON.stringify(allSymbols)))
|
|
846
|
+
cliLibraries.push('oclif');
|
|
847
|
+
}
|
|
848
|
+
return {
|
|
849
|
+
primaryLanguage: map.stack.primaryLanguage,
|
|
850
|
+
languages: map.stack.languages,
|
|
851
|
+
frameworks: map.stack.frameworks,
|
|
852
|
+
buildTools: map.stack.buildTools,
|
|
853
|
+
testFrameworks: map.stack.testFrameworks,
|
|
854
|
+
packageManager: map.stack.packageManager,
|
|
855
|
+
isMonorepo: map.stack.isMonorepo,
|
|
856
|
+
hasDocker: map.stack.hasDocker,
|
|
857
|
+
hasCI: map.stack.hasCI,
|
|
858
|
+
files: [], // Files are not stored in codebase-map, but not needed for Q&A generation
|
|
859
|
+
// Inferred fields
|
|
860
|
+
hasBinField,
|
|
861
|
+
cliLibraries,
|
|
862
|
+
hasMainExport: map.publicAPI.length > 0,
|
|
863
|
+
hasTypesField: map.symbols.types.length > 0,
|
|
864
|
+
};
|
|
865
|
+
}
|
|
866
|
+
/**
|
|
867
|
+
* Shutdown analyzer resources
|
|
868
|
+
*/
|
|
869
|
+
async shutdown() {
|
|
870
|
+
await this.analyzer.shutdown();
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
exports.QAService = QAService;
|
|
874
|
+
//# sourceMappingURL=qaService.js.map
|