spec-gen-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1078 -0
- package/dist/api/analyze.d.ts +17 -0
- package/dist/api/analyze.d.ts.map +1 -0
- package/dist/api/analyze.js +109 -0
- package/dist/api/analyze.js.map +1 -0
- package/dist/api/drift.d.ts +21 -0
- package/dist/api/drift.d.ts.map +1 -0
- package/dist/api/drift.js +145 -0
- package/dist/api/drift.js.map +1 -0
- package/dist/api/generate.d.ts +18 -0
- package/dist/api/generate.d.ts.map +1 -0
- package/dist/api/generate.js +251 -0
- package/dist/api/generate.js.map +1 -0
- package/dist/api/index.d.ts +39 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +32 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/init.d.ts +18 -0
- package/dist/api/init.d.ts.map +1 -0
- package/dist/api/init.js +82 -0
- package/dist/api/init.js.map +1 -0
- package/dist/api/run.d.ts +19 -0
- package/dist/api/run.d.ts.map +1 -0
- package/dist/api/run.js +291 -0
- package/dist/api/run.js.map +1 -0
- package/dist/api/specs.d.ts +49 -0
- package/dist/api/specs.d.ts.map +1 -0
- package/dist/api/specs.js +136 -0
- package/dist/api/specs.js.map +1 -0
- package/dist/api/types.d.ts +176 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +9 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/verify.d.ts +20 -0
- package/dist/api/verify.d.ts.map +1 -0
- package/dist/api/verify.js +117 -0
- package/dist/api/verify.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +27 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +485 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/drift.d.ts +9 -0
- package/dist/cli/commands/drift.d.ts.map +1 -0
- package/dist/cli/commands/drift.js +540 -0
- package/dist/cli/commands/drift.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +9 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +633 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +171 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +638 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +574 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/run.d.ts +24 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +546 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +9 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +417 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/commands/view.d.ts +9 -0
- package/dist/cli/commands/view.d.ts.map +1 -0
- package/dist/cli/commands/view.js +511 -0
- package/dist/cli/commands/view.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +83 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/analyzer/architecture-writer.d.ts +67 -0
- package/dist/core/analyzer/architecture-writer.d.ts.map +1 -0
- package/dist/core/analyzer/architecture-writer.js +209 -0
- package/dist/core/analyzer/architecture-writer.js.map +1 -0
- package/dist/core/analyzer/artifact-generator.d.ts +222 -0
- package/dist/core/analyzer/artifact-generator.d.ts.map +1 -0
- package/dist/core/analyzer/artifact-generator.js +726 -0
- package/dist/core/analyzer/artifact-generator.js.map +1 -0
- package/dist/core/analyzer/call-graph.d.ts +83 -0
- package/dist/core/analyzer/call-graph.d.ts.map +1 -0
- package/dist/core/analyzer/call-graph.js +827 -0
- package/dist/core/analyzer/call-graph.js.map +1 -0
- package/dist/core/analyzer/code-shaper.d.ts +33 -0
- package/dist/core/analyzer/code-shaper.d.ts.map +1 -0
- package/dist/core/analyzer/code-shaper.js +149 -0
- package/dist/core/analyzer/code-shaper.js.map +1 -0
- package/dist/core/analyzer/dependency-graph.d.ts +179 -0
- package/dist/core/analyzer/dependency-graph.d.ts.map +1 -0
- package/dist/core/analyzer/dependency-graph.js +574 -0
- package/dist/core/analyzer/dependency-graph.js.map +1 -0
- package/dist/core/analyzer/duplicate-detector.d.ts +52 -0
- package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -0
- package/dist/core/analyzer/duplicate-detector.js +279 -0
- package/dist/core/analyzer/duplicate-detector.js.map +1 -0
- package/dist/core/analyzer/embedding-service.d.ts +50 -0
- package/dist/core/analyzer/embedding-service.d.ts.map +1 -0
- package/dist/core/analyzer/embedding-service.js +104 -0
- package/dist/core/analyzer/embedding-service.js.map +1 -0
- package/dist/core/analyzer/file-walker.d.ts +78 -0
- package/dist/core/analyzer/file-walker.d.ts.map +1 -0
- package/dist/core/analyzer/file-walker.js +531 -0
- package/dist/core/analyzer/file-walker.js.map +1 -0
- package/dist/core/analyzer/import-parser.d.ts +91 -0
- package/dist/core/analyzer/import-parser.d.ts.map +1 -0
- package/dist/core/analyzer/import-parser.js +720 -0
- package/dist/core/analyzer/import-parser.js.map +1 -0
- package/dist/core/analyzer/index.d.ts +10 -0
- package/dist/core/analyzer/index.d.ts.map +1 -0
- package/dist/core/analyzer/index.js +10 -0
- package/dist/core/analyzer/index.js.map +1 -0
- package/dist/core/analyzer/refactor-analyzer.d.ts +80 -0
- package/dist/core/analyzer/refactor-analyzer.d.ts.map +1 -0
- package/dist/core/analyzer/refactor-analyzer.js +339 -0
- package/dist/core/analyzer/refactor-analyzer.js.map +1 -0
- package/dist/core/analyzer/repository-mapper.d.ts +150 -0
- package/dist/core/analyzer/repository-mapper.d.ts.map +1 -0
- package/dist/core/analyzer/repository-mapper.js +731 -0
- package/dist/core/analyzer/repository-mapper.js.map +1 -0
- package/dist/core/analyzer/signature-extractor.d.ts +31 -0
- package/dist/core/analyzer/signature-extractor.d.ts.map +1 -0
- package/dist/core/analyzer/signature-extractor.js +387 -0
- package/dist/core/analyzer/signature-extractor.js.map +1 -0
- package/dist/core/analyzer/significance-scorer.d.ts +79 -0
- package/dist/core/analyzer/significance-scorer.d.ts.map +1 -0
- package/dist/core/analyzer/significance-scorer.js +407 -0
- package/dist/core/analyzer/significance-scorer.js.map +1 -0
- package/dist/core/analyzer/subgraph-extractor.d.ts +43 -0
- package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -0
- package/dist/core/analyzer/subgraph-extractor.js +129 -0
- package/dist/core/analyzer/subgraph-extractor.js.map +1 -0
- package/dist/core/analyzer/vector-index.d.ts +63 -0
- package/dist/core/analyzer/vector-index.d.ts.map +1 -0
- package/dist/core/analyzer/vector-index.js +169 -0
- package/dist/core/analyzer/vector-index.js.map +1 -0
- package/dist/core/drift/drift-detector.d.ts +102 -0
- package/dist/core/drift/drift-detector.d.ts.map +1 -0
- package/dist/core/drift/drift-detector.js +597 -0
- package/dist/core/drift/drift-detector.js.map +1 -0
- package/dist/core/drift/git-diff.d.ts +55 -0
- package/dist/core/drift/git-diff.d.ts.map +1 -0
- package/dist/core/drift/git-diff.js +356 -0
- package/dist/core/drift/git-diff.js.map +1 -0
- package/dist/core/drift/index.d.ts +12 -0
- package/dist/core/drift/index.d.ts.map +1 -0
- package/dist/core/drift/index.js +9 -0
- package/dist/core/drift/index.js.map +1 -0
- package/dist/core/drift/spec-mapper.d.ts +73 -0
- package/dist/core/drift/spec-mapper.d.ts.map +1 -0
- package/dist/core/drift/spec-mapper.js +353 -0
- package/dist/core/drift/spec-mapper.js.map +1 -0
- package/dist/core/generator/adr-generator.d.ts +32 -0
- package/dist/core/generator/adr-generator.d.ts.map +1 -0
- package/dist/core/generator/adr-generator.js +192 -0
- package/dist/core/generator/adr-generator.js.map +1 -0
- package/dist/core/generator/index.d.ts +9 -0
- package/dist/core/generator/index.d.ts.map +1 -0
- package/dist/core/generator/index.js +12 -0
- package/dist/core/generator/index.js.map +1 -0
- package/dist/core/generator/mapping-generator.d.ts +54 -0
- package/dist/core/generator/mapping-generator.d.ts.map +1 -0
- package/dist/core/generator/mapping-generator.js +239 -0
- package/dist/core/generator/mapping-generator.js.map +1 -0
- package/dist/core/generator/openspec-compat.d.ts +160 -0
- package/dist/core/generator/openspec-compat.d.ts.map +1 -0
- package/dist/core/generator/openspec-compat.js +523 -0
- package/dist/core/generator/openspec-compat.js.map +1 -0
- package/dist/core/generator/openspec-format-generator.d.ts +111 -0
- package/dist/core/generator/openspec-format-generator.d.ts.map +1 -0
- package/dist/core/generator/openspec-format-generator.js +817 -0
- package/dist/core/generator/openspec-format-generator.js.map +1 -0
- package/dist/core/generator/openspec-writer.d.ts +131 -0
- package/dist/core/generator/openspec-writer.d.ts.map +1 -0
- package/dist/core/generator/openspec-writer.js +379 -0
- package/dist/core/generator/openspec-writer.js.map +1 -0
- package/dist/core/generator/prompts.d.ts +35 -0
- package/dist/core/generator/prompts.d.ts.map +1 -0
- package/dist/core/generator/prompts.js +212 -0
- package/dist/core/generator/prompts.js.map +1 -0
- package/dist/core/generator/spec-pipeline.d.ts +94 -0
- package/dist/core/generator/spec-pipeline.d.ts.map +1 -0
- package/dist/core/generator/spec-pipeline.js +474 -0
- package/dist/core/generator/spec-pipeline.js.map +1 -0
- package/dist/core/generator/stages/stage1-survey.d.ts +19 -0
- package/dist/core/generator/stages/stage1-survey.d.ts.map +1 -0
- package/dist/core/generator/stages/stage1-survey.js +105 -0
- package/dist/core/generator/stages/stage1-survey.js.map +1 -0
- package/dist/core/generator/stages/stage2-entities.d.ts +11 -0
- package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -0
- package/dist/core/generator/stages/stage2-entities.js +67 -0
- package/dist/core/generator/stages/stage2-entities.js.map +1 -0
- package/dist/core/generator/stages/stage3-services.d.ts +11 -0
- package/dist/core/generator/stages/stage3-services.d.ts.map +1 -0
- package/dist/core/generator/stages/stage3-services.js +75 -0
- package/dist/core/generator/stages/stage3-services.js.map +1 -0
- package/dist/core/generator/stages/stage4-api.d.ts +11 -0
- package/dist/core/generator/stages/stage4-api.d.ts.map +1 -0
- package/dist/core/generator/stages/stage4-api.js +65 -0
- package/dist/core/generator/stages/stage4-api.js.map +1 -0
- package/dist/core/generator/stages/stage5-architecture.d.ts +10 -0
- package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -0
- package/dist/core/generator/stages/stage5-architecture.js +62 -0
- package/dist/core/generator/stages/stage5-architecture.js.map +1 -0
- package/dist/core/generator/stages/stage6-adr.d.ts +8 -0
- package/dist/core/generator/stages/stage6-adr.d.ts.map +1 -0
- package/dist/core/generator/stages/stage6-adr.js +41 -0
- package/dist/core/generator/stages/stage6-adr.js.map +1 -0
- package/dist/core/services/chat-agent.d.ts +45 -0
- package/dist/core/services/chat-agent.d.ts.map +1 -0
- package/dist/core/services/chat-agent.js +310 -0
- package/dist/core/services/chat-agent.js.map +1 -0
- package/dist/core/services/chat-tools.d.ts +32 -0
- package/dist/core/services/chat-tools.d.ts.map +1 -0
- package/dist/core/services/chat-tools.js +270 -0
- package/dist/core/services/chat-tools.js.map +1 -0
- package/dist/core/services/config-manager.d.ts +61 -0
- package/dist/core/services/config-manager.d.ts.map +1 -0
- package/dist/core/services/config-manager.js +143 -0
- package/dist/core/services/config-manager.js.map +1 -0
- package/dist/core/services/gitignore-manager.d.ts +29 -0
- package/dist/core/services/gitignore-manager.d.ts.map +1 -0
- package/dist/core/services/gitignore-manager.js +106 -0
- package/dist/core/services/gitignore-manager.js.map +1 -0
- package/dist/core/services/index.d.ts +8 -0
- package/dist/core/services/index.d.ts.map +1 -0
- package/dist/core/services/index.js +8 -0
- package/dist/core/services/index.js.map +1 -0
- package/dist/core/services/llm-service.d.ts +336 -0
- package/dist/core/services/llm-service.d.ts.map +1 -0
- package/dist/core/services/llm-service.js +1155 -0
- package/dist/core/services/llm-service.js.map +1 -0
- package/dist/core/services/mcp-handlers/analysis.d.ts +42 -0
- package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/analysis.js +300 -0
- package/dist/core/services/mcp-handlers/analysis.js.map +1 -0
- package/dist/core/services/mcp-handlers/graph.d.ts +65 -0
- package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/graph.js +509 -0
- package/dist/core/services/mcp-handlers/graph.js.map +1 -0
- package/dist/core/services/mcp-handlers/semantic.d.ts +38 -0
- package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/semantic.js +172 -0
- package/dist/core/services/mcp-handlers/semantic.js.map +1 -0
- package/dist/core/services/mcp-handlers/utils.d.ts +21 -0
- package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/utils.js +62 -0
- package/dist/core/services/mcp-handlers/utils.js.map +1 -0
- package/dist/core/services/project-detector.d.ts +32 -0
- package/dist/core/services/project-detector.d.ts.map +1 -0
- package/dist/core/services/project-detector.js +111 -0
- package/dist/core/services/project-detector.js.map +1 -0
- package/dist/core/verifier/index.d.ts +5 -0
- package/dist/core/verifier/index.d.ts.map +1 -0
- package/dist/core/verifier/index.js +5 -0
- package/dist/core/verifier/index.js.map +1 -0
- package/dist/core/verifier/verification-engine.d.ts +226 -0
- package/dist/core/verifier/verification-engine.d.ts.map +1 -0
- package/dist/core/verifier/verification-engine.js +681 -0
- package/dist/core/verifier/verification-engine.js.map +1 -0
- package/dist/types/index.d.ts +252 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/pipeline.d.ts +148 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +5 -0
- package/dist/types/pipeline.js.map +1 -0
- package/dist/utils/errors.d.ts +51 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +128 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +149 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +331 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/progress.d.ts +142 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +280 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/prompts.d.ts +53 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +199 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/shutdown.d.ts +89 -0
- package/dist/utils/shutdown.d.ts.map +1 -0
- package/dist/utils/shutdown.js +237 -0
- package/dist/utils/shutdown.js.map +1 -0
- package/package.json +114 -0
- package/src/viewer/InteractiveGraphViewer.jsx +1486 -0
- package/src/viewer/app/index.html +17 -0
- package/src/viewer/app/main.jsx +13 -0
- package/src/viewer/components/ArchitectureView.jsx +177 -0
- package/src/viewer/components/ChatPanel.jsx +448 -0
- package/src/viewer/components/ClusterGraph.jsx +441 -0
- package/src/viewer/components/FilterBar.jsx +179 -0
- package/src/viewer/components/FlatGraph.jsx +275 -0
- package/src/viewer/components/MicroComponents.jsx +83 -0
- package/src/viewer/hooks/usePanZoom.js +79 -0
- package/src/viewer/utils/constants.js +47 -0
- package/src/viewer/utils/graph-helpers.js +291 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error classes for spec-gen with helpful user-facing messages
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Base error class for spec-gen with code and suggestion
|
|
6
|
+
*/
|
|
7
|
+
export class SpecGenError extends Error {
|
|
8
|
+
code;
|
|
9
|
+
suggestion;
|
|
10
|
+
constructor(message, code, suggestion) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.suggestion = suggestion;
|
|
14
|
+
this.name = 'SpecGenError';
|
|
15
|
+
// Maintains proper stack trace for where error was thrown
|
|
16
|
+
Error.captureStackTrace?.(this, this.constructor);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Format error for CLI display with color support
|
|
20
|
+
*/
|
|
21
|
+
format(useColor = true) {
|
|
22
|
+
const red = useColor ? '\x1b[31m' : '';
|
|
23
|
+
const yellow = useColor ? '\x1b[33m' : '';
|
|
24
|
+
const reset = useColor ? '\x1b[0m' : '';
|
|
25
|
+
const dim = useColor ? '\x1b[2m' : '';
|
|
26
|
+
let output = `${red}Error [${this.code}]:${reset} ${this.message}`;
|
|
27
|
+
if (this.suggestion) {
|
|
28
|
+
output += `\n\n${yellow}Suggestion:${reset} ${this.suggestion}`;
|
|
29
|
+
}
|
|
30
|
+
output += `\n\n${dim}For more help, see: https://github.com/clay-good/spec-gen#readme${reset}`;
|
|
31
|
+
return output;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Error factory functions with predefined messages and suggestions
|
|
36
|
+
*/
|
|
37
|
+
export const errors = {
|
|
38
|
+
noApiKey() {
|
|
39
|
+
return new SpecGenError('No API key found for LLM provider', 'NO_API_KEY', `Set ANTHROPIC_API_KEY or OPENAI_API_KEY environment variable.
|
|
40
|
+
Get an API key at https://console.anthropic.com/ or https://platform.openai.com/`);
|
|
41
|
+
},
|
|
42
|
+
notARepository() {
|
|
43
|
+
return new SpecGenError('No .git directory found', 'NOT_A_REPOSITORY', `spec-gen works best in git repositories.
|
|
44
|
+
Run 'git init' or use --force to continue anyway.`);
|
|
45
|
+
},
|
|
46
|
+
openspecExists(path) {
|
|
47
|
+
return new SpecGenError(`openspec/specs/ already contains specifications at ${path}`, 'OPENSPEC_EXISTS', `Use --merge to add to existing specs, or --force to overwrite.
|
|
48
|
+
Existing specs will be backed up to .spec-gen/backups/`);
|
|
49
|
+
},
|
|
50
|
+
analysisTooOld(ageHours) {
|
|
51
|
+
return new SpecGenError(`Existing analysis is ${ageHours.toFixed(1)} hours old`, 'ANALYSIS_TOO_OLD', `Run 'spec-gen analyze' to refresh, or use --reanalyze flag.`);
|
|
52
|
+
},
|
|
53
|
+
noHighValueFiles() {
|
|
54
|
+
return new SpecGenError('Could not identify any high-value files to analyze', 'NO_HIGH_VALUE_FILES', `This might happen with unusual project structures.
|
|
55
|
+
Try adjusting scoring in .spec-gen/config.json or use --include patterns.`);
|
|
56
|
+
},
|
|
57
|
+
llmRateLimit(attempt, maxAttempts) {
|
|
58
|
+
return new SpecGenError('API rate limit exceeded', 'LLM_RATE_LIMIT', `Waiting and retrying... (attempt ${attempt} of ${maxAttempts})
|
|
59
|
+
If this persists, try a different model or wait a few minutes.`);
|
|
60
|
+
},
|
|
61
|
+
openspecValidationFailed(details) {
|
|
62
|
+
return new SpecGenError(`Generated specs failed OpenSpec validation${details ? `: ${details}` : ''}`, 'OPENSPEC_VALIDATION_FAILED', `Check .spec-gen/logs/ for details.
|
|
63
|
+
This may indicate a generation bug - please report it at https://github.com/clay-good/spec-gen/issues`);
|
|
64
|
+
},
|
|
65
|
+
analysisFailed(reason) {
|
|
66
|
+
return new SpecGenError(`Static analysis failed: ${reason}`, 'ANALYSIS_FAILED', `Check that the project directory is accessible and contains source files.
|
|
67
|
+
Try running with --verbose for more details.`);
|
|
68
|
+
},
|
|
69
|
+
generationFailed(reason) {
|
|
70
|
+
return new SpecGenError(`Spec generation failed: ${reason}`, 'GENERATION_FAILED', `This could be due to API issues or invalid analysis data.
|
|
71
|
+
Try running 'spec-gen analyze' first, then 'spec-gen generate'.`);
|
|
72
|
+
},
|
|
73
|
+
verificationFailed(reason) {
|
|
74
|
+
return new SpecGenError(`Verification failed: ${reason}`, 'VERIFICATION_FAILED', `Ensure specs exist in openspec/specs/ directory.
|
|
75
|
+
Run 'spec-gen generate' first if you haven't already.`);
|
|
76
|
+
},
|
|
77
|
+
configNotFound(path) {
|
|
78
|
+
return new SpecGenError(`Configuration file not found at ${path}`, 'CONFIG_NOT_FOUND', `Run 'spec-gen init' to create a configuration file.`);
|
|
79
|
+
},
|
|
80
|
+
invalidConfig(path, details) {
|
|
81
|
+
return new SpecGenError(`Invalid configuration file at ${path}${details ? `: ${details}` : ''}`, 'INVALID_CONFIG', `Check the configuration file format. You may need to delete it and run 'spec-gen init' again.`);
|
|
82
|
+
},
|
|
83
|
+
fileWriteError(path, reason) {
|
|
84
|
+
return new SpecGenError(`Failed to write file ${path}${reason ? `: ${reason}` : ''}`, 'FILE_WRITE_ERROR', `Check that you have write permissions for the directory.`);
|
|
85
|
+
},
|
|
86
|
+
fileReadError(path, reason) {
|
|
87
|
+
return new SpecGenError(`Failed to read file ${path}${reason ? `: ${reason}` : ''}`, 'FILE_READ_ERROR', `Check that the file exists and you have read permissions.`);
|
|
88
|
+
},
|
|
89
|
+
driftDetected(issueCount) {
|
|
90
|
+
return new SpecGenError(`Spec drift detected: ${issueCount} issue${issueCount === 1 ? '' : 's'} found`, 'DRIFT_DETECTED', `Run 'spec-gen drift' to see details, then update specs to match code changes.
|
|
91
|
+
Use 'spec-gen drift --verbose' for detailed issue descriptions.`);
|
|
92
|
+
},
|
|
93
|
+
noSpecsFound() {
|
|
94
|
+
return new SpecGenError('No OpenSpec specifications found', 'NO_SPECS_FOUND', `Run 'spec-gen generate' to create specifications from your codebase.`);
|
|
95
|
+
},
|
|
96
|
+
unknown(error) {
|
|
97
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
98
|
+
return new SpecGenError(`An unexpected error occurred: ${message}`, 'UNKNOWN_ERROR', `Please report this issue at https://github.com/clay-good/spec-gen/issues`);
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Type guard to check if an error is a SpecGenError
|
|
103
|
+
*/
|
|
104
|
+
export function isSpecGenError(error) {
|
|
105
|
+
return error instanceof SpecGenError;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Format any error for CLI display
|
|
109
|
+
*/
|
|
110
|
+
export function formatError(error, useColor = true) {
|
|
111
|
+
if (isSpecGenError(error)) {
|
|
112
|
+
return error.format(useColor);
|
|
113
|
+
}
|
|
114
|
+
if (error instanceof Error) {
|
|
115
|
+
return errors.unknown(error).format(useColor);
|
|
116
|
+
}
|
|
117
|
+
return errors.unknown(String(error)).format(useColor);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Handle errors in CLI commands by formatting and logging them
|
|
121
|
+
*/
|
|
122
|
+
export function handleError(error, exit = true) {
|
|
123
|
+
console.error(formatError(error, process.stdout.isTTY));
|
|
124
|
+
if (exit) {
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standardized logging interface for spec-gen
|
|
3
|
+
*
|
|
4
|
+
* Provides semantic log levels with specific visual treatments:
|
|
5
|
+
* - DISCOVERY: Finding files, detecting patterns, scanning directories
|
|
6
|
+
* - ANALYSIS: Parsing AST, building graphs, scoring significance
|
|
7
|
+
* - INFERENCE: LLM generating content, making decisions
|
|
8
|
+
* - SUCCESS: Tasks complete successfully
|
|
9
|
+
* - WARNING: Non-fatal issues, skipped files, fallback behavior
|
|
10
|
+
* - ERROR: Fatal errors, missing requirements
|
|
11
|
+
*/
|
|
12
|
+
import { type Ora } from 'ora';
|
|
13
|
+
export type LogLevel = 'discovery' | 'analysis' | 'inference' | 'success' | 'warning' | 'error' | 'debug';
|
|
14
|
+
export interface LoggerOptions {
|
|
15
|
+
quiet: boolean;
|
|
16
|
+
verbose: boolean;
|
|
17
|
+
noColor: boolean;
|
|
18
|
+
timestamps: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Logger class providing semantic log levels and spinner support
|
|
22
|
+
*/
|
|
23
|
+
export declare class Logger {
|
|
24
|
+
private options;
|
|
25
|
+
private activeSpinner;
|
|
26
|
+
constructor(options?: Partial<LoggerOptions>);
|
|
27
|
+
/**
|
|
28
|
+
* Update logger options
|
|
29
|
+
*/
|
|
30
|
+
configure(options: Partial<LoggerOptions>): void;
|
|
31
|
+
/**
|
|
32
|
+
* Get current options
|
|
33
|
+
*/
|
|
34
|
+
getOptions(): LoggerOptions;
|
|
35
|
+
/**
|
|
36
|
+
* Format a message with optional timestamp
|
|
37
|
+
*/
|
|
38
|
+
private formatMessage;
|
|
39
|
+
/**
|
|
40
|
+
* Core log method
|
|
41
|
+
*/
|
|
42
|
+
private log;
|
|
43
|
+
/**
|
|
44
|
+
* DISCOVERY - Finding files, detecting patterns, scanning directories
|
|
45
|
+
* @example logger.discovery("Discovered 847 files across 23 directories")
|
|
46
|
+
*/
|
|
47
|
+
discovery(message: string): void;
|
|
48
|
+
/**
|
|
49
|
+
* ANALYSIS - Parsing AST, building graphs, scoring significance
|
|
50
|
+
* @example logger.analysis("Analyzing dependency graph...")
|
|
51
|
+
*/
|
|
52
|
+
analysis(message: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* INFERENCE - LLM is generating content, making decisions
|
|
55
|
+
* @example logger.inference("Inferring system intent from core modules...")
|
|
56
|
+
*/
|
|
57
|
+
inference(message: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* SUCCESS - Tasks complete successfully
|
|
60
|
+
* @example logger.success("Generated openspec/specs/auth/spec.md")
|
|
61
|
+
*/
|
|
62
|
+
success(message: string): void;
|
|
63
|
+
/**
|
|
64
|
+
* WARNING - Non-fatal issues, skipped files, fallback behavior
|
|
65
|
+
* @example logger.warning("Skipped 12 binary files")
|
|
66
|
+
*/
|
|
67
|
+
warning(message: string): void;
|
|
68
|
+
/**
|
|
69
|
+
* ERROR - Fatal errors, missing requirements
|
|
70
|
+
* @example logger.error("No .git directory found. Is this a repository?")
|
|
71
|
+
*/
|
|
72
|
+
error(message: string): void;
|
|
73
|
+
/**
|
|
74
|
+
* DEBUG - Verbose debug information (only shown with --verbose)
|
|
75
|
+
* @example logger.debug("Processing file: src/utils/helper.ts")
|
|
76
|
+
*/
|
|
77
|
+
debug(message: string): void;
|
|
78
|
+
/**
|
|
79
|
+
* Start a spinner for long-running operations
|
|
80
|
+
* @returns Spinner control object with succeed/fail/stop methods
|
|
81
|
+
*/
|
|
82
|
+
spinner(message: string): SpinnerController;
|
|
83
|
+
/**
|
|
84
|
+
* Register an external spinner so log calls pause/resume it correctly
|
|
85
|
+
*/
|
|
86
|
+
setActiveSpinner(spinner: Ora | null): void;
|
|
87
|
+
/**
|
|
88
|
+
* Clear the active spinner reference
|
|
89
|
+
*/
|
|
90
|
+
clearSpinner(): void;
|
|
91
|
+
/**
|
|
92
|
+
* Print a blank line (respects quiet mode)
|
|
93
|
+
*/
|
|
94
|
+
blank(): void;
|
|
95
|
+
/**
|
|
96
|
+
* Print a section header
|
|
97
|
+
*/
|
|
98
|
+
section(title: string): void;
|
|
99
|
+
/**
|
|
100
|
+
* Print a key-value pair for summaries
|
|
101
|
+
*/
|
|
102
|
+
info(key: string, value: string | number): void;
|
|
103
|
+
/**
|
|
104
|
+
* Print a list item
|
|
105
|
+
*/
|
|
106
|
+
listItem(item: string, indent?: number): void;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Controller for spinner operations
|
|
110
|
+
*/
|
|
111
|
+
export declare class SpinnerController {
|
|
112
|
+
private spinner;
|
|
113
|
+
private logger;
|
|
114
|
+
constructor(spinner: Ora | null, logger: Logger);
|
|
115
|
+
/**
|
|
116
|
+
* Update spinner text
|
|
117
|
+
*/
|
|
118
|
+
update(message: string): void;
|
|
119
|
+
/**
|
|
120
|
+
* Mark spinner as succeeded
|
|
121
|
+
*/
|
|
122
|
+
succeed(message?: string): void;
|
|
123
|
+
/**
|
|
124
|
+
* Mark spinner as failed
|
|
125
|
+
*/
|
|
126
|
+
fail(message?: string): void;
|
|
127
|
+
/**
|
|
128
|
+
* Mark spinner as warning
|
|
129
|
+
*/
|
|
130
|
+
warn(message?: string): void;
|
|
131
|
+
/**
|
|
132
|
+
* Stop spinner without status
|
|
133
|
+
*/
|
|
134
|
+
stop(): void;
|
|
135
|
+
/**
|
|
136
|
+
* Stop spinner and show info
|
|
137
|
+
*/
|
|
138
|
+
info(message?: string): void;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Singleton logger instance for use across the application
|
|
142
|
+
*/
|
|
143
|
+
export declare const logger: Logger;
|
|
144
|
+
/**
|
|
145
|
+
* Configure the global logger instance
|
|
146
|
+
*/
|
|
147
|
+
export declare function configureLogger(options: Partial<LoggerOptions>): void;
|
|
148
|
+
export default logger;
|
|
149
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1G,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAmCD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAoB;gBAE7B,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM;IAIhD;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAIhD;;OAEG;IACH,UAAU,IAAI,aAAa;IAI3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,OAAO,CAAC,GAAG;IA8BX;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIhC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI/B;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIhC;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB;IA6B3C;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;IAI3C;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAY5B;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAU/C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI;CAUjD;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM;IAK/C;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM7B;;OAEG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAS/B;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAS5B;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAS5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;CAM7B;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,QAAe,CAAC;AAEnC;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAErE;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standardized logging interface for spec-gen
|
|
3
|
+
*
|
|
4
|
+
* Provides semantic log levels with specific visual treatments:
|
|
5
|
+
* - DISCOVERY: Finding files, detecting patterns, scanning directories
|
|
6
|
+
* - ANALYSIS: Parsing AST, building graphs, scoring significance
|
|
7
|
+
* - INFERENCE: LLM generating content, making decisions
|
|
8
|
+
* - SUCCESS: Tasks complete successfully
|
|
9
|
+
* - WARNING: Non-fatal issues, skipped files, fallback behavior
|
|
10
|
+
* - ERROR: Fatal errors, missing requirements
|
|
11
|
+
*/
|
|
12
|
+
import chalk from 'chalk';
|
|
13
|
+
import ora from 'ora';
|
|
14
|
+
const defaultOptions = {
|
|
15
|
+
quiet: false,
|
|
16
|
+
verbose: false,
|
|
17
|
+
noColor: false,
|
|
18
|
+
timestamps: false,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Semantic prefixes for each log level
|
|
22
|
+
*/
|
|
23
|
+
const PREFIXES = {
|
|
24
|
+
discovery: '🔍',
|
|
25
|
+
analysis: '🔬',
|
|
26
|
+
inference: '🧠',
|
|
27
|
+
success: '✓',
|
|
28
|
+
warning: '⚠',
|
|
29
|
+
error: '✗',
|
|
30
|
+
debug: '→',
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Color functions for each log level
|
|
34
|
+
*/
|
|
35
|
+
const COLORS = {
|
|
36
|
+
discovery: chalk.cyan,
|
|
37
|
+
analysis: chalk.yellow,
|
|
38
|
+
inference: chalk.magenta,
|
|
39
|
+
success: chalk.green,
|
|
40
|
+
warning: chalk.hex('#FFA500'), // Orange
|
|
41
|
+
error: chalk.red,
|
|
42
|
+
debug: chalk.gray,
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Logger class providing semantic log levels and spinner support
|
|
46
|
+
*/
|
|
47
|
+
export class Logger {
|
|
48
|
+
options;
|
|
49
|
+
activeSpinner = null;
|
|
50
|
+
constructor(options = {}) {
|
|
51
|
+
this.options = { ...defaultOptions, ...options };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Update logger options
|
|
55
|
+
*/
|
|
56
|
+
configure(options) {
|
|
57
|
+
this.options = { ...this.options, ...options };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get current options
|
|
61
|
+
*/
|
|
62
|
+
getOptions() {
|
|
63
|
+
return { ...this.options };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Format a message with optional timestamp
|
|
67
|
+
*/
|
|
68
|
+
formatMessage(level, message) {
|
|
69
|
+
const prefix = PREFIXES[level];
|
|
70
|
+
const colorFn = this.options.noColor ? (s) => s : COLORS[level];
|
|
71
|
+
let formattedMessage = `${prefix} ${message}`;
|
|
72
|
+
if (this.options.timestamps) {
|
|
73
|
+
const timestamp = new Date().toISOString();
|
|
74
|
+
formattedMessage = `[${timestamp}] ${formattedMessage}`;
|
|
75
|
+
}
|
|
76
|
+
return colorFn(formattedMessage);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Core log method
|
|
80
|
+
*/
|
|
81
|
+
log(level, message) {
|
|
82
|
+
// In quiet mode, only show errors
|
|
83
|
+
if (this.options.quiet && level !== 'error') {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Debug messages only show in verbose mode
|
|
87
|
+
if (level === 'debug' && !this.options.verbose) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Pause spinner if active to prevent overlap
|
|
91
|
+
if (this.activeSpinner) {
|
|
92
|
+
this.activeSpinner.stop();
|
|
93
|
+
}
|
|
94
|
+
const formattedMessage = this.formatMessage(level, message);
|
|
95
|
+
if (level === 'error') {
|
|
96
|
+
console.error(formattedMessage);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
console.log(formattedMessage);
|
|
100
|
+
}
|
|
101
|
+
// Resume spinner if it was active
|
|
102
|
+
if (this.activeSpinner) {
|
|
103
|
+
this.activeSpinner.start();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* DISCOVERY - Finding files, detecting patterns, scanning directories
|
|
108
|
+
* @example logger.discovery("Discovered 847 files across 23 directories")
|
|
109
|
+
*/
|
|
110
|
+
discovery(message) {
|
|
111
|
+
this.log('discovery', message);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* ANALYSIS - Parsing AST, building graphs, scoring significance
|
|
115
|
+
* @example logger.analysis("Analyzing dependency graph...")
|
|
116
|
+
*/
|
|
117
|
+
analysis(message) {
|
|
118
|
+
this.log('analysis', message);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* INFERENCE - LLM is generating content, making decisions
|
|
122
|
+
* @example logger.inference("Inferring system intent from core modules...")
|
|
123
|
+
*/
|
|
124
|
+
inference(message) {
|
|
125
|
+
this.log('inference', message);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* SUCCESS - Tasks complete successfully
|
|
129
|
+
* @example logger.success("Generated openspec/specs/auth/spec.md")
|
|
130
|
+
*/
|
|
131
|
+
success(message) {
|
|
132
|
+
this.log('success', message);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* WARNING - Non-fatal issues, skipped files, fallback behavior
|
|
136
|
+
* @example logger.warning("Skipped 12 binary files")
|
|
137
|
+
*/
|
|
138
|
+
warning(message) {
|
|
139
|
+
this.log('warning', message);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* ERROR - Fatal errors, missing requirements
|
|
143
|
+
* @example logger.error("No .git directory found. Is this a repository?")
|
|
144
|
+
*/
|
|
145
|
+
error(message) {
|
|
146
|
+
this.log('error', message);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* DEBUG - Verbose debug information (only shown with --verbose)
|
|
150
|
+
* @example logger.debug("Processing file: src/utils/helper.ts")
|
|
151
|
+
*/
|
|
152
|
+
debug(message) {
|
|
153
|
+
this.log('debug', message);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Start a spinner for long-running operations
|
|
157
|
+
* @returns Spinner control object with succeed/fail/stop methods
|
|
158
|
+
*/
|
|
159
|
+
spinner(message) {
|
|
160
|
+
// Don't show spinners in quiet mode or CI (timestamps mode)
|
|
161
|
+
if (this.options.quiet || this.options.timestamps) {
|
|
162
|
+
// Return a no-op controller
|
|
163
|
+
return new SpinnerController(null, this);
|
|
164
|
+
}
|
|
165
|
+
// Stop any existing spinner
|
|
166
|
+
if (this.activeSpinner) {
|
|
167
|
+
this.activeSpinner.stop();
|
|
168
|
+
}
|
|
169
|
+
const spinner = ora({
|
|
170
|
+
text: message,
|
|
171
|
+
color: 'cyan',
|
|
172
|
+
spinner: 'dots',
|
|
173
|
+
});
|
|
174
|
+
if (!this.options.noColor) {
|
|
175
|
+
spinner.start();
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// In no-color mode, just print the message
|
|
179
|
+
console.log(`... ${message}`);
|
|
180
|
+
}
|
|
181
|
+
this.activeSpinner = spinner;
|
|
182
|
+
return new SpinnerController(spinner, this);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Register an external spinner so log calls pause/resume it correctly
|
|
186
|
+
*/
|
|
187
|
+
setActiveSpinner(spinner) {
|
|
188
|
+
this.activeSpinner = spinner;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Clear the active spinner reference
|
|
192
|
+
*/
|
|
193
|
+
clearSpinner() {
|
|
194
|
+
this.activeSpinner = null;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Print a blank line (respects quiet mode)
|
|
198
|
+
*/
|
|
199
|
+
blank() {
|
|
200
|
+
if (!this.options.quiet) {
|
|
201
|
+
console.log();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Print a section header
|
|
206
|
+
*/
|
|
207
|
+
section(title) {
|
|
208
|
+
if (this.options.quiet)
|
|
209
|
+
return;
|
|
210
|
+
this.blank();
|
|
211
|
+
if (this.options.noColor) {
|
|
212
|
+
console.log(`=== ${title} ===`);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
console.log(chalk.bold.underline(title));
|
|
216
|
+
}
|
|
217
|
+
this.blank();
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Print a key-value pair for summaries
|
|
221
|
+
*/
|
|
222
|
+
info(key, value) {
|
|
223
|
+
if (this.options.quiet)
|
|
224
|
+
return;
|
|
225
|
+
if (this.options.noColor) {
|
|
226
|
+
console.log(` ${key}: ${value}`);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
console.log(` ${chalk.dim(key + ':')} ${value}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Print a list item
|
|
234
|
+
*/
|
|
235
|
+
listItem(item, indent = 0) {
|
|
236
|
+
if (this.options.quiet)
|
|
237
|
+
return;
|
|
238
|
+
const prefix = ' '.repeat(indent) + '•';
|
|
239
|
+
if (this.options.noColor) {
|
|
240
|
+
console.log(`${prefix} ${item}`);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
console.log(`${chalk.dim(prefix)} ${item}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Controller for spinner operations
|
|
249
|
+
*/
|
|
250
|
+
export class SpinnerController {
|
|
251
|
+
spinner;
|
|
252
|
+
logger;
|
|
253
|
+
constructor(spinner, logger) {
|
|
254
|
+
this.spinner = spinner;
|
|
255
|
+
this.logger = logger;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Update spinner text
|
|
259
|
+
*/
|
|
260
|
+
update(message) {
|
|
261
|
+
if (this.spinner) {
|
|
262
|
+
this.spinner.text = message;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Mark spinner as succeeded
|
|
267
|
+
*/
|
|
268
|
+
succeed(message) {
|
|
269
|
+
if (this.spinner) {
|
|
270
|
+
this.spinner.succeed(message);
|
|
271
|
+
}
|
|
272
|
+
else if (message) {
|
|
273
|
+
this.logger.success(message);
|
|
274
|
+
}
|
|
275
|
+
this.logger.clearSpinner();
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Mark spinner as failed
|
|
279
|
+
*/
|
|
280
|
+
fail(message) {
|
|
281
|
+
if (this.spinner) {
|
|
282
|
+
this.spinner.fail(message);
|
|
283
|
+
}
|
|
284
|
+
else if (message) {
|
|
285
|
+
this.logger.error(message);
|
|
286
|
+
}
|
|
287
|
+
this.logger.clearSpinner();
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Mark spinner as warning
|
|
291
|
+
*/
|
|
292
|
+
warn(message) {
|
|
293
|
+
if (this.spinner) {
|
|
294
|
+
this.spinner.warn(message);
|
|
295
|
+
}
|
|
296
|
+
else if (message) {
|
|
297
|
+
this.logger.warning(message);
|
|
298
|
+
}
|
|
299
|
+
this.logger.clearSpinner();
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Stop spinner without status
|
|
303
|
+
*/
|
|
304
|
+
stop() {
|
|
305
|
+
if (this.spinner) {
|
|
306
|
+
this.spinner.stop();
|
|
307
|
+
}
|
|
308
|
+
this.logger.clearSpinner();
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Stop spinner and show info
|
|
312
|
+
*/
|
|
313
|
+
info(message) {
|
|
314
|
+
if (this.spinner) {
|
|
315
|
+
this.spinner.info(message);
|
|
316
|
+
}
|
|
317
|
+
this.logger.clearSpinner();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Singleton logger instance for use across the application
|
|
322
|
+
*/
|
|
323
|
+
export const logger = new Logger();
|
|
324
|
+
/**
|
|
325
|
+
* Configure the global logger instance
|
|
326
|
+
*/
|
|
327
|
+
export function configureLogger(options) {
|
|
328
|
+
logger.configure(options);
|
|
329
|
+
}
|
|
330
|
+
export default logger;
|
|
331
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|