@cisco_open/linting-orchestrator 1.0.0-rc.4
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 +201 -0
- package/NOTICE +5 -0
- package/README.md +43 -0
- package/build/cli/api-client.d.ts +170 -0
- package/build/cli/api-client.d.ts.map +1 -0
- package/build/cli/api-client.js +284 -0
- package/build/cli/api-client.js.map +1 -0
- package/build/cli/commands/agents.d.ts +7 -0
- package/build/cli/commands/agents.d.ts.map +1 -0
- package/build/cli/commands/agents.js +694 -0
- package/build/cli/commands/agents.js.map +1 -0
- package/build/cli/commands/completion.d.ts +9 -0
- package/build/cli/commands/completion.d.ts.map +1 -0
- package/build/cli/commands/completion.js +177 -0
- package/build/cli/commands/completion.js.map +1 -0
- package/build/cli/commands/config.d.ts +10 -0
- package/build/cli/commands/config.d.ts.map +1 -0
- package/build/cli/commands/config.js +284 -0
- package/build/cli/commands/config.js.map +1 -0
- package/build/cli/commands/health.d.ts +11 -0
- package/build/cli/commands/health.d.ts.map +1 -0
- package/build/cli/commands/health.js +38 -0
- package/build/cli/commands/health.js.map +1 -0
- package/build/cli/commands/help.d.ts +6 -0
- package/build/cli/commands/help.d.ts.map +1 -0
- package/build/cli/commands/help.js +20 -0
- package/build/cli/commands/help.js.map +1 -0
- package/build/cli/commands/history.d.ts +11 -0
- package/build/cli/commands/history.d.ts.map +1 -0
- package/build/cli/commands/history.js +50 -0
- package/build/cli/commands/history.js.map +1 -0
- package/build/cli/commands/jobs.d.ts +12 -0
- package/build/cli/commands/jobs.d.ts.map +1 -0
- package/build/cli/commands/jobs.js +84 -0
- package/build/cli/commands/jobs.js.map +1 -0
- package/build/cli/commands/lint.d.ts +15 -0
- package/build/cli/commands/lint.d.ts.map +1 -0
- package/build/cli/commands/lint.js +384 -0
- package/build/cli/commands/lint.js.map +1 -0
- package/build/cli/commands/ps.d.ts +8 -0
- package/build/cli/commands/ps.d.ts.map +1 -0
- package/build/cli/commands/ps.js +74 -0
- package/build/cli/commands/ps.js.map +1 -0
- package/build/cli/commands/reproduce.d.ts +9 -0
- package/build/cli/commands/reproduce.d.ts.map +1 -0
- package/build/cli/commands/reproduce.js +31 -0
- package/build/cli/commands/reproduce.js.map +1 -0
- package/build/cli/commands/reset.d.ts +5 -0
- package/build/cli/commands/reset.d.ts.map +1 -0
- package/build/cli/commands/reset.js +13 -0
- package/build/cli/commands/reset.js.map +1 -0
- package/build/cli/commands/results.d.ts +13 -0
- package/build/cli/commands/results.d.ts.map +1 -0
- package/build/cli/commands/results.js +129 -0
- package/build/cli/commands/results.js.map +1 -0
- package/build/cli/commands/rulesets/check.d.ts +12 -0
- package/build/cli/commands/rulesets/check.d.ts.map +1 -0
- package/build/cli/commands/rulesets/check.js +226 -0
- package/build/cli/commands/rulesets/check.js.map +1 -0
- package/build/cli/commands/rulesets/index.d.ts +5 -0
- package/build/cli/commands/rulesets/index.d.ts.map +1 -0
- package/build/cli/commands/rulesets/index.js +6 -0
- package/build/cli/commands/rulesets/index.js.map +1 -0
- package/build/cli/commands/rulesets/view.d.ts +16 -0
- package/build/cli/commands/rulesets/view.d.ts.map +1 -0
- package/build/cli/commands/rulesets/view.js +100 -0
- package/build/cli/commands/rulesets/view.js.map +1 -0
- package/build/cli/commands/start.d.ts +16 -0
- package/build/cli/commands/start.d.ts.map +1 -0
- package/build/cli/commands/start.js +167 -0
- package/build/cli/commands/start.js.map +1 -0
- package/build/cli/commands/status.d.ts +9 -0
- package/build/cli/commands/status.d.ts.map +1 -0
- package/build/cli/commands/status.js +46 -0
- package/build/cli/commands/status.js.map +1 -0
- package/build/cli/commands/stop.d.ts +11 -0
- package/build/cli/commands/stop.d.ts.map +1 -0
- package/build/cli/commands/stop.js +78 -0
- package/build/cli/commands/stop.js.map +1 -0
- package/build/cli/config-manager.d.ts +134 -0
- package/build/cli/config-manager.d.ts.map +1 -0
- package/build/cli/config-manager.js +288 -0
- package/build/cli/config-manager.js.map +1 -0
- package/build/cli/formatters.d.ts +62 -0
- package/build/cli/formatters.d.ts.map +1 -0
- package/build/cli/formatters.js +715 -0
- package/build/cli/formatters.js.map +1 -0
- package/build/cli/history-manager.d.ts +97 -0
- package/build/cli/history-manager.d.ts.map +1 -0
- package/build/cli/history-manager.js +201 -0
- package/build/cli/history-manager.js.map +1 -0
- package/build/cli/index.d.ts +16 -0
- package/build/cli/index.d.ts.map +1 -0
- package/build/cli/index.js +335 -0
- package/build/cli/index.js.map +1 -0
- package/build/cli/list-rulesets.d.ts +15 -0
- package/build/cli/list-rulesets.d.ts.map +1 -0
- package/build/cli/list-rulesets.js +193 -0
- package/build/cli/list-rulesets.js.map +1 -0
- package/build/cli/utils/connection-error.d.ts +9 -0
- package/build/cli/utils/connection-error.d.ts.map +1 -0
- package/build/cli/utils/connection-error.js +30 -0
- package/build/cli/utils/connection-error.js.map +1 -0
- package/build/cli/utils/embedded-server.d.ts +21 -0
- package/build/cli/utils/embedded-server.d.ts.map +1 -0
- package/build/cli/utils/embedded-server.js +61 -0
- package/build/cli/utils/embedded-server.js.map +1 -0
- package/build/cli/utils/mode-validator.d.ts +13 -0
- package/build/cli/utils/mode-validator.d.ts.map +1 -0
- package/build/cli/utils/mode-validator.js +31 -0
- package/build/cli/utils/mode-validator.js.map +1 -0
- package/build/cli/utils/port-checker.d.ts +20 -0
- package/build/cli/utils/port-checker.d.ts.map +1 -0
- package/build/cli/utils/port-checker.js +49 -0
- package/build/cli/utils/port-checker.js.map +1 -0
- package/build/config.d.ts +57 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +527 -0
- package/build/config.js.map +1 -0
- package/build/document-accessor.d.ts +79 -0
- package/build/document-accessor.d.ts.map +1 -0
- package/build/document-accessor.js +148 -0
- package/build/document-accessor.js.map +1 -0
- package/build/formatters/reproduce-markdown.d.ts +14 -0
- package/build/formatters/reproduce-markdown.d.ts.map +1 -0
- package/build/formatters/reproduce-markdown.js +182 -0
- package/build/formatters/reproduce-markdown.js.map +1 -0
- package/build/formatters/sarif-builder.d.ts +86 -0
- package/build/formatters/sarif-builder.d.ts.map +1 -0
- package/build/formatters/sarif-builder.js +276 -0
- package/build/formatters/sarif-builder.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +174 -0
- package/build/index.js.map +1 -0
- package/build/logger.d.ts +38 -0
- package/build/logger.d.ts.map +1 -0
- package/build/logger.js +105 -0
- package/build/logger.js.map +1 -0
- package/build/mock-server.d.ts +2 -0
- package/build/mock-server.d.ts.map +1 -0
- package/build/mock-server.js +290 -0
- package/build/mock-server.js.map +1 -0
- package/build/orchestrator.d.ts +149 -0
- package/build/orchestrator.d.ts.map +1 -0
- package/build/orchestrator.js +874 -0
- package/build/orchestrator.js.map +1 -0
- package/build/ruleset-loader.d.ts +79 -0
- package/build/ruleset-loader.d.ts.map +1 -0
- package/build/ruleset-loader.js +514 -0
- package/build/ruleset-loader.js.map +1 -0
- package/build/schemas.d.ts +2568 -0
- package/build/schemas.d.ts.map +1 -0
- package/build/schemas.js +674 -0
- package/build/schemas.js.map +1 -0
- package/build/server.d.ts +39 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +834 -0
- package/build/server.js.map +1 -0
- package/build/storage/memory-storage.d.ts +190 -0
- package/build/storage/memory-storage.d.ts.map +1 -0
- package/build/storage/memory-storage.js +629 -0
- package/build/storage/memory-storage.js.map +1 -0
- package/build/storage/redis-storage.d.ts +134 -0
- package/build/storage/redis-storage.d.ts.map +1 -0
- package/build/storage/redis-storage.js +236 -0
- package/build/storage/redis-storage.js.map +1 -0
- package/build/storage/storage-adapter.d.ts +189 -0
- package/build/storage/storage-adapter.d.ts.map +1 -0
- package/build/storage/storage-adapter.js +36 -0
- package/build/storage/storage-adapter.js.map +1 -0
- package/build/types.d.ts +981 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +5 -0
- package/build/types.js.map +1 -0
- package/build/utils/version.d.ts +40 -0
- package/build/utils/version.d.ts.map +1 -0
- package/build/utils/version.js +94 -0
- package/build/utils/version.js.map +1 -0
- package/build/validation.d.ts +95 -0
- package/build/validation.d.ts.map +1 -0
- package/build/validation.js +150 -0
- package/build/validation.js.map +1 -0
- package/build/worker-pool.d.ts +137 -0
- package/build/worker-pool.d.ts.map +1 -0
- package/build/worker-pool.js +549 -0
- package/build/worker-pool.js.map +1 -0
- package/build/worker.d.ts +2 -0
- package/build/worker.d.ts.map +1 -0
- package/build/worker.js +427 -0
- package/build/worker.js.map +1 -0
- package/package.json +110 -0
- package/rulesets/CHANGELOG.md +25 -0
- package/rulesets/config/rulesets.yaml +96 -0
- package/rulesets/sources/README.md +47 -0
- package/rulesets/sources/example/oas-recommended/v1.0.0/ruleset.yaml +6 -0
- package/rulesets/sources/example/oas-recommended/v2.0.0/ruleset.yaml +14 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell Completion Command
|
|
3
|
+
* Generates bash completion script
|
|
4
|
+
*/
|
|
5
|
+
export async function completionCommand(options) {
|
|
6
|
+
// Validate shell option if provided (backward compatibility)
|
|
7
|
+
if (options.shell && options.shell !== 'bash') {
|
|
8
|
+
throw new Error(`Unsupported shell: ${options.shell}. Only bash is supported.`);
|
|
9
|
+
}
|
|
10
|
+
console.log(generateBashCompletion());
|
|
11
|
+
}
|
|
12
|
+
function generateBashCompletion() {
|
|
13
|
+
return `#!/usr/bin/env bash
|
|
14
|
+
# Linting Orchestrator CLI bash completion script
|
|
15
|
+
# Source this file or add to ~/.bashrc:
|
|
16
|
+
# eval "$(spectify completion)"
|
|
17
|
+
|
|
18
|
+
_spectify_completion() {
|
|
19
|
+
local cur prev cmd sub
|
|
20
|
+
COMPREPLY=()
|
|
21
|
+
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
22
|
+
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
23
|
+
cmd="\${COMP_WORDS[1]}"
|
|
24
|
+
sub="\${COMP_WORDS[2]}"
|
|
25
|
+
|
|
26
|
+
# Top-level commands
|
|
27
|
+
local commands="lint status results reproduce jobs history rulesets health config completion help --agents --help --version"
|
|
28
|
+
|
|
29
|
+
case "\${COMP_CWORD}" in
|
|
30
|
+
1)
|
|
31
|
+
COMPREPLY=( \$(compgen -W "\${commands}" -- \${cur}) )
|
|
32
|
+
return 0
|
|
33
|
+
;;
|
|
34
|
+
2)
|
|
35
|
+
case "\${cmd}" in
|
|
36
|
+
lint)
|
|
37
|
+
if [[ \${cur} == -* ]]; then
|
|
38
|
+
COMPREPLY=( \$(compgen -W "-r --ruleset -v --version --override --no-cache --show-all --poll-interval" -- \${cur}) )
|
|
39
|
+
else
|
|
40
|
+
COMPREPLY=( \$(compgen -f -- \${cur}) )
|
|
41
|
+
fi
|
|
42
|
+
return 0
|
|
43
|
+
;;
|
|
44
|
+
status)
|
|
45
|
+
if [[ \${cur} == -* ]]; then
|
|
46
|
+
COMPREPLY=( \$(compgen -W "-w --watch" -- \${cur}) )
|
|
47
|
+
fi
|
|
48
|
+
return 0
|
|
49
|
+
;;
|
|
50
|
+
results)
|
|
51
|
+
if [[ \${cur} == -* ]]; then
|
|
52
|
+
COMPREPLY=( \$(compgen -W "--rule --severity --format --output --json" -- \${cur}) )
|
|
53
|
+
fi
|
|
54
|
+
return 0
|
|
55
|
+
;;
|
|
56
|
+
reproduce)
|
|
57
|
+
if [[ \${cur} == -* ]]; then
|
|
58
|
+
COMPREPLY=( \$(compgen -W "-o --output" -- \${cur}) )
|
|
59
|
+
fi
|
|
60
|
+
return 0
|
|
61
|
+
;;
|
|
62
|
+
jobs)
|
|
63
|
+
if [[ \${cur} == -* ]]; then
|
|
64
|
+
COMPREPLY=( \$(compgen -W "--status --ruleset -l --limit --detailed --json" -- \${cur}) )
|
|
65
|
+
fi
|
|
66
|
+
return 0
|
|
67
|
+
;;
|
|
68
|
+
history)
|
|
69
|
+
if [[ \${cur} == -* ]]; then
|
|
70
|
+
COMPREPLY=( \$(compgen -W "-l --limit -f --file --ruleset --clear" -- \${cur}) )
|
|
71
|
+
fi
|
|
72
|
+
return 0
|
|
73
|
+
;;
|
|
74
|
+
rulesets)
|
|
75
|
+
COMPREPLY=( \$(compgen -W "view check" -- \${cur}) )
|
|
76
|
+
return 0
|
|
77
|
+
;;
|
|
78
|
+
health)
|
|
79
|
+
if [[ \${cur} == -* ]]; then
|
|
80
|
+
COMPREPLY=( \$(compgen -W "--format" -- \${cur}) )
|
|
81
|
+
fi
|
|
82
|
+
return 0
|
|
83
|
+
;;
|
|
84
|
+
config)
|
|
85
|
+
COMPREPLY=( \$(compgen -W "show set reset" -- \${cur}) )
|
|
86
|
+
return 0
|
|
87
|
+
;;
|
|
88
|
+
help)
|
|
89
|
+
COMPREPLY=( \$(compgen -W "lint status results reproduce jobs history rulesets health config completion" -- \${cur}) )
|
|
90
|
+
return 0
|
|
91
|
+
;;
|
|
92
|
+
esac
|
|
93
|
+
;;
|
|
94
|
+
3)
|
|
95
|
+
# Third word: rulesets subcommand options and config set keys
|
|
96
|
+
case "\${cmd}" in
|
|
97
|
+
rulesets)
|
|
98
|
+
case "\${sub}" in
|
|
99
|
+
view)
|
|
100
|
+
if [[ \${cur} == -* ]]; then
|
|
101
|
+
COMPREPLY=( \$(compgen -W "--name --version --format" -- \${cur}) )
|
|
102
|
+
fi
|
|
103
|
+
return 0
|
|
104
|
+
;;
|
|
105
|
+
check)
|
|
106
|
+
if [[ \${cur} == -* ]]; then
|
|
107
|
+
COMPREPLY=( \$(compgen -W "--name --version -r --rulesets-directory --format" -- \${cur}) )
|
|
108
|
+
fi
|
|
109
|
+
return 0
|
|
110
|
+
;;
|
|
111
|
+
esac
|
|
112
|
+
;;
|
|
113
|
+
config)
|
|
114
|
+
case "\${sub}" in
|
|
115
|
+
set)
|
|
116
|
+
COMPREPLY=( \$(compgen -W "mode port.standalone port.companion url" -- \${cur}) )
|
|
117
|
+
return 0
|
|
118
|
+
;;
|
|
119
|
+
esac
|
|
120
|
+
;;
|
|
121
|
+
esac
|
|
122
|
+
;;
|
|
123
|
+
esac
|
|
124
|
+
|
|
125
|
+
# Argument-value completions — triggered regardless of depth
|
|
126
|
+
case "\${prev}" in
|
|
127
|
+
-r|--ruleset)
|
|
128
|
+
# Try to get live ruleset names from the running server; fall back to empty
|
|
129
|
+
local rulesets
|
|
130
|
+
rulesets=\$(spectify rulesets --format json 2>/dev/null | grep -o '"name":"[^"]*"' | cut -d'"' -f4 | tr '\\n' ' ') || true
|
|
131
|
+
COMPREPLY=( \$(compgen -W "\${rulesets}" -- \${cur}) )
|
|
132
|
+
return 0
|
|
133
|
+
;;
|
|
134
|
+
--format)
|
|
135
|
+
# Infer valid values from the active command
|
|
136
|
+
case "\${cmd}" in
|
|
137
|
+
results)
|
|
138
|
+
COMPREPLY=( \$(compgen -W "table json sarif" -- \${cur}) )
|
|
139
|
+
;;
|
|
140
|
+
health|status)
|
|
141
|
+
COMPREPLY=( \$(compgen -W "text json" -- \${cur}) )
|
|
142
|
+
;;
|
|
143
|
+
rulesets)
|
|
144
|
+
case "\${sub}" in
|
|
145
|
+
check) COMPREPLY=( \$(compgen -W "text json" -- \${cur}) ) ;;
|
|
146
|
+
*) COMPREPLY=( \$(compgen -W "table json" -- \${cur}) ) ;;
|
|
147
|
+
esac
|
|
148
|
+
;;
|
|
149
|
+
*)
|
|
150
|
+
COMPREPLY=( \$(compgen -W "table json text sarif" -- \${cur}) )
|
|
151
|
+
;;
|
|
152
|
+
esac
|
|
153
|
+
return 0
|
|
154
|
+
;;
|
|
155
|
+
--severity)
|
|
156
|
+
COMPREPLY=( \$(compgen -W "error warning info hint" -- \${cur}) )
|
|
157
|
+
return 0
|
|
158
|
+
;;
|
|
159
|
+
--status)
|
|
160
|
+
COMPREPLY=( \$(compgen -W "completed completed_with_errors failed running timeout queued" -- \${cur}) )
|
|
161
|
+
return 0
|
|
162
|
+
;;
|
|
163
|
+
mode)
|
|
164
|
+
COMPREPLY=( \$(compgen -W "standalone embedded companion" -- \${cur}) )
|
|
165
|
+
return 0
|
|
166
|
+
;;
|
|
167
|
+
esac
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
complete -F _spectify_completion spectify
|
|
171
|
+
|
|
172
|
+
# Support for common aliases
|
|
173
|
+
# If you use an alias like 'spy', add: complete -F _spectify_completion spy
|
|
174
|
+
complete -F _spectify_completion spy 2>/dev/null || true
|
|
175
|
+
`;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/cli/commands/completion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAA0B;IAC9D,6DAA6D;IAC7D,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,CAAC,KAAK,2BAA2B,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,sBAAsB;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkKV,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config command - Manage orchestrator CLI configuration
|
|
3
|
+
*/
|
|
4
|
+
export interface ConfigOptions {
|
|
5
|
+
action?: 'show' | 'set' | 'reset';
|
|
6
|
+
key?: string;
|
|
7
|
+
value?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function configCommand(options?: ConfigOptions): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B9E"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config command - Manage orchestrator CLI configuration
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import inquirer from 'inquirer';
|
|
6
|
+
import { getConfigManager } from '../config-manager.js';
|
|
7
|
+
import { HistoryManager } from '../history-manager.js';
|
|
8
|
+
export async function configCommand(options = {}) {
|
|
9
|
+
// If no action specified, show interactive menu
|
|
10
|
+
if (!options.action) {
|
|
11
|
+
await showInteractiveConfig();
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
switch (options.action) {
|
|
15
|
+
case 'show':
|
|
16
|
+
await showConfig();
|
|
17
|
+
break;
|
|
18
|
+
case 'set':
|
|
19
|
+
if (!options.key || !options.value) {
|
|
20
|
+
console.error(chalk.red('Error: Both key and value are required for set'));
|
|
21
|
+
console.log(chalk.dim('Usage: spectify config set <key> <value>'));
|
|
22
|
+
console.log(chalk.dim('Keys: mode, port.standalone, port.companion, url'));
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
await setConfig(options.key, options.value);
|
|
26
|
+
break;
|
|
27
|
+
case 'reset':
|
|
28
|
+
await resetConfig();
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
console.error(chalk.red(`Unknown action: ${options.action}`));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function showConfig() {
|
|
36
|
+
const configManager = getConfigManager();
|
|
37
|
+
const config = await configManager.get();
|
|
38
|
+
console.log(chalk.bold('\n📝 Current CLI Configuration\n'));
|
|
39
|
+
console.log(chalk.cyan('Current Mode:'), chalk.bold(config.defaultMode));
|
|
40
|
+
console.log(chalk.cyan('\nConfigured Ports:'));
|
|
41
|
+
console.log(` Standalone: ${chalk.bold(config.ports.standalone)}`);
|
|
42
|
+
console.log(` Embedded: ${chalk.bold(config.ports.embedded)}`);
|
|
43
|
+
console.log(` Companion: ${chalk.bold(config.ports.companion)}`);
|
|
44
|
+
if (process.env.SPECTIFYD_URL) {
|
|
45
|
+
console.log(chalk.cyan('\nURL Override (env):'), chalk.bold(process.env.SPECTIFYD_URL));
|
|
46
|
+
console.log(chalk.dim(' Set via SPECTIFYD_URL — takes precedence over config'));
|
|
47
|
+
}
|
|
48
|
+
else if (config.url) {
|
|
49
|
+
console.log(chalk.cyan('\nURL Override:'), chalk.bold(config.url));
|
|
50
|
+
console.log(chalk.dim(' Overrides localhost:<port> for standalone/companion modes'));
|
|
51
|
+
console.log(chalk.dim(' Clear with: spectify config set url ""'));
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const configManager = getConfigManager();
|
|
55
|
+
const effectiveUrl = await configManager.getApiUrl();
|
|
56
|
+
console.log(chalk.cyan('\nEffective URL:'), chalk.dim(effectiveUrl));
|
|
57
|
+
}
|
|
58
|
+
if (config.lastUsed) {
|
|
59
|
+
console.log(chalk.cyan('\nLast Used Session:'));
|
|
60
|
+
console.log(chalk.dim(` Mode: ${config.lastUsed.mode}`));
|
|
61
|
+
console.log(chalk.dim(` Port: ${config.lastUsed.port}`));
|
|
62
|
+
}
|
|
63
|
+
console.log(chalk.dim(`\nConfig file: ${configManager.getConfigPath()}`));
|
|
64
|
+
console.log(chalk.dim('Use "spectify config set <key> <value>" to change settings'));
|
|
65
|
+
console.log(chalk.dim('Keys: mode, port.standalone, port.companion, url'));
|
|
66
|
+
console.log();
|
|
67
|
+
}
|
|
68
|
+
async function setConfig(key, value) {
|
|
69
|
+
const configManager = getConfigManager();
|
|
70
|
+
try {
|
|
71
|
+
switch (key) {
|
|
72
|
+
case 'mode':
|
|
73
|
+
if (value !== 'standalone' && value !== 'embedded' && value !== 'companion') {
|
|
74
|
+
throw new Error('Mode must be "standalone", "embedded", or "companion"');
|
|
75
|
+
}
|
|
76
|
+
await configManager.setDefaultMode(value);
|
|
77
|
+
console.log(chalk.green(`✅ Current mode set to: ${value}`));
|
|
78
|
+
break;
|
|
79
|
+
case 'port.standalone': {
|
|
80
|
+
const standalonePort = parseInt(value, 10);
|
|
81
|
+
if (isNaN(standalonePort) || standalonePort < 1 || standalonePort > 65535) {
|
|
82
|
+
throw new Error('Port must be a number between 1 and 65535');
|
|
83
|
+
}
|
|
84
|
+
await configManager.setPort('standalone', standalonePort);
|
|
85
|
+
console.log(chalk.green(`✅ Standalone port set to: ${standalonePort}`));
|
|
86
|
+
// Notify history using the effective URL (respects config.url override)
|
|
87
|
+
const historyManager = new HistoryManager();
|
|
88
|
+
await historyManager.onConfigChange(await configManager.getApiUrl('standalone'));
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case 'port.companion': {
|
|
92
|
+
const companionPort = parseInt(value, 10);
|
|
93
|
+
if (isNaN(companionPort) || companionPort < 1 || companionPort > 65535) {
|
|
94
|
+
throw new Error('Port must be a number between 1 and 65535');
|
|
95
|
+
}
|
|
96
|
+
await configManager.setPort('companion', companionPort);
|
|
97
|
+
console.log(chalk.green(`✅ Companion port set to: ${companionPort}`));
|
|
98
|
+
// Notify history using the effective URL (respects config.url override)
|
|
99
|
+
const historyManagerCompanion = new HistoryManager();
|
|
100
|
+
await historyManagerCompanion.onConfigChange(await configManager.getApiUrl('companion'));
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case 'url': {
|
|
104
|
+
const trimmed = value.trim();
|
|
105
|
+
if (trimmed === '') {
|
|
106
|
+
await configManager.setUrl(undefined);
|
|
107
|
+
console.log(chalk.green('✅ URL override cleared — using http://localhost:<port>'));
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
try {
|
|
111
|
+
new URL(trimmed);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
throw new Error('Value must be a valid URL (e.g. http://192.168.1.10:3003)');
|
|
115
|
+
}
|
|
116
|
+
await configManager.setUrl(trimmed);
|
|
117
|
+
console.log(chalk.green(`✅ URL override set to: ${trimmed}`));
|
|
118
|
+
const historyManager = new HistoryManager();
|
|
119
|
+
await historyManager.onConfigChange(trimmed);
|
|
120
|
+
}
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
default:
|
|
124
|
+
throw new Error(`Unknown config key: ${key}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async function resetConfig() {
|
|
133
|
+
const configManager = getConfigManager();
|
|
134
|
+
const { confirm } = await inquirer.prompt([
|
|
135
|
+
{
|
|
136
|
+
type: 'confirm',
|
|
137
|
+
name: 'confirm',
|
|
138
|
+
message: 'Reset configuration to defaults?',
|
|
139
|
+
default: false,
|
|
140
|
+
},
|
|
141
|
+
]);
|
|
142
|
+
if (confirm) {
|
|
143
|
+
await configManager.reset();
|
|
144
|
+
console.log(chalk.green('✅ Configuration reset to defaults'));
|
|
145
|
+
await showConfig();
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
console.log(chalk.dim('Cancelled'));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async function showInteractiveConfig() {
|
|
152
|
+
const configManager = getConfigManager();
|
|
153
|
+
const config = await configManager.get();
|
|
154
|
+
// Show current config
|
|
155
|
+
await showConfig();
|
|
156
|
+
// Interactive menu
|
|
157
|
+
const { action } = await inquirer.prompt([
|
|
158
|
+
{
|
|
159
|
+
type: 'list',
|
|
160
|
+
name: 'action',
|
|
161
|
+
message: 'What would you like to do?',
|
|
162
|
+
choices: [
|
|
163
|
+
{ name: 'Change current mode', value: 'mode' },
|
|
164
|
+
{ name: 'Change standalone port', value: 'port.standalone' },
|
|
165
|
+
{ name: 'Change companion port', value: 'port.companion' },
|
|
166
|
+
{ name: 'Set URL override (remote spectifyd)', value: 'url' },
|
|
167
|
+
{ name: 'Reset to defaults', value: 'reset' },
|
|
168
|
+
{ name: 'Exit', value: 'exit' },
|
|
169
|
+
],
|
|
170
|
+
},
|
|
171
|
+
]);
|
|
172
|
+
if (action === 'exit') {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (action === 'reset') {
|
|
176
|
+
await resetConfig();
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (action === 'mode') {
|
|
180
|
+
const { mode } = await inquirer.prompt([
|
|
181
|
+
{
|
|
182
|
+
type: 'list',
|
|
183
|
+
name: 'mode',
|
|
184
|
+
message: 'Select current mode:',
|
|
185
|
+
choices: [
|
|
186
|
+
{ name: 'Standalone (independent orchestrator server)', value: 'standalone' },
|
|
187
|
+
{ name: 'Embedded (CLI with embedded server)', value: 'embedded' },
|
|
188
|
+
{ name: 'Companion (companion to MCP OpenAPI Analyzer)', value: 'companion' },
|
|
189
|
+
],
|
|
190
|
+
default: config.defaultMode,
|
|
191
|
+
},
|
|
192
|
+
]);
|
|
193
|
+
await configManager.setDefaultMode(mode);
|
|
194
|
+
console.log(chalk.green(`\n✅ Current mode set to: ${mode}\n`));
|
|
195
|
+
}
|
|
196
|
+
else if (action === 'port.standalone') {
|
|
197
|
+
const { port } = await inquirer.prompt([
|
|
198
|
+
{
|
|
199
|
+
type: 'number',
|
|
200
|
+
name: 'port',
|
|
201
|
+
message: 'Enter standalone port:',
|
|
202
|
+
default: config.ports.standalone,
|
|
203
|
+
validate: (input) => {
|
|
204
|
+
const num = parseInt(String(input), 10);
|
|
205
|
+
if (isNaN(num) || num < 1 || num > 65535) {
|
|
206
|
+
return 'Port must be between 1 and 65535';
|
|
207
|
+
}
|
|
208
|
+
return true;
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
]);
|
|
212
|
+
await configManager.setPort('standalone', port);
|
|
213
|
+
console.log(chalk.green(`\n✅ Standalone port set to: ${port}\n`));
|
|
214
|
+
const historyManager = new HistoryManager();
|
|
215
|
+
await historyManager.onConfigChange(await configManager.getApiUrl('standalone'));
|
|
216
|
+
}
|
|
217
|
+
else if (action === 'port.companion') {
|
|
218
|
+
const { port } = await inquirer.prompt([
|
|
219
|
+
{
|
|
220
|
+
type: 'number',
|
|
221
|
+
name: 'port',
|
|
222
|
+
message: 'Enter Companion port:',
|
|
223
|
+
default: config.ports.companion,
|
|
224
|
+
validate: (input) => {
|
|
225
|
+
const num = parseInt(String(input), 10);
|
|
226
|
+
if (isNaN(num) || num < 1 || num > 65535) {
|
|
227
|
+
return 'Port must be between 1 and 65535';
|
|
228
|
+
}
|
|
229
|
+
return true;
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
]);
|
|
233
|
+
await configManager.setPort('companion', port);
|
|
234
|
+
console.log(chalk.green(`\n✅ Companion port set to: ${port}\n`));
|
|
235
|
+
const historyManagerCompanion = new HistoryManager();
|
|
236
|
+
await historyManagerCompanion.onConfigChange(await configManager.getApiUrl('companion'));
|
|
237
|
+
}
|
|
238
|
+
else if (action === 'url') {
|
|
239
|
+
const { urlValue } = await inquirer.prompt([
|
|
240
|
+
{
|
|
241
|
+
type: 'input',
|
|
242
|
+
name: 'urlValue',
|
|
243
|
+
message: 'Enter URL override (empty to clear):',
|
|
244
|
+
default: config.url || '',
|
|
245
|
+
validate: (input) => {
|
|
246
|
+
const trimmed = input.trim();
|
|
247
|
+
if (trimmed === '')
|
|
248
|
+
return true;
|
|
249
|
+
try {
|
|
250
|
+
new URL(trimmed);
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
return 'Must be a valid URL (e.g. http://192.168.1.10:3003)';
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
]);
|
|
259
|
+
const trimmed = urlValue.trim();
|
|
260
|
+
if (trimmed === '') {
|
|
261
|
+
await configManager.setUrl(undefined);
|
|
262
|
+
console.log(chalk.green('\n✅ URL override cleared — using http://localhost:<port>\n'));
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
await configManager.setUrl(trimmed);
|
|
266
|
+
console.log(chalk.green(`\n✅ URL override set to: ${trimmed}\n`));
|
|
267
|
+
const historyManager = new HistoryManager();
|
|
268
|
+
await historyManager.onConfigChange(trimmed);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// Ask if they want to continue
|
|
272
|
+
const { another } = await inquirer.prompt([
|
|
273
|
+
{
|
|
274
|
+
type: 'confirm',
|
|
275
|
+
name: 'another',
|
|
276
|
+
message: 'Make another change?',
|
|
277
|
+
default: false,
|
|
278
|
+
},
|
|
279
|
+
]);
|
|
280
|
+
if (another) {
|
|
281
|
+
await showInteractiveConfig();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health command - Check orchestrator service health
|
|
3
|
+
*/
|
|
4
|
+
import { SpectifyMode } from '../config-manager.js';
|
|
5
|
+
export interface HealthOptions {
|
|
6
|
+
apiUrl?: string;
|
|
7
|
+
format?: 'text' | 'json';
|
|
8
|
+
mode?: SpectifyMode;
|
|
9
|
+
}
|
|
10
|
+
export declare function healthCommand(options: HealthOptions): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAIpD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,YAAY,CAAC;CACrB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BzE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health command - Check orchestrator service health
|
|
3
|
+
*/
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import { SpectifyAPIClient } from '../api-client.js';
|
|
6
|
+
import { formatHealth } from '../formatters.js';
|
|
7
|
+
import { maybeStartEmbeddedServer, getApiUrl } from '../utils/embedded-server.js';
|
|
8
|
+
import { handleCommandError } from '../utils/connection-error.js';
|
|
9
|
+
export async function healthCommand(options) {
|
|
10
|
+
// In embedded mode, spin up the server first (same as lint command)
|
|
11
|
+
const shutdownServer = await maybeStartEmbeddedServer(options.apiUrl);
|
|
12
|
+
try {
|
|
13
|
+
const apiUrl = options.apiUrl || await getApiUrl();
|
|
14
|
+
const client = new SpectifyAPIClient(apiUrl);
|
|
15
|
+
const spinner = ora('Checking health...').start();
|
|
16
|
+
const health = await client.getHealth();
|
|
17
|
+
spinner.stop();
|
|
18
|
+
if (options.format === 'json') {
|
|
19
|
+
console.log(JSON.stringify(health, null, 2));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.log(formatHealth(health));
|
|
23
|
+
}
|
|
24
|
+
// Exit with error if unhealthy
|
|
25
|
+
if (health.status === 'unhealthy') {
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
await handleCommandError(error);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
if (shutdownServer) {
|
|
34
|
+
await shutdownServer();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/cli/commands/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAQlE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,oEAAoE;IACpE,MAAM,cAAc,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,SAAS,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE7C,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACpC,CAAC;QAED,+BAA+B;QAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;YAAS,CAAC;QACT,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,cAAc,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/help.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAkBxE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Help command - Show help for a specific command
|
|
3
|
+
*/
|
|
4
|
+
export function helpCommand(program, commandName) {
|
|
5
|
+
if (!commandName) {
|
|
6
|
+
// No command specified, show root help
|
|
7
|
+
program.help();
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
// Find the command
|
|
11
|
+
const command = program.commands.find(cmd => cmd.name() === commandName);
|
|
12
|
+
if (!command) {
|
|
13
|
+
console.error(`Unknown command: ${commandName}`);
|
|
14
|
+
console.log(`\nRun 'spectify --help' to see available commands.`);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
// Display help for the command
|
|
18
|
+
command.help();
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/cli/commands/help.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,WAAoB;IAChE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,uCAAuC;QACvC,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,mBAAmB;IACnB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,CAAC;IAEzE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+BAA+B;IAC/B,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History command - View lint history
|
|
3
|
+
*/
|
|
4
|
+
export interface HistoryOptions {
|
|
5
|
+
limit?: number;
|
|
6
|
+
file?: string;
|
|
7
|
+
ruleset?: string;
|
|
8
|
+
clear?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function historyCommand(options: HistoryOptions): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/history.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C3E"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History command - View lint history
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { HistoryManager } from '../history-manager.js';
|
|
6
|
+
import { formatHistoryTable } from '../formatters.js';
|
|
7
|
+
export async function historyCommand(options) {
|
|
8
|
+
try {
|
|
9
|
+
const historyManager = new HistoryManager();
|
|
10
|
+
if (options.clear) {
|
|
11
|
+
// Clear history
|
|
12
|
+
await historyManager.clear();
|
|
13
|
+
console.log(chalk.green('✓ History cleared\n'));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
// Get history entries
|
|
17
|
+
let entries;
|
|
18
|
+
if (options.file) {
|
|
19
|
+
entries = await historyManager.searchByFile(options.file);
|
|
20
|
+
if (entries.length === 0) {
|
|
21
|
+
console.log(chalk.yellow(`No history found for file: ${options.file}\n`));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else if (options.ruleset) {
|
|
26
|
+
entries = await historyManager.searchByRuleset(options.ruleset);
|
|
27
|
+
if (entries.length === 0) {
|
|
28
|
+
console.log(chalk.yellow(`No history found for ruleset: ${options.ruleset}\n`));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const limit = options.limit || 10;
|
|
34
|
+
entries = await historyManager.getRecent(limit);
|
|
35
|
+
}
|
|
36
|
+
if (entries.length === 0) {
|
|
37
|
+
console.log(chalk.dim('No history entries found.\n'));
|
|
38
|
+
console.log(chalk.dim('Run `spectify lint <file>` to analyze an OpenAPI document.\n'));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
console.log(chalk.bold('\nLint History\n'));
|
|
42
|
+
console.log(formatHistoryTable(entries));
|
|
43
|
+
console.log(chalk.dim(`Use 'spectify results <jobId>' to view detailed results\n`));
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=history.js.map
|